none
Странное поведение скрипта с Get-WinEvent RRS feed

  • Вопрос

  • Здравствуйте. Тема не касается серверов, а пока только клиентских ОС.

    Имеем такой скрипт 

    Get-WinEvent -FilterHashtable @{LogName=”Security”;ID=4624} | Select TimeCreated, @{n=”LogonType”;e={([xml]$_.ToXml()).Event.EventData.Data | 
    ? {$_.Name -eq “LogonType”} | % {$_.'#text'} }} , @{n="TargetUserName";e={([xml]$_.ToXml()).Event.EventData.Data   |
    ? {$_.Name -eq "TargetUserName"}| %{$_.'#text'}}} , @{n="IpAddress";e={([xml]$_.ToXml()).Event.EventData.Data   |
    ? {$_.Name -eq "IpAddress"}| %{$_.'#text'}}} | ? {$_.LogonType -eq "10"} | select -first 1


    Он проверяет журнал windows, раздел безопасность, выбирает события с ID 4624 (вход в систему), а также выбирает события с LogonType 10 (вход по RDP), можете поставить там 2, это будет локальный вход.

    Проблема 1: на компах с windows 7 sp1 скрипт выбрав первое событие подходящее под условия не прекращает работу, а продолжает что-то упорно делать (пока не нажмешь стоп), видимо перебирая все все события в журнале, проверял на 2 разных компах - дома и на работе, на работе комп слабый, событий много, так и дождался конца, дома, с i5, заканчивает работу через ~30 СЕК. В тоже время на компах с win 10 (10.586) скрипт спокойно прекращает работу выбрав первое событие select -first 1 (первые 2,10,50). Однако, тут возникает еще менее понятная проблема.

    Проблема 2: На моем компе с windows 10 в выводе может отсутствовать часть инфы, просто вместо окончания дописывает 3 точки, на других компах пока не встречал такого поведения, выглядит так:

    TimeCreated        LogonType TargetUserName IpAddress
    -----------        --------- -------------- ---------
    26.07.2016 8:41:30    2         User            127.0.0.1
    26.07.2016 8:41:30    2         User            127.0.0.1
    25.07.2016 8:42:30    2         User            127.0.0.1
    25.07.2016 8:42:30    2         User            127.0.0.1
    24.07.2016 21:2...      2         DWM-3               -        
    24.07.2016 21:2...      2         DWM-3               -        
    24.07.2016 21:2...      2         DWM-2               -        
    24.07.2016 21:2...      2         DWM-2               -        
    22.07.2016 10:4...      2         User           127.0.0.1
    22.07.2016 10:4...      2         User           127.0.0.1


    Обратите внимание на время, оно съелось у последних 6 записей, такие фокусы могут быть и с IP адресом.

    Что происходит?



    • Изменено Serg .K 26 июля 2016 г. 8:21
    26 июля 2016 г. 7:32

Ответы

  • 1. Изменения работы в конвейере для командлета Select-Object изменено в PowerShell 3+. Т.к. в Windows 7 по умолчанию идет PowerShell 2, то все работает штатно. Обновляемся до WMF 5 на Windows 7  и смотрим результат.

    Командлет Get-WinEvent  поддерживает параметр -MaxEvents 1 , его и используйте.

    2. Тоже штатное поведение если не умещается в стандартные настройки косноли PowerShell. Используйте Format-Table -Auto или Format-List. Если не нравится правой кнопкой на шапке - Properties - Layout выставляем требуемые значения.

    • Предложено в качестве ответа Vector BCOModerator 26 июля 2016 г. 8:04
    • Помечено в качестве ответа Serg .K 26 июля 2016 г. 9:21
    26 июля 2016 г. 7:47
    Отвечающий
  • Использовать более четкий фильтр, а не Where-Object. Касательно примера, получить 10 событий с LogonType=10 и EventID=4624:
    Get-WinEvent -FilterXPath "*[System[EventID=4624] and EventData[Data[@Name='LogonType']=10]]" -LogName Security -MaxEvent 10

    • Помечено в качестве ответа Serg .K 26 июля 2016 г. 9:21
    26 июля 2016 г. 8:25
    Отвечающий

Все ответы

  • 1. Изменения работы в конвейере для командлета Select-Object изменено в PowerShell 3+. Т.к. в Windows 7 по умолчанию идет PowerShell 2, то все работает штатно. Обновляемся до WMF 5 на Windows 7  и смотрим результат.

    Командлет Get-WinEvent  поддерживает параметр -MaxEvents 1 , его и используйте.

    2. Тоже штатное поведение если не умещается в стандартные настройки косноли PowerShell. Используйте Format-Table -Auto или Format-List. Если не нравится правой кнопкой на шапке - Properties - Layout выставляем требуемые значения.

    • Предложено в качестве ответа Vector BCOModerator 26 июля 2016 г. 8:04
    • Помечено в качестве ответа Serg .K 26 июля 2016 г. 9:21
    26 июля 2016 г. 7:47
    Отвечающий
  • премного благодарен за разъяснения, по пункту 2: ft -AutoSize спасло, надо было сразу в файл попробовать вывести.

    по пункту 1: уже сам хотел использовать MaxEvents, но тогда проблема, этот параметр применяется к Get-WinEvent, а не к его выводу, в итоге отбирается первые n событий с кодом 4624, а потом они фильтруются, а надо смотреть все события, фильтровать, и когда их станет 10 остановиться. 

    в таком ключе не пойму как использовать MaxEvents. Можете что-то подсказать кроме установки WMF 5?

    26 июля 2016 г. 8:18
  • Использовать более четкий фильтр, а не Where-Object. Касательно примера, получить 10 событий с LogonType=10 и EventID=4624:
    Get-WinEvent -FilterXPath "*[System[EventID=4624] and EventData[Data[@Name='LogonType']=10]]" -LogName Security -MaxEvent 10

    • Помечено в качестве ответа Serg .K 26 июля 2016 г. 9:21
    26 июля 2016 г. 8:25
    Отвечающий

  • Нашел то о чем говорили выше:

    Beginning in Windows PowerShell 3.0, Select-Object includes an optimization feature that prevents commands from creating and processing objects that are not used. When you include a Select-Object command with the First or Index parameter in a command pipeline, Windows PowerShell stops the command that generates the objects as soon as the selected number of objects is generated, even when the command that generates the objects appears before the Select-Object command in the pipeline. To turn off this optimizing behavior, use the Wait parameter.

    Но я решил с этим не заморачиваться, завтра попробую поставить wmf 5.

    Также пока писал новый вопрос сам и разобрался) не мог понять почему и как там используются хэш-таблицы, ответ в документации

    Select-Object

    -Property<Object[]>

    Specifies the properties to select. Wildcards are permitted.

    The value of the Property parameter can be a new calculated property. To create a calculated, property, use a hash table. Valid keys are:

    -- Name (or Label) <string>

    -- Expression <string> or <script block>



    • Изменено Serg .K 27 июля 2016 г. 20:03
    27 июля 2016 г. 20:01