Tre*_*van 2 .net powershell trace etw event-log
我想使用Windows PowerShell检索有关事件提供程序的信息?我正在使用PowerShell 4.0版运行Windows 8.1,我注意到System.Diagnostics.Eventing命名空间中有一些.NET类提供了围绕Windows事件的一些功能.
我可以EventProvider通过调用其默认构造函数来创建实例,但是这不允许我获取有关系统上安装的事件提供程序的任何信息.
$EventProvider = New-Object -TypeName System.Diagnostics.Eventing.EventProvider -ArgumentList ([System.Guid]'{00000000-0000-0000-0000-000000000000}');
Run Code Online (Sandbox Code Playgroud)
如何使用Windows PowerShell获取有关安装在系统上的Windows事件跟踪(ETW)提供程序以及与Windows事件日志交互的更多信息?
我已经知道我可以使用命令logman.exe query providers,如这里所描述,检索ETW供应商名单,并查询Windows事件日志,但这不是非常友好的PowerShell.
还有另一个名为.NET的命名空间System.Diagnostics.Eventing.Reader,它包含许多.NET类,允许您检索有关Windows事件跟踪(ETW)提供程序和使用Windows操作系统注册的事件日志的信息.大多数这些类型是在System.Core.dll.NET 全局程序集缓存(GAC)的.NET程序集中定义的.
例如,您可以执行以下操作(以及更多):
ETW的核心功能之一是获取在给定系统上安装的ETW提供程序列表.您可以使用System.Diagnostics.Eventing.Reader命名空间中的.NET Framework类型轻松检索此信息.恰好是一个名为.NET的类EventLogSession,并且在这个类上是一个名为的静态属性GlobalSession,它自动检索到本地计算机上的事件日志服务的会话/连接.如有必要,您也可以使用类中的一个构造函数连接到远程计算机EventLogSession.
检索到EventLogSession类的实例后,可以调用该GetProviderNames()方法来检索一组String对象,这些对象表示计算机上已安装的ETW提供程序的名称.
以下是从本地计算机检索提供程序名称的示例:
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventProviderNames = $EventSession.GetProviderNames();
$EventProviderNames;
Run Code Online (Sandbox Code Playgroud)
以下是使用备用构造函数从远程计算机检索ETW提供程序名称的示例:
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList server01.contoso.com;
$EventProviderNames = $EventSession.GetProviderNames();
$EventProviderNames;
Run Code Online (Sandbox Code Playgroud)
您可以使用EventLogSession该类的其他构造函数来指定远程计算机的备用凭据.在可选的构造为EventLogSession类需要以下参数:
SecureString)System.Diagnostics.Eventing.Reader.SessionAuthentication 类型以下是如何实现这一目标的示例:
$ComputerName = 'server01.contoso.com';
$Credential = Get-Credential;
$ArgumentList = $ComputerName, $Credential.UserName.Split('\')[0], $Credential.UserName.Split('\')[1], $Credential.Password, [System.Diagnostics.Eventing.Reader.SessionAuthentication]::Default;
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList $ArgumentList;
Run Code Online (Sandbox Code Playgroud)
一旦发现计算机上安装的所有ETW提供程序,您可能还希望浏览计算机上可用的ETW日志的完整列表.该EventLogSession班也有一个调用的方法GetLogNames(),它返回的集合String,代表了目标系统上可用的ETW日志对象.与GetProviderNames()方法类似,您可以GetLogNames()在本地或远程计算机上调用.
以下是从本地计算机检索ETW日志名称的示例:
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventLogNames = $EventSession.GetLogNames();
$EventLogNames;
Run Code Online (Sandbox Code Playgroud)
以下是从远程计算机检索ETW日志名称的示例:
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList server01.contoso.com;
$EventLogNames = $EventSession.GetLogNames();
$EventLogNames;
Run Code Online (Sandbox Code Playgroud)
除了检索ETW提供程序名称之外,您可能还希望检索有关它们的更多详细信息.您可以使用.NET类中的ProviderMetadata类来完成此操作System.Diagnostics.Eventing.Reader.该ProviderMetadata课程提供的信息包括:
与ETW提供程序和ETW日志名称类似,您可以从本地或远程系统检索提供程序元数据.在后一种情况下,您必须EventLogSession在尝试实例化ProviderMetadata类之前建立实例.
以下是从本地系统检索ETW提供程序元数据的示例:
# Get the EventLogSession object
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
# Get the ETW provider names
$EventProviderNames = $EventSession.GetProviderNames();
# Create an empty array to hold the ProviderMetadata instances
$ProviderMetadataList = @();
# For each ETW provider name ...
foreach ($EventProvider in $EventProviderNames) {
# Add each ProviderMetadata instance to the array
$ProviderMetadataList += New-Object -TypeName System.Diagnostics.Eventing.Reader.ProviderMetadata -ArgumentList $EventProvider;
}
# Explore the 16th item from the ProviderMetadata array
$ProviderMetadataList[15];
Run Code Online (Sandbox Code Playgroud)
要从远程系统检索ETW提供程序元数据,请EventLogSession在实例化ProviderMetadata类之前构建对象,并在实例化ProviderMetadata时确保将以下参数传递给构造函数:
EventLogSession 例CultureInfo对象...
$ComputerName = 'server01.contoso.com';
$Credential = Get-Credential;
$SessionArgumentList = $ComputerName, $Credential.UserName.Split('\')[0], $Credential.UserName.Split('\')[1], $Credential.Password, [System.Diagnostics.Eventing.Reader.SessionAuthentication]::Kerberos;
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList $SessionArgumentList;
$EventProviderNames = $EventSession.GetProviderNames();
# Create an empty array to hold the ProviderMetadata instances
$ProviderMetadataList = @();
foreach ($EventProvider in $EventProviderNames) {
# Build the Arguments for the ProviderMetadata constructor
$ProviderMetadataArgumentList = $EventProvider, $EventSession, [CultureInfo]::CurrentCulture;
# Add each ProviderMetadata instance to the array
$ProviderMetadataList += New-Object -TypeName System.Diagnostics.Eventing.Reader.ProviderMetadata -ArgumentList $ProviderMetadataArgumentList;
}
# Explore the 111th item from the array
$ProviderMetadataList[110];
Run Code Online (Sandbox Code Playgroud)
注意:ProviderMetadata通过经过身份验证的连接实例化对象时,可能会遇到一些异常:
New-Object:使用"3"参数调用".ctor"的异常:"试图执行未经授权的操作."
由于您提到您还希望从ETW事件日志中读取事件,因此这也很容易用于System.Diagnostics.Eventing.Reader.NET命名空间中的类型.本EventLogReader类包含一个名为方法ReadEvent(),其连续读取从时指定的事件日志中的下一个事件EventLogReader被实例化.
以下是从System事件日志中读取事件的简单示例:
# Instantiate the EventLogReader .NET class
$EventLogReader = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogReader -ArgumentList 'System';
# Read the first 5 events from the event log
1..5 | % { $EventLogReader.ReadEvent(); };
Run Code Online (Sandbox Code Playgroud)
与先前检索的提供程序元数据类似,您可以检索有关特定ETW事件日志的配置的信息.为此,您实例化EventLogConfiguration该类,传入ETW事件日志的名称.将返回有关事件日志的各种信息,包括:
以下是如何检索此信息的示例:
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventLogNames = $EventSession.GetLogNames();
$EventLogConfigurationList = @();
foreach ($EventLogName in $EventLogNames) {
$EventLogConfigurationList += New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogConfiguration -ArgumentList $EventLogName;
}
$EventLogConfigurationList[5];
Run Code Online (Sandbox Code Playgroud)