还有另一个 .NET 命名空间,称为System.Diagnostics.Eventing.Reader
,其中包含更多 .NET 类,这些类允许您检索有关 Windows 事件跟踪 (ETW) 提供程序和在 Windows 操作系统中注册的事件日志的信息。大多数这些类型都定义在System.Core.dll
.NET 中的 .NET 程序集全局程序集缓存 (GAC) http://msdn.microsoft.com/en-us/library/yf1d93sz%28v=vs.110%29.aspx.
例如,您可以执行以下操作(以及更多操作):
- 查找计算机上安装的 ETW 提供程序的名称
- 发现计算机上存在的 ETW 日志名称的完整列表
- 枚举与 ETW 提供者相关的元数据
- 导出事件日志数据
ETW 提供商名称
ETW 的核心功能之一是获取给定系统上安装的 ETW 提供程序的列表。您可以使用 .NET Framework 类型轻松检索此信息System.Diagnostics.Eventing.Reader
命名空间。恰好有一个名为的 .NET 类EventLogSession
,并且该类上有一个名为的静态属性GlobalSession
,它会自动检索本地计算机上事件日志服务的会话/连接。如有必要,您也可以使用远程计算机上的构造函数之一连接到远程计算机。EventLogSession
class.
一旦你检索到一个实例EventLogSession
类,你可以调用GetProviderNames()
检索集合的方法String
代表计算机上安装的 ETW 提供程序名称的对象。
以下是从本地计算机检索提供程序名称的示例:
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventProviderNames = $EventSession.GetProviderNames();
$EventProviderNames;
以下是使用以下命令从远程计算机检索 ETW 提供程序名称的示例:替代构造函数 http://msdn.microsoft.com/en-us/library/bb351237%28v=vs.110%29.aspx:
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList server01.contoso.com;
$EventProviderNames = $EventSession.GetProviderNames();
$EventProviderNames;
您可以使用不同的构造函数EventLogSession
类来指定远程计算机的备用凭据。这替代构造函数 http://msdn.microsoft.com/en-us/library/bb352836%28v=vs.110%29.aspx为了EventLogSession
类需要以下参数:
- 计算机名称
- 域名
- 用户名
- 密码(作为
SecureString
)
-
System.Diagnostics.Eventing.Reader.SessionAuthentication
type
以下是如何实现这一目标的示例:
$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()
,它返回一个集合String
表示目标系统上可用的 ETW 日志的对象。类似于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 提供商名称之外,您可能还希望检索有关它们的更多详细信息。您可以使用ProviderMetadata
类在System.Diagnostics.Eventing.Reader
.NET 类。资料提供者ProviderMetadata
类包括:
- 提供商显示名称
- 帮助链接(URL)
- 提供商的关键词
- ETW 提供商 ID (GUID)
- 消息文件路径
- 资源文件路径
- 参数文件路径
- 提供者暴露的任务
- 提供者声明的每个事件的事件元数据
与 ETW 提供程序和 ETW 日志名称类似,您可以从本地或远程系统检索提供程序元数据。在后一种情况下,您必须建立一个EventLogSession
在尝试实例化之前实例化ProviderMetadata
class.
以下是从本地系统检索 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];
要从远程系统检索 ETW 提供程序元数据,请构建您的EventLogSession
实例化之前的对象ProviderMetadata
类,当你实例化时ProviderMetadata
,确保将以下参数传递给构造函数 http://msdn.microsoft.com/en-us/library/bb340724%28v=vs.110%29.aspx:
- ETW 提供商名称
-
EventLogSession
实例
- A
CultureInfo
object
...
$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];
Note:实例化时可能会出现一些异常ProviderMetadata
通过经过身份验证的连接的对象:
New-Object:使用“3”个参数调用“.ctor”时发生异常:“尝试
执行未经授权的操作。”
读取 ETW 事件日志
由于您提到您还想从 ETW 事件日志中读取事件,因此使用System.Diagnostics.Eventing.Reader
.NET 命名空间也是如此。这EventLogReader
类包含一个名为的方法ReadEvent()
它不断地从指定的事件日志中读取下一个事件EventLogReader
被实例化。
以下是从系统事件日志中读取事件的简单示例:
# 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(); };
ETW 事件日志配置
与之前检索的提供程序元数据类似,您可以检索有关特定 ETW 事件日志的配置的信息。为此,您实例化EventLogConfiguration class http://msdn.microsoft.com/en-us/library/system.diagnostics.eventing.reader.eventlogconfiguration%28v=vs.110%29.aspx,传入 ETW 事件日志的名称。将返回有关事件日志的各种信息,包括:
- Log name
- 最大大小(以字节为单位)
- 提供者名称
- Log type
- 安全描述符
- 缓冲区大小
- 是否启用日志功能?
以下是如何检索此信息的示例:
$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];