【问题标题】:PowerShell, weird behaviour of Get-WinEvent -FilterHashTable ID and arraysPowerShell,Get-WinEvent -FilterHashTable ID 和数组的奇怪行为
【发布时间】:2019-03-04 13:16:03
【问题描述】:

我想做什么?

我使用-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.

为什么?

我做错了什么?

【问题讨论】:

    标签: arrays windows powershell get-winevent


    【解决方案1】:

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

    $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。看起来我必须实施一种解决方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多