PowerShell, странное поведение Get-WinEvent -FilterHashTable ID и массивов - PullRequest
0 голосов
/ 28 сентября 2018

Что я хочу сделать?

Я запускаю функцию Get-WinEvent с -FilterHashTable, предоставляя массив интересных идентификаторов событий для аргумента ID.

$IDS = 4720,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4737,4738,4740,4741,4742,4743,4744,4745,4746,4747,4748,4749,4750,4751,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4767,4781

Get-WinEvent -ComputerName DC -FilterHashTable @{ LogName='Security'; ID=$IDS; }

Это вернулоошибка:

# Get-WinEvent : No events were found that match the specified selection criteria.

(и я знаю, что совпадающие события действительно существуют)

Я заметил, что при меньших массивах функция возвращала положительные результаты, и поэтому с небольшими попытками я 'мы утверждали это:

  • прямой вызов с подсчетом массива -le 23 работает правильно;
  • прямой вызов с подсчетом массива -gt 23 приводит к ошибке.

На первый взгляд правильное решение ...

Я предположил, что 23 - это недокументированный предел аргументов, которые могут обрабатывать базовые механизмы Get-WinEvent, а затем решил разделить вызов на несколько вызовов с меньшим массивом.:

$MaxCount = 23
For ( $i = 0; $i -lt $IDS.count; $i += $MaxCount ) { 
    $IDSChunks += ,@( $IDS[ $i..($i+$MaxCount-1) ] ) 
}

Таким образом, мы разбили массив на два, каждый насчитывает -le 23 элементов:

$IDSChunks | %{ $_ -join "," }
4720,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731,4732,4733,4734,4735,4737,4738,4740,4741,4742,4743,4744,4745
4746,4747,4748,4749,4750,4751,4752,4753,4754,4755,4756,4757,4758,4759,4760,4761,4762,4763,4764,4767,4781

Проверено вручную, и это сработало, как и ожидалось:

Get-WinEvent -ComputerName DC -FilterHashTable @{ LogName='Security'; ID=$IDSChunks[0]; }
Get-WinEvent -ComputerName DC -FilterHashTable @{ LogName='Security'; ID=$IDSChunks[1]; }

Но ...

Это, однако, не:

$IDSChunks | %{ Get-WinEvent -ComputerName DC -FilterHashTable @{ LogName='Security'; ID=$_; } }

И результаты с уже знакомой ошибкой:

# Get-WinEvent : No events were found that match the specified selection criteria.
# Get-WinEvent : No events were found that match the specified selection criteria.

Почему?

Что я делаю не так?

1 Ответ

0 голосов
/ 28 сентября 2018

Я все еще пытаюсь выяснить, почему, но я могу заставить это работать, если вы принудительно установите переменную конвейера в массив.Это уже массив объектов, но, возможно, он становится развернутым.Это не должно отличаться от того, когда вы вызывали элементы явно.Я согласен, что это нечетно

$IDSChunks | %{ Get-WinEvent -ComputerName dckan08ba -FilterHashTable @{ LogName='Security'; ID=@($_)} }

Добавление подробной поддержки переключателя, которая преобразуется в строку с разделителями пробелами.Это должно выглядеть так:

VERBOSE: Constructed structured query:
*[((System/EventID=4746) or (System/EventID=4747) or
(System/EventID=4748) or (System/EventID=4749) or (System/EventID=4750) or (System/EventID=4751) or
(System/EventID=4752) or (System/EventID=4753) or (System/EventID=4754) or (System/EventID=4755) or
(System/EventID=4756) or (System/EventID=4757) or (System/EventID=4758) or (System/EventID=4759) or
(System/EventID=4760) or (System/EventID=4761) or (System/EventID=4762) or (System/EventID=4763) or
(System/EventID=4764) or (System/EventID=4767) or (System/EventID=4781))].

Но вместо этого это выглядит так:

VERBOSE: Constructed structured query:
*[(System/EventID=4746 4747 4748 4749 4750 4751 4752
4753 4754 4755 4756 4757 4758 4759 4760 4761 4762 4763 4764 4767 4781)].
...