URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

PowerShellでスクリーンロックとログオフ(その2)

 やりたかったことは昨日のと同じこと。
 しかしながら、いざ使おうと思った環境では"LockApp"が動いていない?
 スクリーンロックの挙動が違うのでしょうか。この辺りの仕様はよく分かりません…。

 そこで、監視するプロセスを変えてみました。

 ロック/アンロックの判別に使うことにしたプロセスは"logonui"です。これはいわゆるログオン画面のプロセスですが、ロック時にも動くようです。
 おまじないとして、スクリプトの実行ユーザーもチェックすることにしました。

Param ( [Parameter(HelpMessage="Lock delay seconds")][alias("Lock","l")][Int]$LockSec = 0, [Parameter(HelpMessage="Shutdown delay seconds")][alias("Shutdown","s")][ValidateRange(30,86400)][Int]$LogoffSec = 60, [alias("Force","f")][Switch]$ForceFlag ) $ActionInt = 0 if ($ForceFlag) { $ActionInt = $ActionInt + 4 } $LockMethods = @' [return: MarshalAs(UnmanagedType.Bool)] [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] public static extern bool PostMessage(uint hWnd, uint Msg, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll", SetLastError = true)] public static extern bool LockWorkStation(); '@ $PwMgr = Add-Type -MemberDefinition $LockMethods -Name "PowerManager" -PassThru -Language CSharp Start-Sleep $LockSec $LockResult = $PwMgr::LockWorkStation() $ErrorActionPreference = "SilentlyContinue" $i = 10 Start-Sleep $i $User = Get-WmiObject -Class Win32_ComputerSystem | Select -ExpandProperty Username while ($i -lt $LogoffSec) { $Proc = Get-Process logonui if ($User -and $Proc) { # Lock Start-Sleep 1 $i++ } else { # Unlock Exit } } (Get-WmiObject -Class Win32_OperatingSystem -ComputerName .).Win32Shutdown($ActionInt) Exit

 "logonui"は通常は存在せず、ログオフやロックがかかっているときだけ起動してきます。なので、このプロセスの存在有無で識別しています。
 他は昨日のと同じ。

 いろいろ調べていますが、Windows 10のロック関連の挙動がいまいちよく分かっていません。