我想使用 Windows PowerShell 检索有关事件提供程序的信息?我正在运行带有 PowerShell 版本 4.0 的 Windows 8.1,并且我注意到有一些 .NET 类 System.Diagnostics.Eventing 名称空间 提供一些有关 Windows 事件的功能。

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

$EventProvider = New-Object -TypeName System.Diagnostics.Eventing.EventProvider -ArgumentList ([System.Guid]'{00000000-0000-0000-0000-000000000000}');

如何获取有关系统上安装的 Windows 事件跟踪 (ETW) 提供程序以及使用 Windows PowerShell 与 Windows 事件日志交互的更多信息?

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

有帮助吗?

解决方案

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

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

  • 查找计算机上安装的 ETW 提供程序的名称
  • 发现计算机上存在的 ETW 日志名称的完整列表
  • 枚举与 ETW 提供者相关的元数据
  • 导出事件日志数据

ETW 提供商名称

ETW 的核心功能之一是获取给定系统上安装的 ETW 提供程序的列表。您可以使用 .NET Framework 类型轻松检索此信息 System.Diagnostics.Eventing.Reader 命名空间。恰好有一个名为的 .NET 类 EventLogSession, ,并且该类上有一个名为的静态属性 GlobalSession, ,它会自动检索到本地计算机上的事件日志服务的会话/连接。如有必要,您也可以使用远程计算机上的构造函数之一连接到远程计算机。 EventLogSession 班级。

一旦你检索到一个实例 EventLogSession 类,你可以调用 GetProviderNames() 检索集合的方法 String 代表计算机上安装的 ETW 提供程序名称的对象。

以下是从本地计算机检索提供程序名称的示例:

$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 类需要以下参数:

  • 计算机名称
  • 域名
  • 用户名
  • 密码(作为 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(), ,它返回一个集合 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 班级。

以下是从本地系统检索 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, ,确保将以下参数传递给 构造函数:

  • ETW 提供商名称
  • EventLogSession 实例
  • A 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];

笔记:实例化时可能会遇到一些异常 ProviderMetadata 通过经过身份验证的连接的对象:

新对象:使用“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 班级, ,传入 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];

其他提示

# working in version 5
$providers = Get-WinEvent -ListProvider * | select name
$providers
.
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top