programa - Ejecutar un script antes de bloquear una computadora en Windows
programa para bloquear las actualizaciones de windows 10 (2)
Esto parece funcionar
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()
Puede encontrar la lista de SytemEvents en la documentación de 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.
Para cancelar el registro del evento
PS> Unregister-Event -SubscriptionId 1
Si desea poder distinguir Bloquear y Desbloquear, SessionSwitchEventHandler
recibe dos parámetros
- La fuente del evento.
- SessionSwitchEventArgs que indica el tipo de evento de cambio de sesión.
El propio SessionSwitchEventArgs
Reason
que es un valor enum SessionSwitchReason
, es:
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.
Ejemplo:
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
Si desea una lista de eventos suscritos, puede usar 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
He escrito algunos powershell que me permiten aprovechar la potencia de las teclas multimedia del teclado para controlar cualquier música que se esté ejecutando actualmente.
Lo que quiero poder hacer es ejecutar el script en caso de que la computadora esté bloqueada. Entonces puedo pausar / detener la música. Luego, una vez que la máquina esté desbloqueada, reanude la música. Genial, ¿eh?
Mis primeros 2 intentos han sido:
1 - Registro de eventos de WMI
Este es el evento de bloqueo
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}
Este es el evento de desbloqueo
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}
Lamentablemente, creo que el evento de bloqueo se dispara demasiado tarde, momento en el que el sistema operativo interrumpe la interacción de fondo por razones de seguridad. Cuando desbloqueo la computadora, se activan los eventos bloqueados y desbloqueados.
2 - Uso del programador de tareas Activador "En estación de trabajo bloqueada"
Problema similar al anterior, pero también se ejecuta en un contexto diferente, por lo que no funciona correctamente.
¿Alguien sabe cómo hacer que se ejecute un script antes de que el sistema realmente se bloquee? Es decir, ¿hay algún evento que pueda observar para el cual se active antes?
Intenta crear un consumidor de evento permanente para los eventos de bloqueo / desbloqueo. Consulte http://powerevents.codeplex.com y mire un ejemplo del uso del módulo PowerEvents en http://www.ravichaganti.com/blog/?p=1951