MegaBites-AI/Windows-powershell
0372
1// Copyright (c) Microsoft Corporation.2// Licensed under the MIT License.3 4#if !UNIX5 6using System.Globalization;7using System.Management.Automation.Runspaces;8using System.Text;9using System.Diagnostics.Eventing;10using System.Management.Automation.Internal;11 12namespace System.Management.Automation.Tracing13{14 // pragma warning disable 16001,1600315 #region Constants16 17 /// <summary>18 /// Defines enumerations for event ids.19 /// </summary>20 /// <remarks>add an entry for a new event that you21 /// add to the manifest. Set it to the same value22 /// that was set in the manifest</remarks>23 public enum PowerShellTraceEvent : int24 {25 /// <summary>26 /// None. (Should not be used)27 /// </summary>28 None = 0,29 30 /// <summary>31 /// HostNameResolve.32 /// </summary>33 HostNameResolve = 0x1001,34 35 /// <summary>36 /// SchemeResolve.37 /// </summary>38 SchemeResolve = 0x1002,39 40 /// <summary>41 /// ShellResolve.42 /// </summary>43 ShellResolve = 0x1003,44 45 /// <summary>46 /// RunspaceConstructor.47 /// </summary>48 RunspaceConstructor = 0x2001,49 50 /// <summary>51 /// RunspacePoolConstructor.52 /// </summary>53 RunspacePoolConstructor = 0x2002,54 55 /// <summary>56 /// RunspacePoolOpen.57 /// </summary>58 RunspacePoolOpen = 0x2003,59 60 /// <summary>61 /// OperationalTransferEventRunspacePool.62 /// </summary>63 OperationalTransferEventRunspacePool = 0x2004,64 65 /// <summary>66 /// RunspacePort.67 /// </summary>68 RunspacePort = 0x2F01,69 70 /// <summary>71 /// AppName.72 /// </summary>73 AppName = 0x2F02,74 75 /// <summary>76 /// ComputerName.77 /// </summary>78 ComputerName = 0x2F03,79 80 /// <summary>81 /// Scheme.82 /// </summary>83 Scheme = 0x2F04,84 85 /// <summary>86 /// TestAnalytic.87 /// </summary>88 TestAnalytic = 0x2F05,89 90 /// <summary>91 /// WSManConnectionInfoDump.92 /// </summary>93 WSManConnectionInfoDump = 0x2F06,94 95 /// <summary>96 /// AnalyticTransferEventRunspacePool.97 /// </summary>98 AnalyticTransferEventRunspacePool = 0x2F07,99 100 // Start: Transport related events101 102 /// <summary>103 /// TransportReceivedObject.104 /// </summary>105 TransportReceivedObject = 0x8001,106 107 /// <summary>108 /// AppDomainUnhandledExceptionAnalytic.109 /// </summary>110 AppDomainUnhandledExceptionAnalytic = 0x8007,111 112 /// <summary>113 /// TransportErrorAnalytic.114 /// </summary>115 TransportErrorAnalytic = 0x8008,116 117 /// <summary>118 /// AppDomainUnhandledException.119 /// </summary>120 AppDomainUnhandledException = 0x8009,121 122 /// <summary>123 /// TransportError.124 /// </summary>125 TransportError = 0x8010,126 127 /// <summary>128 /// WSManCreateShell.129 /// </summary>130 WSManCreateShell = 0x8011,131 132 /// <summary>133 /// WSManCreateShellCallbackReceived.134 /// </summary>135 WSManCreateShellCallbackReceived = 0x8012,136 137 /// <summary>138 /// WSManCloseShell.139 /// </summary>140 WSManCloseShell = 0x8013,141 142 /// <summary>143 /// WSManCloseShellCallbackReceived.144 /// </summary>145 WSManCloseShellCallbackReceived = 0x8014,146 147 /// <summary>148 /// WSManSendShellInputExtended.149 /// </summary>150 WSManSendShellInputExtended = 0x8015,151 152 /// <summary>153 /// WSManSendShellInputExCallbackReceived.154 /// </summary>155 WSManSendShellInputExtendedCallbackReceived = 0x8016,156 157 /// <summary>158 /// WSManReceiveShellOutputExtended.159 /// </summary>160 WSManReceiveShellOutputExtended = 0x8017,161 162 /// <summary>163 /// WSManReceiveShellOutputExCallbackReceived.164 /// </summary>165 WSManReceiveShellOutputExtendedCallbackReceived = 0x8018,166 167 /// <summary>168 /// WSManCreateCommand.169 /// </summary>170 WSManCreateCommand = 0x8019,171 172 /// <summary>173 /// WSManCreateCommandCallbackReceived.174 /// </summary>175 WSManCreateCommandCallbackReceived = 0x8020,176 177 /// <summary>178 /// WSManCloseCommand.179 /// </summary>180 WSManCloseCommand = 0x8021,181 182 /// <summary>183 /// WSManCloseCommandCallbackReceived.184 /// </summary>185 WSManCloseCommandCallbackReceived = 0x8022,186 187 /// <summary>188 /// WSManSignal.189 /// </summary>190 WSManSignal = 0x8023,191 192 /// <summary>193 /// WSManSignalCallbackReceived.194 /// </summary>195 WSManSignalCallbackReceived = 0x8024,196 197 /// <summary>198 /// UriRedirection.199 /// </summary>200 UriRedirection = 0x8025,201 202 /// <summary>203 /// ServerSendData.204 /// </summary>205 ServerSendData = 0x8051,206 207 /// <summary>208 /// ServerCreateRemoteSession.209 /// </summary>210 ServerCreateRemoteSession = 0x8052,211 212 /// <summary>213 /// ReportContext.214 /// </summary>215 ReportContext = 0x8053,216 217 /// <summary>218 /// ReportOperationComplete.219 /// </summary>220 ReportOperationComplete = 0x8054,221 222 /// <summary>223 /// ServerCreateCommandSession.224 /// </summary>225 ServerCreateCommandSession = 0x8055,226 227 /// <summary>228 /// ServerStopCommand.229 /// </summary>230 ServerStopCommand = 0x8056,231 232 /// <summary>233 /// ServerReceivedData.234 /// </summary>235 ServerReceivedData = 0x8057,236 237 /// <summary>238 /// ServerClientReceiveRequest.239 /// </summary>240 ServerClientReceiveRequest = 0x8058,241 242 /// <summary>243 /// ServerCloseOperation.244 /// </summary>245 ServerCloseOperation = 0x8059,246 247 /// <summary>248 /// LoadingPSCustomShellAssembly.249 /// </summary>250 LoadingPSCustomShellAssembly = 0x8061,251 252 /// <summary>253 /// LoadingPSCustomShellType.254 /// </summary>255 LoadingPSCustomShellType = 0x8062,256 257 /// <summary>258 /// ReceivedRemotingFragment.259 /// </summary>260 ReceivedRemotingFragment = 0x8063,261 262 /// <summary>263 /// SentRemotingFragment.264 /// </summary>265 SentRemotingFragment = 0x8064,266 267 /// <summary>268 /// WSManPluginShutdown.269 /// </summary>270 WSManPluginShutdown = 0x8065,271 // End: Transport related events272 273 // Start: Serialization related events274 275 /// <summary>276 /// SerializerWorkflowLoadSuccess.277 /// </summary>278 SerializerWorkflowLoadSuccess = 0x7001,279 280 /// <summary>281 /// SerializerWorkflowLoadFailure.282 /// </summary>283 SerializerWorkflowLoadFailure = 0x7002,284 285 /// <summary>286 /// SerializerDepthOverride.287 /// </summary>288 SerializerDepthOverride = 0x7003,289 290 /// <summary>291 /// SerializerModeOverride.292 /// </summary>293 SerializerModeOverride = 0x7004,294 295 /// <summary>296 /// SerializerScriptPropertyWithoutRunspace.297 /// </summary>298 SerializerScriptPropertyWithoutRunspace = 0x7005,299 300 /// <summary>301 /// SerializerPropertyGetterFailed.302 /// </summary>303 SerializerPropertyGetterFailed = 0x7006,304 305 /// <summary>306 /// SerializerEnumerationFailed.307 /// </summary>308 SerializerEnumerationFailed = 0x7007,309 310 /// <summary>311 /// SerializerToStringFailed.312 /// </summary>313 SerializerToStringFailed = 0x7008,314 315 /// <summary>316 /// SerializerMaxDepthWhenSerializing.317 /// </summary>318 SerializerMaxDepthWhenSerializing = 0x700A,319 320 /// <summary>321 /// SerializerXmlExceptionWhenDeserializing.322 /// </summary>323 SerializerXmlExceptionWhenDeserializing = 0x700B,324 325 /// <summary>326 /// SerializerSpecificPropertyMissing.327 /// </summary>328 SerializerSpecificPropertyMissing = 0x700C,329 // End: Serialization related events330 331 // Start: PerformanceTrack related events332 /// <summary>333 /// PerformanceTrackConsoleStartupStart.334 /// </summary>335 PerformanceTrackConsoleStartupStart = 0xA001,336 337 /// <summary>338 /// PerformanceTrackConsoleStartupStop.339 /// </summary>340 PerformanceTrackConsoleStartupStop = 0xA002,341 // End: Preftrack related events342 343 /// <summary>344 /// ErrorRecord.345 /// </summary>346 ErrorRecord = 0xB001,347 348 /// <summary>349 /// Exception.350 /// </summary>351 Exception = 0xB002,352 353 /// <summary>354 /// PowerShellObject.355 /// </summary>356 PowerShellObject = 0xB003,357 358 /// <summary>359 /// Job.360 /// </summary>361 Job = 0xB004,362 363 /// <summary>364 /// Writing a simple trace message from code.365 /// </summary>366 TraceMessage = 0xB005,367 368 /// <summary>369 /// Trace the WSManConnectionInfo used for this connection.370 /// </summary>371 TraceWSManConnectionInfo = 0xB006,372 373 /// <summary>374 /// Writing a simple trace message from code with 2375 /// strings.376 /// </summary>377 TraceMessage2 = 0xC001,378 379 /// <summary>380 /// Writing a simple trace message from code with 2381 /// strings.382 /// </summary>383 TraceMessageGuid = 0xC002,384 }385 386 /// <summary>387 /// Defines enumerations for channels.388 /// </summary>389 // pragma warning disable 16001390 public enum PowerShellTraceChannel391 {392 /// <summary>393 /// None (No channel selected, should not be used)394 /// </summary>395 None = 0,396 /// <summary>397 /// Operational Channel.398 /// </summary>399 Operational = 0x10,400 401 /// <summary>402 /// Analytic Channel.403 /// </summary>404 Analytic = 0x11,405 406 /// <summary>407 /// Debug Channel.408 /// </summary>409 Debug = 0x12,410 }411 // pragma warning restore 16001412 413 /// <summary>414 /// Define enumerations for levels.415 /// </summary>416 public enum PowerShellTraceLevel417 {418 /// <summary>419 /// LogAlways.420 /// </summary>421 LogAlways = 0,422 423 /// <summary>424 /// Critical.425 /// </summary>426 Critical = 1,427 428 /// <summary>429 /// Error.430 /// </summary>431 Error = 2,432 433 /// <summary>434 /// Warning.435 /// </summary>436 Warning = 3,437 438 /// <summary>439 /// Informational.440 /// </summary>441 Informational = 4,442 443 /// <summary>444 /// Verbose.445 /// </summary>446 Verbose = 5,447 448 /// <summary>449 /// Debug.450 /// </summary>451 Debug = 20,452 }453 454 /// <summary>455 /// Defines enumerations for op codes.456 /// </summary>457 public enum PowerShellTraceOperationCode458 {459 /// <summary>460 /// None. (Should not be used)461 /// </summary>462 None = 0,463 464 /// <summary>465 /// Open.466 /// </summary>467 Open = 10,468 469 /// <summary>470 /// Close.471 /// </summary>472 Close = 11,473 474 /// <summary>475 /// Connect.476 /// </summary>477 Connect = 12,478 479 /// <summary>480 /// Disconnect.481 /// </summary>482 Disconnect = 13,483 484 /// <summary>485 /// Negotiate.486 /// </summary>487 Negotiate = 14,488 489 /// <summary>490 /// Create.491 /// </summary>492 Create = 15,493 494 /// <summary>495 /// Constructor.496 /// </summary>497 Constructor = 16,498 499 /// <summary>500 /// Dispose.501 /// </summary>502 Dispose = 17,503 504 /// <summary>505 /// EventHandler.506 /// </summary>507 EventHandler = 18,508 509 /// <summary>510 /// Exception.511 /// </summary>512 Exception = 19,513 514 /// <summary>515 /// Method.516 /// </summary>517 Method = 20,518 519 /// <summary>520 /// Send.521 /// </summary>522 Send = 21,523 524 /// <summary>525 /// Receive.526 /// </summary>527 Receive = 22,528 529 /// <summary>530 /// WorkflowLoad.531 /// </summary>532 WorkflowLoad = 23,533 534 /// <summary>535 /// SerializationSettings.536 /// </summary>537 SerializationSettings = 24,538 539 /// <summary>540 /// WinInfo.541 /// </summary>542 WinInfo,543 544 /// <summary>545 /// WinStart.546 /// </summary>547 WinStart,548 549 /// <summary>550 /// WinStop.551 /// </summary>552 WinStop,553 554 /// <summary>555 /// WinDCStart.556 /// </summary>557 WinDCStart,558 559 /// <summary>560 /// WinDCStop.561 /// </summary>562 WinDCStop,563 564 /// <summary>565 /// WinExtension.566 /// </summary>567 WinExtension,568 569 /// <summary>570 /// WinReply.571 /// </summary>572 WinReply,573 574 /// <summary>575 /// WinResume.576 /// </summary>577 WinResume,578 579 /// <summary>580 /// WinSuspend.581 /// </summary>582 WinSuspend,583 }584 585 /// <summary>586 /// Defines Tasks.587 /// </summary>588 public enum PowerShellTraceTask589 {590 /// <summary>591 /// None.592 /// </summary>593 None = 0,594 595 /// <summary>596 /// CreateRunspace.597 /// </summary>598 CreateRunspace = 1,599 600 /// <summary>601 /// ExecuteCommand.602 /// </summary>603 ExecuteCommand = 2,604 605 /// <summary>606 /// Serialization.607 /// </summary>608 Serialization = 3,609 610 /// <summary>611 /// PowerShellConsoleStartup.612 /// </summary>613 PowerShellConsoleStartup = 4,614 }615 616 /// <summary>617 /// Defines Keywords.618 /// </summary>619 [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1028")]620 [Flags]621 public enum PowerShellTraceKeywords : ulong622 {623 /// <summary>624 /// None.625 /// </summary>626 None = 0,627 628 /// <summary>629 /// Runspace.630 /// </summary>631 Runspace = 0x1,632 633 /// <summary>634 /// Pipeline.635 /// </summary>636 Pipeline = 0x2,637 638 /// <summary>639 /// Protocol.640 /// </summary>641 Protocol = 0x4,642 643 /// <summary>644 /// Transport.645 /// </summary>646 Transport = 0x8,647 648 /// <summary>649 /// Host.650 /// </summary>651 Host = 0x10,652 653 /// <summary>654 /// Cmdlets.655 /// </summary>656 Cmdlets = 0x20,657 658 /// <summary>659 /// Serializer.660 /// </summary>661 Serializer = 0x40,662 663 /// <summary>664 /// Session.665 /// </summary>666 Session = 0x80,667 668 /// <summary>669 /// ManagedPlugIn.670 /// </summary>671 ManagedPlugIn = 0x100,672 673 /// <summary>674 /// </summary>675 UseAlwaysDebug = 0x2000000000000000,676 677 /// <summary>678 /// </summary>679 UseAlwaysOperational = 0x8000000000000000,680 681 /// <summary>682 /// </summary>683 UseAlwaysAnalytic = 0x4000000000000000,684 }685 686 #endregion687 688 /// <summary>689 /// BaseChannelWriter is the abstract base class defines event specific methods that are used to write a trace.690 /// The default implementation does not write any message to any trace channel.691 /// </summary>692 public abstract class BaseChannelWriter : IDisposable693 {694 private bool disposed;695 696 /// <summary>697 /// Dispose method.698 /// </summary>699 public virtual void Dispose()700 {701 if (!disposed)702 {703 GC.SuppressFinalize(this);704 disposed = true;705 }706 }707 708 /// <summary>709 /// TraceError.710 /// </summary>711 public virtual bool TraceError(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)712 {713 return true;714 }715 716 /// <summary>717 /// TraceWarning.718 /// </summary>719 public virtual bool TraceWarning(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)720 {721 return true;722 }723 724 /// <summary>725 /// TraceInformational.726 /// </summary>727 public virtual bool TraceInformational(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)728 {729 return true;730 }731 732 /// <summary>733 /// TraceVerbose.734 /// </summary>735 public virtual bool TraceVerbose(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)736 {737 return true;738 }739 740 /// <summary>741 /// TraceDebug.742 /// </summary>743 public virtual bool TraceDebug(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)744 {745 return true;746 }747 748 /// <summary>749 /// TraceLogAlways.750 /// </summary>751 public virtual bool TraceLogAlways(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)752 {753 return true;754 }755 756 /// <summary>757 /// TraceCritical.758 /// </summary>759 public virtual bool TraceCritical(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)760 {761 return true;762 }763 764 /// <summary>765 /// </summary>766 public virtual PowerShellTraceKeywords Keywords767 {768 get769 {770 return PowerShellTraceKeywords.None;771 }772 773 set774 {775 PowerShellTraceKeywords powerShellTraceKeywords = value;776 }777 }778 }779 780 /// <summary>781 /// NullWriter is the implementation of BaseChannelWriter.782 /// This implementation does not write to any trace logs.783 /// This class is singleton and exposes its only instance784 /// through the static Instance property.785 /// </summary>786 public sealed class NullWriter : BaseChannelWriter787 {788 /// <summary>789 /// Static Instance property.790 /// </summary>791 public static BaseChannelWriter Instance { get; } = new NullWriter();792 793 private NullWriter()794 {795 }796 }797 798 /// <summary>799 /// ChannelWrite is the concrete implementation of IChannelWrite. It writes all the traces to the specified traceChannel.800 /// TraceChannel is specified in the constructor.801 /// It always uses PowerShell event provider Id.802 /// </summary>803 public sealed class PowerShellChannelWriter : BaseChannelWriter804 {805 private readonly PowerShellTraceChannel _traceChannel;806 807 /*808 * Making the provider static to reduce the number of buffers needed to 1.809 * */810 private static readonly EventProvider _provider = new EventProvider(PSEtwLogProvider.ProviderGuid);811 812 private bool disposed;813 private PowerShellTraceKeywords _keywords;814 815 /// <summary>816 /// </summary>817 public override PowerShellTraceKeywords Keywords818 {819 get820 {821 return _keywords;822 }823 824 set825 {826 _keywords = value;827 }828 }829 830 internal PowerShellChannelWriter(PowerShellTraceChannel traceChannel, PowerShellTraceKeywords keywords)831 {832 _traceChannel = traceChannel;833 _keywords = keywords;834 }835 836 /// <summary>837 /// Dispose method.838 /// </summary>839 public override void Dispose()840 {841 if (!disposed)842 {843 GC.SuppressFinalize(this);844 disposed = true;845 }846 }847 848 private bool Trace(PowerShellTraceEvent traceEvent, PowerShellTraceLevel level, PowerShellTraceOperationCode operationCode,849 PowerShellTraceTask task, params object[] args)850 {851 EventDescriptor ed = new EventDescriptor((int)traceEvent, 1, (byte)_traceChannel, (byte)level,852 (byte)operationCode, (int)task, (long)_keywords);853 854 /*855 * Not using locks because the _provider is thread safe itself.856 **/857 858 if (args != null)859 {860 for (int i = 0; i < args.Length; i++)861 {862 if (args[i] == null)863 {864 args[i] = string.Empty;865 }866 }867 }868 869 return _provider.WriteEvent(in ed, args);870 }871 872 /// <summary>873 /// TraceError.874 /// </summary>875 public override bool TraceError(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)876 {877 return Trace(traceEvent, PowerShellTraceLevel.Error, operationCode, task, args);878 }879 880 /// <summary>881 /// TraceWarning.882 /// </summary>883 public override bool TraceWarning(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)884 {885 return Trace(traceEvent, PowerShellTraceLevel.Warning, operationCode, task, args);886 }887 888 /// <summary>889 /// TraceInformational.890 /// </summary>891 public override bool TraceInformational(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)892 {893 return Trace(traceEvent, PowerShellTraceLevel.Informational, operationCode, task, args);894 }895 896 /// <summary>897 /// TraceVerbose.898 /// </summary>899 public override bool TraceVerbose(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)900 {901 return Trace(traceEvent, PowerShellTraceLevel.Verbose, operationCode, task, args);902 }903 904 /// <summary>905 /// TraceDebug.906 /// </summary>907 public override bool TraceDebug(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)908 {909 // TODO: There is some error thrown by the custom debug level910 // hence Informational is being used911 return Trace(traceEvent, PowerShellTraceLevel.Informational, operationCode, task, args);912 }913 914 /// <summary>915 /// TraceLogAlways.916 /// </summary>917 public override bool TraceLogAlways(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)918 {919 return Trace(traceEvent, PowerShellTraceLevel.LogAlways, operationCode, task, args);920 }921 922 /// <summary>923 /// TraceCritical.924 /// </summary>925 public override bool TraceCritical(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args)926 {927 return Trace(traceEvent, PowerShellTraceLevel.Critical, operationCode, task, args);928 }929 }930 931 /// <summary>932 /// TraceSource class gives access to the actual TraceWriter channels.933 /// Three channels are pre-defined 1) Debug 2) Analytic and 3) Operations934 /// This class also has strongly types methods that are used for easy tracing.935 /// </summary>936 public sealed class PowerShellTraceSource : IDisposable937 {938 private bool disposed;939 940 /// <summary>941 /// Constructor.942 /// </summary>943 internal PowerShellTraceSource(PowerShellTraceTask task, PowerShellTraceKeywords keywords)944 {945 if (IsEtwSupported)946 {947 DebugChannel = new PowerShellChannelWriter(PowerShellTraceChannel.Debug,948 keywords | PowerShellTraceKeywords.UseAlwaysDebug);949 AnalyticChannel = new PowerShellChannelWriter(PowerShellTraceChannel.Analytic,950 keywords | PowerShellTraceKeywords.UseAlwaysAnalytic);951 OperationalChannel = new PowerShellChannelWriter(PowerShellTraceChannel.Operational,952 keywords | PowerShellTraceKeywords.UseAlwaysOperational);953 954 this.Task = task;955 this.Keywords = keywords;956 }957 else958 {959 DebugChannel = NullWriter.Instance;960 AnalyticChannel = NullWriter.Instance;961 OperationalChannel = NullWriter.Instance;962 }963 }964 965 /// <summary>966 /// Dispose method.967 /// </summary>968 public void Dispose()969 {970 if (!disposed)971 {972 disposed = true;973 GC.SuppressFinalize(this);974 975 DebugChannel.Dispose();976 AnalyticChannel.Dispose();977 OperationalChannel.Dispose();978 }979 }980 981 /// <summary>982 /// Keywords that were set through constructor when object was instantiated.983 /// </summary>984 public PowerShellTraceKeywords Keywords { get; } = PowerShellTraceKeywords.None;985 986 /// <summary>987 /// Task that was set through constructor.988 /// </summary>989 public PowerShellTraceTask Task { get; set; } = PowerShellTraceTask.None;990 991 private static bool IsEtwSupported992 {993 get994 {995 return Environment.OSVersion.Version.Major >= 6;996 }997 }998 999 /// <summary>1000 /// TraceErrorRecord.1001 /// </summary>1002 public bool TraceErrorRecord(ErrorRecord errorRecord)1003 {1004 if (errorRecord != null)1005 {1006 Exception exception = errorRecord.Exception;1007 string innerException = "None";1008 if (exception.InnerException != null)1009 {1010 innerException = exception.InnerException.Message;1011 }1012 1013 ErrorCategoryInfo cinfo = errorRecord.CategoryInfo;1014 string message = "None";1015 1016 if (errorRecord.ErrorDetails != null)1017 {1018 message = errorRecord.ErrorDetails.Message;1019 }1020 1021 return DebugChannel.TraceError(PowerShellTraceEvent.ErrorRecord,1022 PowerShellTraceOperationCode.Exception, PowerShellTraceTask.None,1023 message,1024 cinfo.Category.ToString(), cinfo.Reason, cinfo.TargetName,1025 errorRecord.FullyQualifiedErrorId,1026 exception.Message, exception.StackTrace, innerException);1027 }1028 else1029 {1030 return DebugChannel.TraceError(PowerShellTraceEvent.ErrorRecord,1031 PowerShellTraceOperationCode.Exception, PowerShellTraceTask.None,1032 "NULL errorRecord");1033 }1034 }1035 1036 /// <summary>1037 /// TraceException.1038 /// </summary>1039 public bool TraceException(Exception exception)1040 {1041 if (exception != null)1042 {1043 string innerException = "None";1044 if (exception.InnerException != null)1045 {1046 innerException = exception.InnerException.Message;1047 }1048 1049 return DebugChannel.TraceError(PowerShellTraceEvent.Exception,1050 PowerShellTraceOperationCode.Exception, PowerShellTraceTask.None,1051 exception.Message, exception.StackTrace, innerException);1052 }1053 else1054 {1055 return DebugChannel.TraceError(PowerShellTraceEvent.Exception,1056 PowerShellTraceOperationCode.Exception, PowerShellTraceTask.None,1057 "NULL exception");1058 }1059 }1060 1061 /// <summary>1062 /// TracePowerShellObject.1063 /// </summary>1064 public bool TracePowerShellObject(PSObject powerShellObject)1065 {1066 return this.DebugChannel.TraceDebug(PowerShellTraceEvent.PowerShellObject,1067 PowerShellTraceOperationCode.Method, PowerShellTraceTask.None);1068 }1069 1070 /// <summary>1071 /// TraceJob.1072 /// </summary>1073 public bool TraceJob(Job job)1074 {1075 if (job != null)1076 {1077 return DebugChannel.TraceDebug(PowerShellTraceEvent.Job,1078 PowerShellTraceOperationCode.Method, PowerShellTraceTask.None,1079 job.Id.ToString(CultureInfo.InvariantCulture), job.InstanceId.ToString(), job.Name,1080 job.Location, job.JobStateInfo.State.ToString(),1081 job.Command);1082 }1083 else1084 {1085 return DebugChannel.TraceDebug(PowerShellTraceEvent.Job,1086 PowerShellTraceOperationCode.Method, PowerShellTraceTask.None,1087 string.Empty, string.Empty, "NULL job");1088 }1089 }1090 1091 /// <summary>1092 /// </summary>1093 /// <param name="message"></param>1094 /// <returns></returns>1095 public bool WriteMessage(string message)1096 {1097 return DebugChannel.TraceInformational(PowerShellTraceEvent.TraceMessage,1098 PowerShellTraceOperationCode.None,1099 PowerShellTraceTask.None, message);1100 }1101 1102 /// <summary>1103 /// </summary>1104 /// <param name="message1"></param>1105 /// <param name="message2"></param>1106 /// <returns></returns>1107 public bool WriteMessage(string message1, string message2)1108 {1109 return DebugChannel.TraceInformational(PowerShellTraceEvent.TraceMessage2,1110 PowerShellTraceOperationCode.None,1111 PowerShellTraceTask.None, message1, message2);1112 }1113 1114 /// <summary>1115 /// </summary>1116 /// <param name="message"></param>1117 /// <param name="instanceId"></param>1118 /// <returns></returns>1119 public bool WriteMessage(string message, Guid instanceId)1120 {1121 return DebugChannel.TraceInformational(PowerShellTraceEvent.TraceMessageGuid,1122 PowerShellTraceOperationCode.None,1123 PowerShellTraceTask.None, message, instanceId);1124 }1125 1126 /// <summary>1127 /// </summary>1128 /// <param name="className"></param>1129 /// <param name="methodName"></param>1130 /// <param name="workflowId"></param>1131 /// <param name="message"></param>1132 /// <param name="parameters"></param>1133 /// <returns></returns>1134 public void WriteMessage(string className, string methodName, Guid workflowId, string message, params string[] parameters)1135 {1136 PSEtwLog.LogAnalyticVerbose(PSEventId.Engine_Trace,1137 PSOpcode.Method, PSTask.None,1138 PSKeyword.UseAlwaysAnalytic,1139 className, methodName, workflowId.ToString(),1140 parameters == null ? message : StringUtil.Format(message, parameters),1141 string.Empty, // Job1142 string.Empty, // Activity name1143 string.Empty, // Activity GUID1144 string.Empty);1145 }1146 1147 /// <summary>1148 /// </summary>1149 /// <param name="className"></param>1150 /// <param name="methodName"></param>1151 /// <param name="workflowId"></param>1152 /// <param name="job"></param>1153 /// <param name="message"></param>1154 /// <param name="parameters"></param>1155 /// <returns></returns>1156 public void WriteMessage(string className, string methodName, Guid workflowId, Job job, string message, params string[] parameters)1157 {1158 StringBuilder sb = new StringBuilder();1159 1160 if (job != null)1161 {1162 try1163 {1164 sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobName, job.Name));1165 sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobId, job.Id.ToString(CultureInfo.InvariantCulture)));1166 sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobInstanceId, job.InstanceId.ToString()));1167 sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobLocation, job.Location));1168 sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobState, job.JobStateInfo.State.ToString()));1169 sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobCommand, job.Command));1170 }1171 catch (Exception e)1172 {1173 // Exception in 3rd party code should never cause a crash due to tracing. The1174 // Implementation of the property getters could throw.1175 TraceException(e);1176 1177 // If an exception is thrown, make sure the message is not partially formed.1178 sb.Clear();1179 sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobName, EtwLoggingStrings.NullJobName));1180 }1181 }1182 else1183 {1184 sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobName, EtwLoggingStrings.NullJobName));1185 }1186 1187 PSEtwLog.LogAnalyticVerbose(PSEventId.Engine_Trace,1188 PSOpcode.Method, PSTask.None,1189 PSKeyword.UseAlwaysAnalytic,1190 className, methodName, workflowId.ToString(),1191 parameters == null ? message : StringUtil.Format(message, parameters),1192 sb.ToString(), // Job1193 string.Empty, // Activity name1194 string.Empty, // Activity GUID1195 string.Empty);1196 }1197 1198 /// <summary>1199 /// Writes operational scheduled job start message.1200 /// </summary>