这似乎有效
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()
您可以找到list of SytemEvents in Microsoft documentation。
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
如果要能够区分Lock和Unlock,SessionSwitchEventHandler接收两个参数
- 事件的来源。
- SessionSwitchEventArgs 指示会话更改事件的类型。
SessionSwitchEventArgs 拥有一个属性Reason,它是一个枚举SessionSwitchReason,其值为:
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