PowerShell Get-WinEvent отображает только первую строку свойства Message?

#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] .