【PowerShell】AUtoITでスクリーンセーバーの設定を自動化する
会社のパソコンがスクリーンセーバー設定が義務になってまして、わざわざチェックしてる人がいるわけです。暇だなーとは思うわけですが、得てしてそういう人は鬼の首とったように「ルール違反だと」迫ってくるわけですよ。でも、プレゼンとかデモとかスクリーンセーバーが動いちゃ困る場面はあるわけで、そういう時だけスクリーンセーバーを外したい訳だけども、Windows10になっていよいよスクリーンセーバー設定はアクセスしづらい。「一定間隔でshiftキーを押す」スクリプトは見つかったんですが、あまりうまく動いているように見えない。
レジストリ書き換えれば良いのかなと思ったんですが、「反映に再起動」とか訳のわからないこと言うし、作ってみたら「ScreenSaverIsSecure」に1を入れたら今と反対の値になるだけだし、これ本当に運用して情報書いてるのかな?っていうものばかり。しょうがないのでGUI使って設定する方法に切り替えました。
使ったのは前にも記事にしたAutoIT。導入方法はこちらを参照してください。UiAutomationクラスでもできるという情報は入手したんですけど、.netオブジェクトを直接叩くのでこちらの方がまだ便利っぽい。(UiAutomationは残念ながら開発が止まったようです。)
完成したスクリプトがこちら
- AutoITを使って、引数SetTime(分)にスクリーンセーバー起動を設定します。
- 引数を変えれば、何分にでも設定可能です。
- $env:PSModulePathかスクリプトと同じフォルダにAutoITXフォルダが有ることを前提にしてます。スクリプトはC:¥scriptに保管してます。
Param(
[int]$SetTime = 5,
[int]$WaitTime = 1
)
function ImportMandatoryModule($ModuleName){
# for PS v3
if($PSVersionTable.PSVersion.Major -ge 3 ){$ScriptFolder = $PSScriptRoot}
# for PS v2
else{ echo $script:myInvocation.MyCommand.path
$ScriptFolder = (Split-Path ( & { $myInvocation.ScriptName } ) -parent)
}
$CurrentModulePath =Join-Path $ScriptFolder $ModuleName
if(Test-Path $CurrentModulePath){Import-Module $CurrentModulePath}else{Import-Module $ModuleName}
if($?){} #Write-Host "$ModuleName が使えるようになりました"
else{
Add-Type -Assembly System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show("$ModuleName が読み込めません。scriptフォルダか以下のフォルダのいずれかにコピーしてください`n$env:PSModulePath", "Module読み込みエラー")
Exit
}#End of &?
}# End of funcition ImportMandatoryModul
ImportMandatoryModule AUTOITX
# ScreenSaver設定の起動とハンドルキャッチ
$Title ="スクリーン セーバーの設定"
Start-Process control.exe -ArgumentList "desk.cpl,screensaver,@screensaver"
Wait-AU3Win -Title $Title
$winHandle = Get-AU3WinHandle -Title $Title
# Activate the window
Show-AU3WinActivate -WinHandle $winHandle
#待機時間のコントロールハンドルを取得し、値を入力
$controlHandle = Get-AU3ControlHandle -WinHandle $winHandle -Control "[CLASS:Edit; INSTANCE:1]"
Set-AU3ControlText -WinHandle $winHandle -ControlHandle $controlHandle -NewText "$SetTime"
#適用ボタンのコントロールハンドルを取得し、クリック
$controlHandle = Get-AU3ControlHandle -WinHandle $winHandle -Control "適用"
Invoke-AU3ControlClick -WinHandle $WinHandle -ControlHandle $controlHandle
Start-Sleep -s $WaitTime
#OKボタンのコントロールハンドルを取得し、クリック
$controlHandle = Get-AU3ControlHandle -WinHandle $winHandle -Control "OK"
Invoke-AU3ControlClick -WinHandle $WinHandle -ControlHandle $controlHandle
あとはPowershell.exeのリンクを作ってリンク先に引数を入力すればOK
5分にする
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File C:\script\SetScreenSaver.ps1
999分にする
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned -File C:\script\SetScreenSaver.ps1 -SetTime 999
リンクをデスクトップとかにおいておけばだいたいわかってくれると思います。

“【PowerShell】AUtoITでスクリーンセーバーの設定を自動化する” に対して1件のコメントがあります。