gpt4 book ai didi

powershell - 如何使用 PowerShell 由现有提供程序编写自定义事件日志?

转载 作者:行者123 更新时间:2023-12-05 05:11:58 24 4
gpt4 key购买 nike

我试图找出“网络连接”事件日志消息中“状态”数据的名称/值映射:

Path = Microsoft-Windows-NetworkProfile/Operational
Source = NetworkProfile
Event ID = 10000

所以我想我会在更改消息的“状态”值的同时由同一提供者将自定义事件日志写入同一日志(路径),然后我可以在事件中看到该值的名称映射查看器。
例如,到目前为止我有这些值/名称映射:

1 --> 'Connected'
5 --> 'Connected, IPV4 (Local)'
9 --> 'Connected, IPV4 (Internet)'

我想知道其余的。

所以我尝试了 PowerShell 中的 New-WinEvent CmdLet 来写入日志:

New-WinEvent -ProviderName Microsoft-Windows-NetworkProfile -Id 10000 -Payload @("SSID","Description","{B58F86AB-F35D-4F73-A41E-98EA359E1D08}",0,1,0)

并且它被创建了,但是我传递给 -Payload 参数的最后 4 个参数没有生效。只有 {"name"= "SSID""Description"= "Description"} 出现在该事件中。最后 4 个参数无论我如何更改它们都保持固定值,而在执行此行时没有错误或警告,-Verbose 也没有显示任何内容。

Custom Event Details

我以所有可用的类型和值传递了这些参数(尤其是最后 3 个)。我什至将早期事件日志(不是我记录的)的参数传递给这个参数,怀疑我弄错了数据类型,但没有任何改变。

$a = ((Get-WinEvent -ProviderName Microsoft-Windows-NetworkProfile -MaxEvents 50  | Where-Object {$_.Id -eq 10000})[-1]).properties[3].value
$b = ((Get-WinEvent -ProviderName Microsoft-Windows-NetworkProfile -MaxEvents 50 | Where-Object {$_.Id -eq 10000})[-1]).properties[4].value
$c = ((Get-WinEvent -ProviderName Microsoft-Windows-NetworkProfile -MaxEvents 50 | Where-Object {$_.Id -eq 10000})[-1]).properties[5].value
New-WinEvent -ProviderName Microsoft-Windows-NetworkProfile -Id 10000 -Payload @("SSID","Description","{B58F86AB-F35D-4F73-A41E-98EA359E1D08}",$a,$b,$c)

然后我尝试了 Write-EventLog CmdLet:

Write-EventLog -LogName "Microsoft-Windows-NetworkProfile/Operational" -Source "NetworkProfile" -EventID 10000 -EntryType Information -Message $msg -Category 0

但我一直收到错误消息:Write-EventLog:源名称“NetworkProfile”在计算机“localhost”上不存在。 尽管该源确实存在并且它是“网络连接”的源' 日志,如您在屏幕截图中所见。

这 2 个 CmdLets 我做错了什么?

最佳答案

我设法让第一个 CmdLet New-WinEvent 工作。奇怪的是,这是一个数据类型问题。

“已连接网络”事件的消息需要 6 个参数。这些参数的预期类型可以在我从 PowerShell 得到的警告中看到

WARNING: Provided payload does not match with the template that was defined for event id 1000. The defined template is following:

NetworkProfile Template

我将 Guid 参数作为字符串传递,但它希望它具有 [System.Guid] 类型,显然 New-WinEvent<当您在数组中传递 -Payload 参数的 6 个参数时, 不会发出警告,即使其中一个参数的类型不正确也是如此。它只是用一些固定的默认参数创建一个新事件(就像我的问题中发生的那样)。

因此我必须将正确的类型转换为此参数 Guid。我从中得到了它的类型的名称:

$validEvent = (Get-WinEvent -ProviderName Microsoft-Windows-NetworkProfile -MaxEvents 500  | Where-Object {$_.Id -eq 10000} | Where-Object {$_.properties[4].Value -eq 9})[-1]
$validEvent.Properties[2].Value.GetType().FullName

Arguments Type

然后我将正确的类型转换为参数并将它们传递给 -Payload 并且它起作用了:

$name = 'SSID'
$desc = 'Description'
[System.Guid]$guid = "c48f86ab-f35d-4f73-a41e-99ea359e1d08"
[System.UInt32]$type = 1
[System.UInt32]$state = 63
[System.UInt32]$categ = 2

New-WinEvent -ProviderName Microsoft-Windows-NetworkProfile -Id 10000 -Payload @($name, $desc, $guid, $type, $state, $categ)

New-WinEvent Output

然后我可以更改 $state 的值以从 $newLog.Message 获取其名称映射。

但是,第二个 CmdLet Write-EventLog 没有工作;显然它不能由同一个提供者写入这个日志。

作为Max提到,此 CmdLet 只能写入“经典”事件日志,这就是它找不到 NetworkProfile 源的原因。

一路上帮助我的一些链接:

How to store an object in the Windows Event Log? [Answer]通过 Grady G Cooper

Writing to the event log in .NET - the right way

MSDN - Event Sources

TechNet - New-WinEvent

关于powershell - 如何使用 PowerShell 由现有提供程序编写自定义事件日志?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54933459/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com