Как написать собственный журнал событий уже существующим поставщиком с PowerShell? - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь найти сопоставления имени / значения данных «Состояние» в сообщении журнала событий «Сетевое подключение»:

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

Итак, я решил написать пользовательскийЖурнал событий того же поставщика и того же журнала (путь) при изменении значения «Состояние» сообщения, тогда я вижу отображение имени этого значения в средстве просмотра событий.
Например, у меня есть эти значения/ Отображения имен на данный момент:

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

, и я хочу знать остальные из них.

Итак, я попытался New-WinEvent CmdLet в PowerShell для записи журналов:

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

И он был создан, но последние 4 аргумента, которые я передал параметру -Payload, не вступили в силу.Только {"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-EventLogCmdLet:

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

Но я продолжал получать сообщение об ошибке: Write-EventLog : The source name "NetworkProfile" does not exist on computer "localhost". Хотя источник существует и является источником журнала «Сетевое подключение», как вы можете видеть на скриншоте.

Что я делаю не так с этими 2 CmdLets?

1 Ответ

0 голосов
/ 02 марта 2019

Мне удалось заставить работать первый CmdLet New-WinEvent.Как ни странно, это была проблема с типом данных.

Событие «Сетевое соединение» ожидает 6 аргументов для своего сообщения.Ожидаемые типы для этих аргументов можно увидеть в этом предупреждении, полученном от PowerShell

ПРЕДУПРЕЖДЕНИЕ. Предоставленная полезная нагрузка не соответствует шаблону, который был определен для идентификатора события 41. Определенный шаблон следующий:

NetworkProfile Template

Я передавал аргумент Guid в виде строки, но он ожидает, что он будет иметь тип [System.Guid], и, очевидно, New-WinEvent не выдает предупреждений, когда вы передаете 6 аргументов параметра -Payload в массиве, даже если один аргумент не имеет правильного типа.Он просто создает новое событие с некоторыми фиксированными аргументами по умолчанию (например, что происходило в моей проблеме).

Поэтому мне пришлось привести правильный тип к этому аргументу 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.

Некоторые ссылки, которые мне помогли на этом пути:

Как сохранить объект в журнале событий Windows?[Ответ] от Грэди Дж Купер
Запись в журнал событий в .NET - правильный путь
MSDN - источники событий
TechNet - New-WinEvent

...