#powershell #parsing
#powershell #синтаксический анализ
Вопрос:
Знакомство с PowerShell, столкновение с множеством проблем (недостаток знаний).
Я пытаюсь перечислить зарегистрированные события в журнале безопасности Windows по количеству, но я мог бы также использовать «дружественное» поле описания, которое является первой строкой свойства «Message». Я не могу найти способ извлечь только это.
Таким образом, я запускаю следующее, чтобы получить обзор событий:
PS C:TEST> Get-WinEvent -FilterHashtable @{logname="security"}| Group-Object id -NoElement | sort count
Count Name
----- ----
1 4724
1 4722
1 1102
1 4725
2 4718
2 6408
2 4739
2 1101
2 5038
2 4737
3 4717
4 6407
4 4731
10 4738
16 1100
19 4781
22 4904
22 4905
35 6406
38 5033
38 5024
39 4826
39 4608
39 4902
40 4735
113 4647
156 4616
239 5059
355 4688
551 4733
557 4732
605 4797
965 5061
977 5058
1647 4798
6364 4907
6759 4634
7000 4648
10950 4799
19407 4672
22049 4624
Но я хочу включить столбец «Описание / сообщение», чтобы показать, чему соответствует каждый идентификатор события. Например, для идентификатора события Message
свойство содержит следующее значение (?):
An attempt was made to reset an account's password.
Subject:
Security ID: S-1-5-18
Account Name: [EDITED]
Account Domain: [EDITED]
Logon ID: 0x3E7
Target Account:
Security ID: [EDITED]
Account Name: Administrator
Account Domain: [EDITED]
Из всего этого сообщения я бы хотел извлечь только следующую строку:
An attempt was made to reset an account's password.
Таким образом, возвращаясь к моему первоначальному представлению, в идеале это должно показывать следующее:
Count Name Message
----- ---- ----
1 4724 An attempt was made to reset an account's password.
1 4722 A user account was enabled.
1 1102 The audit log was cleared.
(...)
Комментарии:
1. Значит, вам придется перебирать группы с помощью foreach, получать сообщение от первого элемента группы, разбивать его на
"
r?n"
и выводит только первую строку.
Ответ №1:
Попробуйте это:
$Events = Get-WinEvent -FilterHashtable @{logname="security"} | Group-Object id
$Events | Select-Object Count,Name,@{Name='Message';Expression={ (($_.Group.Message | Select -First 1) -Split "`n")[0] }} | Sort-Object Count -Descending | Format-Table -Wrap
Работает путем удаления -NoElement
параметра Group-Object
, чтобы мы получили возвращаемый Group
результат, из которого затем мы можем извлечь первую строку свойства message.
Мы используем Select-Object
для добавления вычисляемого свойства к результату, который содержит сообщение.
Также используется Format-Table -Wrap
, поэтому при просмотре конечного вывода первая строка не обрезается, если она длинная.
Пример вывода:
Count Name Message
----- ---- -------
81 4798 A user's local group membership was enumerated.
13 5379 Credential Manager credentials were read.
5 5061 Cryptographic operation.
1 5058 Key file operation.
Комментарии:
1. Это золото! Мне нужно лучше понять часть выражения
(($_.Group.Message | Select -First 1) -Split "
n»)[0]` Вы выбираете для каждого объекта$_
Group.Message
свойство, затем после этого вы получаетеselect
первый объект (?) иsplit
он основан на новой строке, верно? Что[0]
делает? Я предполагаю, что он выбирает 1-ю строку (начиная с 0)? У меня будут дополнительные вопросы, в идеале я хотел бы разделить всеmessage
свойство на основе его содержимого, например, объекта key / value для каждого идентификатора события…2. Да, поскольку
Group.Message
это был бы массив сообщений от всех событий в этой группе, мы используемSelect -First 1
только для получения первого. Затем-split
оператор возвращает массив строк, поэтому мы используем[0]
для возврата первого элемента этого массива (количество массивов начинается с 0).3. Вы можете использовать
Get-Member
для изучения свойств объектов: learn.microsoft.com/en-us/powershell/scripting/samples/… Иногда полезно также просто передать объект вFomat-List *
, чтобы получить представление обо всех свойствах и их содержимом (по крайней мере, на первом уровне). Попробуйте$_ | Format-List *
4. KevMar делает очень хорошие глубокие погружения. Попробуйте это: powershellexplained.com /…
5. Еще раз спасибо! Это именно то, что я пытался найти и понять (исходя из bash, где материал не был объектом)! Я не мог понять, как перечислить доступные мне свойства, теперь я знаю отсюда: powershellexplained.com/… Я могу разбить события на:
$event4672 = Get-WinEvent -FilterHashtable @{logname="security";id=4672} -MaxEvents 1
и$event4672 | gm -MemberType Properties
и, наконец$event4672.Properties
, таким образом, я теперь понимаю, откуда берутся значения для индексов$event4672.Properties[0]
.