.net 获取Windows事件提供程序信息

.net 获取Windows事件提供程序信息,.net,powershell,event-log,trace,etw,.net,Powershell,Event Log,Trace,Etw,我想检索有关使用Windows PowerShell的事件提供程序的信息?我正在使用PowerShell 4.0版运行Windows 8.1,我注意到中有一些.NET类提供了一些有关Windows事件的功能 我可以通过调用其默认构造函数来创建一个EventProvider实例,但是这不允许我获取有关系统上安装的事件提供程序的任何信息 $EventProvider = New-Object -TypeName System.Diagnostics.Eventing.EventProvider -A

我想检索有关使用Windows PowerShell的事件提供程序的信息?我正在使用PowerShell 4.0版运行Windows 8.1,我注意到中有一些.NET类提供了一些有关Windows事件的功能

我可以通过调用其默认构造函数来创建一个
EventProvider
实例,但是这不允许我获取有关系统上安装的事件提供程序的任何信息

$EventProvider = New-Object -TypeName System.Diagnostics.Eventing.EventProvider -ArgumentList ([System.Guid]'{00000000-0000-0000-0000-000000000000}');
如何使用Windows PowerShell获取有关系统上安装的Windows(ETW)提供程序的事件跟踪以及与Windows事件日志交互的更多信息


我已经知道,我可以使用命令
logman.exe query providers
,as检索ETW提供程序列表,并查询Windows事件日志,但这对PowerShell不太友好。

还有另一个.NET命名空间,名为
System.Diagnostics.Eventing.Reader
,它包含更多的.NET类,允许您检索有关Windows(ETW)提供程序的事件跟踪信息以及在Windows操作系统中注册的事件日志。这些类型中的大多数是在.NET中的
System.Core.dll
.NET程序集中定义的

例如,您可以执行以下操作(及更多操作):

  • 查找计算机上安装的ETW提供程序的名称
  • 查找计算机上存在的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;
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventLogNames = $EventSession.GetLogNames();
$EventLogNames;
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList server01.contoso.com;
$EventLogNames = $EventSession.GetLogNames();
$EventLogNames;
以下是使用以下命令从远程计算机检索ETW提供程序名称的示例:

您可以使用
EventLogSession
类的其他构造函数指定远程计算机的备用凭据。
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()
的方法,该方法返回表示目标系统上可用ETW日志的
String
对象的集合。与
GetProviderNames()
方法类似,您可以在本地或远程计算机上调用
GetLogNames()

以下是从本地计算机检索ETW日志名称的示例:

$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventProviderNames = $EventSession.GetProviderNames();
$EventProviderNames;
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventLogNames = $EventSession.GetLogNames();
$EventLogNames;
$EventSession = New-Object -TypeName System.Diagnostics.Eventing.Reader.EventLogSession -ArgumentList server01.contoso.com;
$EventLogNames = $EventSession.GetLogNames();
$EventLogNames;
以下是从远程计算机检索ETW日志名称的示例:

$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventProviderNames = $EventSession.GetProviderNames();
$EventProviderNames;
$EventSession = [System.Diagnostics.Eventing.Reader.EventLogSession]::GlobalSession;
$EventLogNames = $EventSession.GetLogNames();
$EventLogNames;
$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提供程序元数据的示例:

# 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提供程序元数据,请在实例化
ProviderMetadata
类之前构建
EventLogSession
对象,并在实例化
ProviderMetadata
时,确保将以下参数传递给:

  • ETW提供程序名称
  • EventLogSession
    实例
  • 一个
    CultureInfo
    对象

注意:通过经过身份验证的连接实例化
ProviderMetadata
对象时,可能会出现一些异常:

新对象:使用“3”参数调用“.ctor”时发生异常:“试图” 执行未经授权的操作。”

读取ETW事件日志 由于您提到还希望从ETW事件日志中读取事件,因此这对于
System.Diagnostics.Eventing.Reader
.NET命名空间中的类型也很容易做到。
EventLogReader
类包含一个名为
ReadEvent()
的方法,该方法从
EventLogReader启动时指定的事件日志中连续读取下一个事件