| Works
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のロック関連の挙動がいまいちよく分かっていません。