Team Ai
Datasetpublic

MegaBites-AI/Windows-powershell

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes372downloads
PowerShellETWTracer.cs1541 linesDownload Raw Back to utils
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>

Showing the first 1,200 of 1541 lines. Download the file for the rest.