在Windows上locking计算机之前运行脚本

我已经写了一些PowerShell允许我利用键盘媒体键的力量来控制当前正在运行的任何音乐。

我想要做的是在计算机被locking的情况下运行脚本。 所以我可以暂停/停止音乐。 然后一旦机器解锁,恢复音乐。 酷啊?

我的第2次尝试是:

1 – WMI事件注册

这是locking事件

Register-wmievent –query "Select * from __instancecreationevent within 1 where TargetInstance isa 'Win32_NTLogEvent' And TargetInstance.EventCode = 4800" -Action {write-host "Pausing`r`n"; set-playpausetrack} 

这是解锁事件

 Register-wmievent –query "Select * from __instancecreationevent within 1 where TargetInstance isa 'Win32_NTLogEvent' And TargetInstance.EventCode = 4801" -Action {write-host "Resuming`r`n"; set-playpausetrack} 

不幸的是,我认为locking事件太晚了,出于安全原因,操作系统会暂停后台交互。 当我解锁电脑时,它会触发locking和解锁事件。

2 – 使用任务计划程序“在工作站locking”触发器

类似的问题上面,但它也运行在不同的上下文,所以不能正常工作。

有谁知道如何让脚本在系统实际locking之前运行? 也就是说有一个事件我可以看到之前触发的事件吗?

Solutions Collecting From Web of "在Windows上locking计算机之前运行脚本"

这似乎工作

 PS> $sysevent = [microsoft.win32.systemevents] PS> $sysevent IsPublic IsSerial Name BaseType -------- -------- ---- -------- True False SystemEvents System.Object PS> Register-ObjectEvent -InputObject $sysevent -EventName "SessionSwitch" -Action {[console]::Beep()} Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 1 fa48b95f-299... NotStarted False [console]::Beep() 

您可以在Microsoft文档中找到SytemEvents的列表 。

 DisplaySettingsChanged Occurs when the user changes the display settings. DisplaySettingsChanging Occurs when the display settings are changing. EventsThreadShutdown Occurs before the thread that listens for system events is terminated. InstalledFontsChanged Occurs when the user adds fonts to or removes fonts from the system. LowMemory Occurs when the system is running out of available RAM. PaletteChanged Occurs when the user switches to an application that uses a different palette. PowerModeChanged Occurs when the user suspends or resumes the system. SessionEnded Occurs when the user is logging off or shutting down the system. SessionEnding Occurs when the user is trying to log off or shut down the system. SessionSwitch Occurs when the currently logged-in user has changed. TimeChanged Occurs when the user changes the time on the system clock. TimerElapsed Occurs when a windows timer interval has expired. UserPreferenceChanged Occurs when a user preference has changed. UserPreferenceChanging Occurs when a user preference is changing. 

注销事件

 PS> Unregister-Event -SubscriptionId 1 

如果你想能够区分锁定和解锁, SessionSwitchEventHandler接收两个参数

  1. 事件的来源。
  2. SessionSwitchEventArgs指示会话更改事件的类型。

SessionSwitchEventArgs拥有一个属性,它是一个枚举SessionSwitchReason值的Reason是:

 ConsoleConnect A session has been connected from the console. ConsoleDisconnect A session has been disconnected from the console. RemoteConnect A session has been connected from a remote connection. RemoteDisconnect A session has been disconnected from a remote connection. SessionLogon A user has logged on to a session. SessionLogoff A user has logged off from a session. SessionLock A session has been locked. SessionUnlock A session has been unlocked. SessionRemoteControl A session has changed its status to or from remote controlled mode. 

例如:

 PS> Register-ObjectEvent -InputObject $sysevent -EventName "SessionSwitch" -Action {[console]::Beep();Write-Host ($args[1]).Reason} Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 9 20e6ecd4-fc0... NotStarted False [console]::Beep();fore... PS > SessionLock SessionUnlock 

如果你想要一个事件列表,你可以使用Get-EventSubscriber

 SubscriptionId : 5 SourceObject : Microsoft.Win32.SystemEvents EventName : SessionSwitch SourceIdentifier : 96fbabe4-518a-47b5-8a3f-bb89c68f7f39 Action : System.Management.Automation.PSEventJob HandlerDelegate : SupportEvent : False ForwardEvent : False