#if !UNIX // // Copyright (C) Microsoft. All rights reserved. // using System.Globalization; using System.Management.Automation.Runspaces; using System.Text; using System.Diagnostics.Eventing; using System.Management.Automation.Internal; namespace System.Management.Automation.Tracing { //pragma warning disable 16001,16003 #region Constants /// /// Defines enumerations for event ids /// /// add an entry for a new event that you /// add to the manifest. Set it to the same value /// that was set in the manifest public enum PowerShellTraceEvent : int { /// /// None. (Should not be used) /// None = 0, /// /// HostNameResolve /// HostNameResolve = 0x1001, /// /// SchemeResolve /// SchemeResolve = 0x1002, /// /// ShellResolve /// ShellResolve = 0x1003, /// /// RunspaceConstructor /// RunspaceConstructor = 0x2001, /// /// RunspacePoolConstructor /// RunspacePoolConstructor = 0x2002, /// /// RunspacePoolOpen /// RunspacePoolOpen = 0x2003, /// /// OperationalTransferEventRunspacePool /// OperationalTransferEventRunspacePool = 0x2004, /// /// RunspacePort /// RunspacePort = 0x2F01, /// /// AppName /// AppName = 0x2F02, /// /// ComputerName /// ComputerName = 0x2F03, /// /// Scheme /// Scheme = 0x2F04, /// /// TestAnalytic /// TestAnalytic = 0x2F05, /// /// WSManConnectionInfoDump /// WSManConnectionInfoDump = 0x2F06, /// /// AnalyticTransferEventRunspacePool /// AnalyticTransferEventRunspacePool = 0x2F07, // Start: Transport related events /// /// TransportReceivedObject /// TransportReceivedObject = 0x8001, /// /// AppDomainUnhandledExceptionAnalytic /// AppDomainUnhandledExceptionAnalytic = 0x8007, /// /// TransportErrorAnalytic /// TransportErrorAnalytic = 0x8008, /// /// AppDomainUnhandledException /// AppDomainUnhandledException = 0x8009, /// /// TransportError /// TransportError = 0x8010, /// /// WSManCreateShell /// WSManCreateShell = 0x8011, /// /// WSManCreateShellCallbackReceived /// WSManCreateShellCallbackReceived = 0x8012, /// /// WSManCloseShell /// WSManCloseShell = 0x8013, /// /// WSManCloseShellCallbackReceived /// WSManCloseShellCallbackReceived = 0x8014, /// /// WSManSendShellInputExtended /// WSManSendShellInputExtended = 0x8015, /// /// WSManSendShellInputExCallbackReceived /// WSManSendShellInputExtendedCallbackReceived = 0x8016, /// /// WSManReceiveShellOutputExtended /// WSManReceiveShellOutputExtended = 0x8017, /// /// WSManReceiveShellOutputExCallbackReceived /// WSManReceiveShellOutputExtendedCallbackReceived = 0x8018, /// /// WSManCreateCommand /// WSManCreateCommand = 0x8019, /// /// WSManCreateCommandCallbackReceived /// WSManCreateCommandCallbackReceived = 0x8020, /// /// WSManCloseCommand /// WSManCloseCommand = 0x8021, /// /// WSManCloseCommandCallbackReceived /// WSManCloseCommandCallbackReceived = 0x8022, /// /// WSManSignal /// WSManSignal = 0x8023, /// /// WSManSignalCallbackReceived /// WSManSignalCallbackReceived = 0x8024, /// /// UriRedirection /// UriRedirection = 0x8025, /// /// ServerSendData /// ServerSendData = 0x8051, /// /// ServerCreateRemoteSession /// ServerCreateRemoteSession = 0x8052, /// /// ReportContext /// ReportContext = 0x8053, /// /// ReportOperationComplete /// ReportOperationComplete = 0x8054, /// /// ServerCreateCommandSession /// ServerCreateCommandSession = 0x8055, /// /// ServerStopCommand /// ServerStopCommand = 0x8056, /// /// ServerReceivedData /// ServerReceivedData = 0x8057, /// /// ServerClientReceiveRequest /// ServerClientReceiveRequest = 0x8058, /// /// ServerCloseOperation /// ServerCloseOperation = 0x8059, /// /// LoadingPSCustomShellAssembly /// LoadingPSCustomShellAssembly = 0x8061, /// /// LoadingPSCustomShellType /// LoadingPSCustomShellType = 0x8062, /// /// ReceivedRemotingFragment /// ReceivedRemotingFragment = 0x8063, /// /// SentRemotingFragment /// SentRemotingFragment = 0x8064, /// /// WSManPluginShutdown /// WSManPluginShutdown = 0x8065, // End: Transport related events // Start: Serialization related events /// /// SerializerWorkflowLoadSuccess /// SerializerWorkflowLoadSuccess = 0x7001, /// /// SerializerWorkflowLoadFailure /// SerializerWorkflowLoadFailure = 0x7002, /// /// SerializerDepthOverride /// SerializerDepthOverride = 0x7003, /// /// SerializerModeOverride /// SerializerModeOverride = 0x7004, /// /// SerializerScriptPropertyWithoutRunspace /// SerializerScriptPropertyWithoutRunspace = 0x7005, /// /// SerializerPropertyGetterFailed /// SerializerPropertyGetterFailed = 0x7006, /// /// SerializerEnumerationFailed /// SerializerEnumerationFailed = 0x7007, /// /// SerializerToStringFailed /// SerializerToStringFailed = 0x7008, /// /// SerializerMaxDepthWhenSerializing /// SerializerMaxDepthWhenSerializing = 0x700A, /// /// SerializerXmlExceptionWhenDeserializing /// SerializerXmlExceptionWhenDeserializing = 0x700B, /// /// SerializerSpecificPropertyMissing /// SerializerSpecificPropertyMissing = 0x700C, // End: Serialization related events // Start: PerformanceTrack related events /// /// PerformanceTrackConsoleStartupStart /// PerformanceTrackConsoleStartupStart = 0xA001, /// /// PerformanceTrackConsoleStartupStop /// PerformanceTrackConsoleStartupStop = 0xA002, // End: Preftrack related events /// /// ErrorRecord /// ErrorRecord = 0xB001, /// /// Exception /// Exception = 0xB002, /// /// PowerShellObject /// PowerShellObject = 0xB003, /// /// Job /// Job = 0xB004, /// /// Writing a simple trace message from code /// TraceMessage = 0xB005, /// /// Trace the WSManConnectionInfo used for this connection /// TraceWSManConnectionInfo = 0xB006, /// /// Writing a simple trace message from code with 2 /// strings /// TraceMessage2 = 0xC001, /// /// Writing a simple trace message from code with 2 /// strings /// TraceMessageGuid = 0xC002, } /// /// Defines enumerations for channels /// //pragma warning disable 16001 public enum PowerShellTraceChannel { /// /// None (No channel selected, should not be used) /// None = 0, /// /// Operational Channel /// Operational = 0x10, /// /// Analytic Channel /// Analytic = 0x11, /// /// Debug Channel /// Debug = 0x12, } //pragma warning restore 16001 /// /// Define enumerations for levels /// public enum PowerShellTraceLevel { /// /// LogAlways /// LogAlways = 0, /// /// Critical /// Critical = 1, /// /// Error /// Error = 2, /// /// Warning /// Warning = 3, /// /// Informational /// Informational = 4, /// /// Verbose /// Verbose = 5, /// /// Debug /// Debug = 20, } /// /// Defines enumerations for op codes /// public enum PowerShellTraceOperationCode { /// /// None. (Should not be used) /// None = 0, /// /// Open /// Open = 10, /// /// Close /// Close = 11, /// /// Connect /// Connect = 12, /// /// Disconnect /// Disconnect = 13, /// /// Negotiate /// Negotiate = 14, /// /// Create /// Create = 15, /// /// Constructor /// Constructor = 16, /// /// Dispose /// Dispose = 17, /// /// EventHandler /// EventHandler = 18, /// /// Exception /// Exception = 19, /// /// Method /// Method = 20, /// /// Send /// Send = 21, /// /// Receive /// Receive = 22, /// /// WorkflowLoad /// WorkflowLoad = 23, /// /// SerializationSettings /// SerializationSettings = 24, /// /// WinInfo /// WinInfo, /// /// WinStart /// WinStart, /// /// WinStop /// WinStop, /// /// WinDCStart /// WinDCStart, /// /// WinDCStop /// WinDCStop, /// /// WinExtension /// WinExtension, /// /// WinReply /// WinReply, /// /// WinResume /// WinResume, /// /// WinSuspend /// WinSuspend, } /// /// Defines Tasks /// public enum PowerShellTraceTask { /// /// None /// None = 0, /// /// CreateRunspace /// CreateRunspace = 1, /// /// ExecuteCommand /// ExecuteCommand = 2, /// /// Serialization /// Serialization = 3, /// /// PowerShellConsoleStartup /// PowerShellConsoleStartup = 4, } /// /// Defines Keywords. /// [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1028")] [Flags] public enum PowerShellTraceKeywords : ulong { /// /// None /// None = 0, /// /// Runspace /// Runspace = 0x1, /// /// Pipeline /// Pipeline = 0x2, /// /// Protocol /// Protocol = 0x4, /// /// Transport /// Transport = 0x8, /// /// Host /// Host = 0x10, /// /// Cmdlets /// Cmdlets = 0x20, /// /// Serializer /// Serializer = 0x40, /// /// Session /// Session = 0x80, /// /// ManagedPlugIn /// ManagedPlugIn = 0x100, /// /// /// UseAlwaysDebug = 0x2000000000000000, /// /// /// UseAlwaysOperational = 0x8000000000000000, /// /// /// UseAlwaysAnalytic = 0x4000000000000000, } #endregion /// /// BaseChannelWriter is the abstract base class defines event specific methods that are used to write a trace. /// The default implementation does not write any message to any trace channel /// public abstract class BaseChannelWriter : IDisposable { private bool disposed; /// /// Dispose method /// public virtual void Dispose() { if (!disposed) { GC.SuppressFinalize(this); disposed = true; } } /// /// TraceError /// public virtual bool TraceError(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return true; } /// /// TraceWarning /// public virtual bool TraceWarning(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return true; } /// /// TraceInformational /// public virtual bool TraceInformational(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return true; } /// /// TraceVerbose /// public virtual bool TraceVerbose(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return true; } /// /// TraceDebug /// public virtual bool TraceDebug(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return true; } /// /// TraceLogAlways /// public virtual bool TraceLogAlways(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return true; } /// /// TraceCritical /// public virtual bool TraceCritical(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return true; } /// /// /// public virtual PowerShellTraceKeywords Keywords { get { return PowerShellTraceKeywords.None; } set { PowerShellTraceKeywords powerShellTraceKeywords = value; } } } /// /// NullWriter is the implementation of BaseChannelWriter. /// This implementation does not write to any trace logs. /// This class is singleton and exposes its only instance /// through the static Instance property. /// public sealed class NullWriter : BaseChannelWriter { /// /// Static Instance property /// public static BaseChannelWriter Instance { get; } = new NullWriter(); private NullWriter() { } } /// /// ChannelWrite is the concrete implementation of IChannelWrite. It writes all the traces to the specified traceChannel. /// TraceChannel is specified in the constructor. /// It always uses PowerShell event provider Id. /// public sealed class PowerShellChannelWriter : BaseChannelWriter { private readonly PowerShellTraceChannel _traceChannel; /* * Making the provider static to reduce the number of buffers needed to 1. * */ private static readonly EventProvider _provider = new EventProvider(new Guid("A0C1853B-5C40-4b15-8766-3CF1C58F985A")); private bool disposed; private PowerShellTraceKeywords _keywords; /// /// /// public override PowerShellTraceKeywords Keywords { get { return _keywords; } set { _keywords = value; } } internal PowerShellChannelWriter(PowerShellTraceChannel traceChannel, PowerShellTraceKeywords keywords) { _traceChannel = traceChannel; _keywords = keywords; } /// /// Dispose method /// public override void Dispose() { if (!disposed) { GC.SuppressFinalize(this); disposed = true; } } private bool Trace(PowerShellTraceEvent traceEvent, PowerShellTraceLevel level, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { EventDescriptor ed = new EventDescriptor((int)traceEvent, 1, (byte)_traceChannel, (byte)level, (byte)operationCode, (int)task, (long)_keywords); /* * Not using locks because the _provider is thread safe itself. **/ if (args != null) { for (int i = 0; i < args.Length; i++) { if (args[i] == null) { args[i] = string.Empty; } } } return _provider.WriteEvent(ref ed, args); } /// /// TraceError /// public override bool TraceError(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return Trace(traceEvent, PowerShellTraceLevel.Error, operationCode, task, args); } /// /// TraceWarning /// public override bool TraceWarning(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return Trace(traceEvent, PowerShellTraceLevel.Warning, operationCode, task, args); } /// /// TraceInformational /// public override bool TraceInformational(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return Trace(traceEvent, PowerShellTraceLevel.Informational, operationCode, task, args); } /// /// TraceVerbose /// public override bool TraceVerbose(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return Trace(traceEvent, PowerShellTraceLevel.Verbose, operationCode, task, args); } /// /// TraceDebug /// public override bool TraceDebug(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { // TODO: There is some error thrown by the custom debug level // hence Informational is being used return Trace(traceEvent, PowerShellTraceLevel.Informational, operationCode, task, args); } /// /// TraceLogAlways /// public override bool TraceLogAlways(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return Trace(traceEvent, PowerShellTraceLevel.LogAlways, operationCode, task, args); } /// /// TraceCritical /// public override bool TraceCritical(PowerShellTraceEvent traceEvent, PowerShellTraceOperationCode operationCode, PowerShellTraceTask task, params object[] args) { return Trace(traceEvent, PowerShellTraceLevel.Critical, operationCode, task, args); } } /// /// TraceSource class gives access to the actual TraceWriter channels. /// Three channels are pre-defined 1) Debug 2) Analytic and 3) Operations /// This class also has strongly types methods that are used for easy tracing. /// public sealed class PowerShellTraceSource : IDisposable { private bool disposed; /// /// Constructor /// internal PowerShellTraceSource(PowerShellTraceTask task, PowerShellTraceKeywords keywords) { if (IsEtwSupported) { DebugChannel = new PowerShellChannelWriter(PowerShellTraceChannel.Debug, keywords | PowerShellTraceKeywords.UseAlwaysDebug); AnalyticChannel = new PowerShellChannelWriter(PowerShellTraceChannel.Analytic, keywords | PowerShellTraceKeywords.UseAlwaysAnalytic); OperationalChannel = new PowerShellChannelWriter(PowerShellTraceChannel.Operational, keywords | PowerShellTraceKeywords.UseAlwaysOperational); this.Task = task; this.Keywords = keywords; } else { DebugChannel = NullWriter.Instance; AnalyticChannel = NullWriter.Instance; OperationalChannel = NullWriter.Instance; } } /// /// Dispose method. /// public void Dispose() { if (!disposed) { disposed = true; GC.SuppressFinalize(this); DebugChannel.Dispose(); AnalyticChannel.Dispose(); OperationalChannel.Dispose(); } } /// /// Keywords that were set through constructor when object was instantiated /// public PowerShellTraceKeywords Keywords { get; } = PowerShellTraceKeywords.None; /// /// Task that was set through constructor /// public PowerShellTraceTask Task { get; set; } = PowerShellTraceTask.None; private bool IsEtwSupported { get { return Environment.OSVersion.Version.Major >= 6; } } /// /// TraceErrorRecord /// public bool TraceErrorRecord(ErrorRecord errorRecord) { if (errorRecord != null) { Exception exception = errorRecord.Exception; string innerException = "None"; if (exception.InnerException != null) { innerException = exception.InnerException.Message; } ErrorCategoryInfo cinfo = errorRecord.CategoryInfo; string message = "None"; if (errorRecord.ErrorDetails != null) { message = errorRecord.ErrorDetails.Message; } return DebugChannel.TraceError(PowerShellTraceEvent.ErrorRecord, PowerShellTraceOperationCode.Exception, PowerShellTraceTask.None, message, cinfo.Category.ToString(), cinfo.Reason, cinfo.TargetName, errorRecord.FullyQualifiedErrorId, exception.Message, exception.StackTrace, innerException); } else { return DebugChannel.TraceError(PowerShellTraceEvent.ErrorRecord, PowerShellTraceOperationCode.Exception, PowerShellTraceTask.None, "NULL errorRecord"); } } /// /// TraceException /// public bool TraceException(Exception exception) { if (exception != null) { string innerException = "None"; if (exception.InnerException != null) { innerException = exception.InnerException.Message; } return DebugChannel.TraceError(PowerShellTraceEvent.Exception, PowerShellTraceOperationCode.Exception, PowerShellTraceTask.None, exception.Message, exception.StackTrace, innerException); } else { return DebugChannel.TraceError(PowerShellTraceEvent.Exception, PowerShellTraceOperationCode.Exception, PowerShellTraceTask.None, "NULL exception"); } } /// /// TracePowerShellObject /// public bool TracePowerShellObject(PSObject powerShellObject) { return this.DebugChannel.TraceDebug(PowerShellTraceEvent.PowerShellObject, PowerShellTraceOperationCode.Method, PowerShellTraceTask.None); } /// /// TraceJob /// public bool TraceJob(Job job) { if (job != null) { return DebugChannel.TraceDebug(PowerShellTraceEvent.Job, PowerShellTraceOperationCode.Method, PowerShellTraceTask.None, job.Id.ToString(CultureInfo.InvariantCulture), job.InstanceId.ToString(), job.Name, job.Location, job.JobStateInfo.State.ToString(), job.Command); } else { return DebugChannel.TraceDebug(PowerShellTraceEvent.Job, PowerShellTraceOperationCode.Method, PowerShellTraceTask.None, "", "", "NULL job"); } } /// /// /// /// /// public bool WriteMessage(String message) { return DebugChannel.TraceInformational(PowerShellTraceEvent.TraceMessage, PowerShellTraceOperationCode.None, PowerShellTraceTask.None, message); } /// /// /// /// /// /// public bool WriteMessage(string message1, string message2) { return DebugChannel.TraceInformational(PowerShellTraceEvent.TraceMessage2, PowerShellTraceOperationCode.None, PowerShellTraceTask.None, message1, message2); } /// /// /// /// /// /// public bool WriteMessage(string message, Guid instanceId) { return DebugChannel.TraceInformational(PowerShellTraceEvent.TraceMessageGuid, PowerShellTraceOperationCode.None, PowerShellTraceTask.None, message, instanceId); } /// /// /// /// /// /// /// /// /// public void WriteMessage(string className, string methodName, Guid workflowId, string message, params string[] parameters) { PSEtwLog.LogAnalyticVerbose(PSEventId.Engine_Trace, PSOpcode.Method, PSTask.None, PSKeyword.UseAlwaysAnalytic, className, methodName, workflowId.ToString(), parameters == null ? message : StringUtil.Format(message, parameters), String.Empty, // Job String.Empty, // Activity name String.Empty, // Activity GUID String.Empty); } /// /// /// /// /// /// /// /// /// /// public void WriteMessage(string className, string methodName, Guid workflowId, Job job, string message, params string[] parameters) { StringBuilder sb = new StringBuilder(); if (job != null) { try { sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobName, job.Name)); sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobId, job.Id.ToString(CultureInfo.InvariantCulture))); sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobInstanceId, job.InstanceId.ToString())); sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobLocation, job.Location)); sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobState, job.JobStateInfo.State.ToString())); sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobCommand, job.Command)); } catch (Exception e) { // Exception in 3rd party code should never cause a crash due to tracing. The // Implementation of the property getters could throw. TraceException(e); // If an exception is thrown, make sure the message is not partially formed. sb.Clear(); sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobName, EtwLoggingStrings.NullJobName)); } } else { sb.AppendLine(StringUtil.Format(EtwLoggingStrings.JobName, EtwLoggingStrings.NullJobName)); } PSEtwLog.LogAnalyticVerbose(PSEventId.Engine_Trace, PSOpcode.Method, PSTask.None, PSKeyword.UseAlwaysAnalytic, className, methodName, workflowId.ToString(), parameters == null ? message : StringUtil.Format(message, parameters), sb.ToString(),// Job String.Empty, // Activity name String.Empty, // Activity GUID String.Empty); } /// /// Writes operational scheduled job start message. /// /// public void WriteScheduledJobStartEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ScheduledJob_Start, PSOpcode.Method, PSTask.ScheduledJob, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational scheduled job completed message. /// /// public void WriteScheduledJobCompleteEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ScheduledJob_Complete, PSOpcode.Method, PSTask.ScheduledJob, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational scheduled job error message. /// /// public void WriteScheduledJobErrorEvent(params object[] args) { PSEtwLog.LogOperationalError(PSEventId.ScheduledJob_Error, PSOpcode.Exception, PSTask.ScheduledJob, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE execute script message. /// /// public void WriteISEExecuteScriptEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEExecuteScript, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE execute selection message. /// /// public void WriteISEExecuteSelectionEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEExecuteSelection, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE stop command message. /// /// public void WriteISEStopCommandEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEStopCommand, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE resume debugger message. /// /// public void WriteISEResumeDebuggerEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEResumeDebugger, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE stop debugger message. /// /// public void WriteISEStopDebuggerEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEStopDebugger, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE debugger step into message. /// /// public void WriteISEDebuggerStepIntoEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEDebuggerStepInto, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE debugger step over message. /// /// public void WriteISEDebuggerStepOverEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEDebuggerStepOver, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE debugger step out message. /// /// public void WriteISEDebuggerStepOutEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEDebuggerStepOut, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE enable all breakpoints message. /// /// public void WriteISEEnableAllBreakpointsEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEEnableAllBreakpoints, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE disable all breakpoints message. /// /// public void WriteISEDisableAllBreakpointsEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEDisableAllBreakpoints, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE remove all breakpoints message. /// /// public void WriteISERemoveAllBreakpointsEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISERemoveAllBreakpoints, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE set breakpoint message. /// /// public void WriteISESetBreakpointEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISESetBreakpoint, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE remove breakpoint message. /// /// public void WriteISERemoveBreakpointEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISERemoveBreakpoint, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE enable breakpoint message. /// /// public void WriteISEEnableBreakpointEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEEnableBreakpoint, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE disable breakpoint message. /// /// public void WriteISEDisableBreakpointEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEDisableBreakpoint, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// Writes operational ISE hit breakpoint message. /// /// public void WriteISEHitBreakpointEvent(params object[] args) { PSEtwLog.LogOperationalInformation(PSEventId.ISEHitBreakpoint, PSOpcode.Method, PSTask.ISEOperation, PSKeyword.UseAlwaysOperational, args); } /// /// /// /// /// /// /// /// /// /// /// public void WriteMessage(string className, string methodName, Guid workflowId, string activityName, Guid activityId, string message, params string[] parameters) { PSEtwLog.LogAnalyticVerbose(PSEventId.Engine_Trace, PSOpcode.Method, PSTask.None, PSKeyword.UseAlwaysAnalytic, className, methodName, workflowId.ToString(), parameters == null ? message : StringUtil.Format(message, parameters), String.Empty, // Job activityName, activityId.ToString(), String.Empty); } /// /// /// /// /// public bool TraceWSManConnectionInfo(WSManConnectionInfo connectionInfo) { return true; } /// /// Gives access to Debug channel writer /// public BaseChannelWriter DebugChannel { get; } /// /// Gives access to analytical channel writer /// public BaseChannelWriter AnalyticChannel { get; } /// /// Gives access to operational channel writer /// public BaseChannelWriter OperationalChannel { get; } } /// /// TraceSourceFactory will return an instance of TraceSource every time GetTraceSource method is called. /// public static class PowerShellTraceSourceFactory { /// /// Returns an instance of BaseChannelWriter. /// If the Etw is not supported by the platform it will return NullWriter.Instance /// /// A Task and a set of Keywords can be specified in the GetTraceSource method (See overloads). /// The supplied task and keywords are used to pass to the Etw provider in case they are /// not defined in the manifest file. /// public static PowerShellTraceSource GetTraceSource() { return new PowerShellTraceSource(PowerShellTraceTask.None, PowerShellTraceKeywords.None); } /// /// Returns an instance of BaseChannelWriter. /// If the Etw is not supported by the platform it will return NullWriter.Instance /// /// A Task and a set of Keywords can be specified in the GetTraceSource method (See overloads). /// The supplied task and keywords are used to pass to the Etw provider in case they are /// not defined in the manifest file. /// public static PowerShellTraceSource GetTraceSource(PowerShellTraceTask task) { return new PowerShellTraceSource(task, PowerShellTraceKeywords.None); } /// /// Returns an instance of BaseChannelWriter. /// If the Etw is not supported by the platform it will return NullWriter.Instance /// /// A Task and a set of Keywords can be specified in the GetTraceSource method (See overloads). /// The supplied task and keywords are used to pass to the Etw provider in case they are /// not defined in the manifest file. /// public static PowerShellTraceSource GetTraceSource(PowerShellTraceTask task, PowerShellTraceKeywords keywords) { return new PowerShellTraceSource(task, keywords); } } //pragma warning restore 16001,16003 } #endif