有另一个名为
System.Diagnostics.Eventing.Reader
的.NET命名空间,其中包含许多更多的.NET类,可让您检索有关在Windows操作系统上注册的事件跟踪(ETW)提供程序和事件日志的信息。这些类型中的大部分是在.NET程序集中的
全局程序集缓存(GAC)中定义的
System.Core.dll
。
例如,您可以执行以下操作(等等):
- 查找计算机上安装的ETW提供程序的名称
- 发现计算机上存在的完整ETW日志名称列表
- 枚举与ETW提供程序相关的元数据
- 导出事件日志数据
ETW提供程序名称
核心功能之一是获取已安装在给定系统上的ETW提供程序列表。您可以使用位于System.Diagnostics.Eventing.Reader命名空间中的.NET Framework类型轻松检索此信息。恰好有一个名为EventLogSession的.NET类,该类具有名为GlobalSession的静态属性,该属性自动检索与本地计算机上的事件日志服务的会话/连接。如果需要,您还可以使用EventLogSession类上的构造函数之一连接到远程计算机。
一旦检索到EventLogSession类的实例,就可以调用GetProviderNames()方法检索代表计算机上已安装的ETW提供程序名称的String对象集合。
以下是从本地计算机检索提供程序名称的示例:
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventProviderNames = $EventSession.GetProviderNames();
$EventProviderNames;
这是一个使用
替代构造函数从远程计算机检索ETW提供程序名称的示例:
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList server01.contoso.com;
$EventProviderNames = $EventSession.GetProviderNames();
$EventProviderNames;
您可以使用
EventLogSession
类的另一个构造函数来指定远程计算机的备用凭据。
EventLogSession
类的
alternate constructor 需要以下参数:
- 计算机名称
- 域名
- 用户名
- 密码(作为
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;
ETW日志名称
一旦您发现计算机上安装的所有ETW提供程序,您可能还希望探索计算机上可用的完整ETW日志列表。 EventLogSession
类还具有一个名为GetLogNames()
的方法,该方法返回表示目标系统上可用的ETW日志的String
对象集合。与GetProviderNames()
方法类似,您可以在本地或远程计算机上调用GetLogNames()
。
以下是从本地计算机检索ETW日志名称的示例:
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventLogNames = $EventSession.GetLogNames();
$EventLogNames;
以下是从远程计算机检索ETW日志名称的示例:
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList server01.contoso.com;
$EventLogNames = $EventSession.GetLogNames();
$EventLogNames;
ETW提供程序元数据
除了检索ETW提供程序名称外,您可能还希望检索有关它们的更详细信息。您可以使用System.Diagnostics.Eventing.Reader
.NET类中的ProviderMetadata
类来实现此目的。由ProviderMetadata
类提供的信息包括:
- 提供程序显示名称
- 帮助链接(URL)
- 提供程序的关键字
- ETW提供程序ID(GUID)
- 消息文件路径
- 资源文件路径
- 参数文件路径
- 提供程序公开的任务
- 提供程序声明的每个事件的事件元数据
与ETW提供程序和ETW日志名称类似,您可以从本地或远程系统中检索提供程序元数据。在后一种情况下,您必须在尝试实例化ProviderMetadata
类之前建立一个EventLogSession
实例。
以下是从本地系统检索ETW提供程序元数据的示例:
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventProviderNames = $EventSession.GetProviderNames();
$ProviderMetadataList = @();
foreach ($EventProvider in $EventProviderNames) {
$ProviderMetadataList += New-Object -TypeName System.Diagnostics.Eventing.Reader.ProviderMetadata -ArgumentList $EventProvider;
}
$ProviderMetadataList[15];
要从远程系统检索ETW提供程序元数据,请在实例化ProviderMetadata
类之前构建您的EventLogSession
对象,并且当您实例化ProviderMetadata
时,请确保将以下参数传递给constructor:
- ETW提供程序名称
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();
$ProviderMetadataList = @();
foreach ($EventProvider in $EventProviderNames) {
$ProviderMetadataArgumentList = $EventProvider, $EventSession, [CultureInfo]::CurrentCulture;
$ProviderMetadataList += New-Object -TypeName System.Diagnostics.Eventing.Reader.ProviderMetadata -ArgumentList $ProviderMetadataArgumentList;
}
$ProviderMetadataList[110];
注意:当您通过已认证的连接实例化ProviderMetadata对象时,可能会出现一些异常:
“New-Object:使用3个参数调用“.ctor”时发生异常:“尝试执行未经授权的操作。””
读取ETW事件日志
由于您提到您也想从ETW事件日志中读取事件,因此可以使用System.Diagnostics.Eventing.Reader .NET命名空间中的类型轻松完成此操作。EventLogReader类包含一个名为ReadEvent()的方法,该方法在实例化EventLogReader时指定的事件日志中连续读取下一个事件。
以下是从System事件日志中读取事件的简单示例:
$EventLogReader = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogReader -ArgumentList 'System';
1..5 | % { $EventLogReader.ReadEvent(); };
ETW事件日志配置
与先前检索的提供程序元数据类似,您可以检索有关特定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];