有关ISE与带有SystemEvents的控制台的问题

时间:2019-04-14 20:31:59

标签: powershell events powershell-ise

当我在PowerShell ISE中运行以下命令时,它可以完美运行,这给了我“ AccountLock”或“ AccountUnlock”的原意。但是,当我在提升的Powershell控制台中运行此确切命令时,它根本不会在控制台中返回sessionswitch原因。解锁后不返回任何内容。

我同时检查了Get-EventSubscriberGet-Job,并且看起来都创建成功。 订阅者和工作的屏幕截图:

get-job and get-EventSuscriber calls

Register-ObjectEvent -InputObject $([microsoft.win32.systemevents]) -EventName "SessionSwitch" -Action {write-host $event.SourceEventArgs.Reason}

我想做的一件事是让Windows检测会话何时解锁(在用户将其密码与域同步后)并打开程序。

操作系统:Windows 10 版本:5.1内部版本17134 R 590

2 个答案:

答案 0 :(得分:2)

环顾四周后,我找不到使用[windows.win32.systemevents]的好方法,所以我联系了Lee Holmes。他说这是因为Powershell控制台主机默认在单线程单元(STA)模型中运行。如果您在MTA中运行它,则可以正常运行。

最简单的解决方法是在脚本的开头使用类似于此代码的代码,以确保您处于MTA模式,如果没有则启动新的Powershell进程并重新加载脚本。

if ([System.Threading.Thread]::CurrentThread.ApartmentState -ne [System.Threading.ApartmentState]::MTA)
{
    powershell.exe -MTA -File $MyInvocation.MyCommand.Path
    return
}

答案 1 :(得分:0)

请参阅Microsoft文档SystemEvents.SessionSwitch Event,似乎是因为此消息已发送到消息泵,这是处理图形消息的代码的一部分。您也许可以尝试在代码中使用隐藏形式来强制创建消息泵。

  

注意:

     

仅在消息泵正在运行时才引发此事件。在Windows服务中,除非使用隐藏表单或手动启动消息泵,否则不会引发此事件。有关显示如何通过Windows服务中的隐藏表单处理系统事件的代码示例,请参见SystemEvents类。