Arrays PowerShell,Get-WinEvent-FilterHashTable ID和数组的奇怪行为 我想做什么?

Arrays PowerShell,Get-WinEvent-FilterHashTable ID和数组的奇怪行为 我想做什么?,arrays,windows,powershell,get-winevent,Arrays,Windows,Powershell,Get Winevent,我使用-FilterHashTable运行Get WinEvent函数,为ID参数提供一个有趣的事件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,476

我使用
-FilterHashTable
运行
Get WinEvent
函数,为
ID
参数提供一个有趣的事件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.
为什么?
我做错了什么?

我仍在尝试调查原因,但如果将管道变量强制到数组中,我可以让它工作。它已经是一个对象数组,但可能正在展开。这与显式调用元素时应该没有什么不同。我同意这很奇怪

$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)].

是的,它起作用了。几分钟前,我发现,
ID=$($)
也能完成这项工作。更让我头疼的是限制。在对数组中的23项进行了多次成功尝试后,它停止了工作。将限制降低到22有帮助。不知道这是从哪里来的,但限制肯定是浮动的:(我想知道这是否与生成的查询长度有关。可能在这一点上有一个上限。所以使用不同的id长度会影响这一点。无论如何,这种展开行为很奇怪。在写这个问题之前,我检查了
.GetType()
在传递的数组上,它总是返回相同的类型,无论上下文如何:)我今天遇到了这个问题,限制为22。看起来我必须实施一个变通方法。