Запуск скрипта перед блокировкой компьютера в Windows - PullRequest
9 голосов
/ 04 мая 2011

Я написал несколько PowerShell, которые позволяют мне использовать возможности клавиш клавиатуры для управления любой музыкой, которая в данный момент работает.

Что я хочу сделать, так это запустить скрипт на случай блокировки компьютера. Так что я могу приостановить / остановить музыку. Затем, как только машина разблокирована, возобновите воспроизведение музыки. Круто да ?!

Мои первые 2 попытки были:

1 - регистрация события WMI

Это событие блокировки

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}

К сожалению, я думаю, что событие блокировки срабатывает слишком поздно, и в этот момент ОС по соображениям безопасности останавливает фоновое взаимодействие. Когда я разблокирую компьютер, он запускает заблокированные и разблокированные события.

2 - Использование планировщика задач «На рабочей станции заблокирован» триггер

Проблема, аналогичная описанной выше, но она также работает в другом контексте, поэтому не работает должным образом.

Кто-нибудь знает, как заставить скрипт работать до того, как система действительно заблокируется? То есть есть ли событие, которое я могу посмотреть, какие триггеры раньше?

Ответы [ 2 ]

8 голосов
/ 04 мая 2011

Это похоже на работу

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()

Список SytemEvents можно найти в документации Microsoft .

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 имеет одно свойство 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
0 голосов
/ 04 мая 2011

Попробуйте создать постоянного потребителя событий для событий блокировки / разблокировки.Проверьте http://powerevents.codeplex.com и посмотрите на пример использования модуля PowerEvents на http://www.ravichaganti.com/blog/?p=1951

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...