代码之家  ›  专栏  ›  技术社区  ›  jdgregson Mark

powershell:如何注销孤立的wmi事件

  •  2
  • jdgregson Mark  · 技术社区  · 6 年前

    以下代码块将生成100个wmi事件订阅。这种特殊情况只是一个例子,只要插入键盘,就会将字符串写入文件(100次):

    $KeyboardQuery = "SELECT * FROM __InstanceCreationEvent Within 1 WHERE TargetInstance ISA 'Win32_Keyboard'"
    for ($i = 0; $i -lt 100; $i++) {
        Register-WmiEvent -Query $KeyboardQuery -Action {
            "A keyboard was just inserted." >> ~\event-log.txt
        }
    }
    

    在powershell中执行时,进程 WmiPrvSE.exe 消耗30%-40%的CPU。如果随后执行以下操作,则删除事件订阅并 WMIPRVSEE.EXE 降低到正常的CPU使用率或完全关闭:

    Get-EventSubscriber | Unregister-Event
    

    一切如期而至。但是,如果在运行之前关闭了powershell窗口 Get-EventSubscriber | Unregister-Event , WMIPRVSEE.EXE 不退出,并继续消耗30%-40%的CPU。插入键盘后,字符串不再写入文件。如果打开新的powershell窗口, Get-EventSubscriber Get-EventSubscriber -Force 找不到事件订阅服务器。如果所有实例 WMIPRVSEE.EXE 强制关闭时,它们会重新启动并继续消耗30%-40%的CPU。 即使在注销和重新登录之后, WMIPRVSEE.EXE 继续消耗CPU。 我发现结束这些事件订阅的唯一方法是重新启动计算机。

    如何结束在以前的PoS壳会话中启动的事件订阅?

    更新


    我发现,孤立事件订阅的CPU使用可以通过触发他们订阅的事件来结束,即使在PultSek窗口已经关闭之后它们似乎没有在操作块中运行代码。在这种情况下,关闭powershell后插入键盘会导致 WMIPRVSEE.EXE 恢复正常的行为。这就像事件订阅在等待最后一次被触发之前被清理,但现在由WMI系统本身拥有。

    1 回复  |  直到 6 年前
        1
  •  0
  •   postanote    6 年前

    这是本问答的潜在副本。

    Unregister-Event not removing orphaned event subscriptions

    引用文章:

    我对计时器也有同样的问题。不知怎的,我把计时器留给了 在我的powershell会话中使用相同的sourceidentifier名称。每当我 会等我的10秒计时器,它总是会立即返回。

    我保存了等待事件的输出,并可以访问 事件标识符,它允许我通过 事件标识符。如果使用sourceidentifier,则无法访问 孤儿事件。我可以通过检查发现它是孤儿。 我的WaIT-Evest.Times的输出,它是旧的。你需要 能够通过eventidentifier访问孤立事件 独特的。

    邮政编码:

    $eventDone = "Done"
    $job2 = Register-ObjectEvent -InputObject $timer2 -EventName Elapsed -SourceIdentifier $eventDone
    
    $timer2.Interval = 10000;
    $timer2.AutoReset = $false;
    $timer2.Enabled = $true;
    
    $waitEvent = Wait-Event -SourceIdentifier $eventDone;
    # Look at the $waitEvent.TimeGenerated for a clue it is old
    # use the $waitEvent.EventIdentifier to access the event and remove it
    $orphanEventID = $waitEvent.EventIdentifier
    Remove-Event -EventIdentifier $orphanEventID