获取Windows事件提供者信息

2024-01-30

我想使用 Windows PowerShell 检索有关事件提供程序的信息?我正在运行带有 PowerShell 版本 4.0 的 Windows 8.1,并且我注意到有一些 .NET 类System.Diagnostics.Eventing名称空间 http://msdn.microsoft.com/en-us/library/system.diagnostics.eventing%28v=vs.110%29.aspx提供一些有关 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, as 此处描述 http://support.microsoft.com/kb/2593157,检索 ETW 提供程序列表,并查询 Windows 事件日志,但这对 PowerShell 不太友好。


还有另一个 .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];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取Windows事件提供者信息 的相关文章

  • 将 Powershell 输出转换为 Markdown 文件

    我有以下代码 xmlFile C Users kraer Desktop bom xml xml xml Get Content xmlFile xml bom components component ForEach Object fin
  • 使 .net web api 队列请求以“单线程”方式运行

    我们有一个 c net Web API 服务调用代码 该代码无法一次处理多个数据库请求 该系统适用于需求相对较小的账单在线支付 我们无法控制代码来进行可以解决问题的更改 另一个使用相同代码的小组使用 WCF API 和服务配置将并发请求限制
  • 如何在 wpf 应用程序的代码隐藏中创建集合视图源

    我有以下代码 public partial class MainWindow Window public MainWindow InitializeComponent var entities new DemoEntities var de
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • 使用 NServiceBus FileShareDataBus 时清理文件

    我在 NServiceBus 3 中使用 FileShareDataBus 是否支持清理数据总线文件 如果不是 实现此目的的最佳实践是什么 例如如何确保该文件不是错误队列中消息的一部分 鉴于不可能知道消息在错误队列中停留多长时间 我通常会在
  • 什么可以解释托管堆上超过 5,000,000 个 System.WeakReference 实例?

    我一直在针对生产 ASP NET Web 应用程序运行负载测试 并且看到在堆上创建了大量 System WeakReference 在大约 15 分钟内 负载管理堆内存已飙升至大约 3GB 并且我有大约 5 000 000 个对 Syste
  • .Net应用程序设置路径

    默认情况下 Windows 应用程序设置保存在该目录中 USERPROFILE Local Settings Application Data
  • WPF 中的调度程序和异步等待

    我正在尝试学习 WPF C 中的异步编程 但我陷入了异步编程和使用调度程序的困境 它们是不同的还是在相同的场景中使用 我愿意简短地回答这个问题 以免含糊不清 因为我知道我混淆了 WPF 中的概念和函数 但还不足以在功能上正确使用它 我在这里
  • 线程睡眠和Windows服务

    我正在开发一个 Windows 服务 该服务存在一些问题Thread Sleep 所以我想我会尝试使用计时器 因为这个问题建议 在 Windows 服务中使用 Thread Sleep https stackoverflow com que
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • 变量替换为字符串

    我可以做类似的事情吗 s said s blah name blah 在 VB NET 中 写字越来越痛苦name said blah blah 在VB NET 14 对于VS2015 中 您可以使用字符串插值 https msdn mic
  • 是否有 .NET 库或 API 可以与 IIS 配置数据库交互/编辑它?

    或者我是否坚持使用自己的 XML 切割 功能 我想创建一个小型任务托盘应用程序 以便我可以快速将虚拟目录重新指向硬盘上的几个文件夹之一 一点背景 我的开发机器上的代码库有 3 个不同的 svn 分支 Current Production B
  • Windows DPAPI - 如何处理熵?

    我正在使用 Windows DPAPI 来加密一些敏感数据 密码存储在注册表中 这一切都运行良好 但我想知道是否有人可以澄清我对 NET 中 可选 提供给 ProtectedData Protect 的 熵 字节的理解 熵 字节数组似乎类似
  • WUApiLib IUpdateInstaller2 产生错误;某些操作系统更新安装其他操作系统会抛出 HResult -2145124318

    更新是从本地服务器下载的 而不是从 WUS 或 Microsoft 存储库下载的 本地服务器基于 Linux 该主机包含每次更新的内容 我没有使用UpdateDownloader要从Microsoft服务器下载 我手动下载更新内容 然后使用
  • 即使进程确实存在,为什么 Process.WaitForExit 也会抛出“无进程”异常?

    我有一个包含以下代码的 Windows 服务 public static void ExtractTextInner string source string destination ProcessStartInfo startInfo n
  • 如何使用 NGEN 二进制文件安装 IronPython 2.0?

    有谁知道如何使用 MSI 包安装带有 NGEN 二进制文件的 IronPython 2 0 这IronPython 官方主页 http www codeplex com IronPython据说NGEN选项将大大改善启动时间 但由于某种原因
  • WPF DataGrid 验证/绑定模式错误

    我创建了一个非常简单的新项目 仅测试 Microsoft WPF DataGrid 行为 不涉及其他 我只使用标准的 DataGrid
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件

随机推荐