当我在PowerShell ISE中运行以下命令时,它可以完美运行,这给了我“ AccountLock”或“ AccountUnlock”的原意。但是,当我在提升的Powershell控制台中运行此确切命令时,它根本不会在控制台中返回sessionswitch原因。解锁后不返回任何内容。
我同时检查了Get-EventSubscriber
和Get-Job
,并且看起来都创建成功。
订阅者和工作的屏幕截图:
Register-ObjectEvent -InputObject $([microsoft.win32.systemevents]) -EventName "SessionSwitch" -Action {write-host $event.SourceEventArgs.Reason}
我想做的一件事是让Windows检测会话何时解锁(在用户将其密码与域同步后)并打开程序。
操作系统:Windows 10 版本:5.1内部版本17134 R 590
答案 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类。