首页 文章

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

提问于
浏览
9

我写了一些powershell,它允许我利用键盘媒体键的功能来控制当前正在运行的任何音乐 .

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

我的前两次尝试是:

1 - WMI事件注册

这是on lock事件

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

    尝试为锁定/解锁事件创建永久事件使用者 . 检查http://powerevents.codeplex.com并查看在http://www.ravichaganti.com/blog/?p=1951使用PowerEvents模块的示例

  • 0

    这似乎有效

    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
    

    如果您希望能够区分锁定和解锁, 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
    

相关问题