GUI インストールを自動化する
Windowsの管理者をしていると避けられないGUI Installerの作業を自動化するメモ
目次
GUI Installer
何台もWindowsマシンを管理していると嫌なものの一つ、GUI Installer
Windows95からの悪弊ですが20年経っても根絶されません。
実機並べて並行作業しても、仮想マシンリモートログインしてもどれがどこまで終わったかわからなくなる。資源配布ソフト展開するまででもない台数のときは特に。ということでこれも自動化していきます。使うツールはPowerShell & AutoIT
AutoITの基本的な使い方はこちら
アンチウイルスソフトのインストール
題材は難易度の高かったSymantec Endpoint Protection(以下SEP)、アンチウイルスソフトの大手です。これをインストールして週1のスキャンスケジュールをセットするまでがお題です。
(Symantec社の名誉のために言うと、自動配信の仕組みは存在します。手順書とインストーラーだけ配るウチの会社がオカシイのです。)
インストーラーを管理者権限で起動する
インストーラーはユーザアクセス制御により、システムへの変更を許可するかどうかを求められます。制御のレベルを低くするのは本末転倒なので他の手段を。
まずはPowerShellのコマンドから。
Start-Processに-Verb runAsオプションを付けると管理者権限で起動します。こんな感じ。
1 |
<span class="pl-c1">Start-Process</span> .\<span class="pl-c1">SEP14RU2_64bit_CLT_setup.exe</span> <span class="pl-k">-</span>Verb runAs |
PowerShell自体が管理者権限で動いていると何も聞かれずに起動します。
PowerShellを右クリック→管理者として起動はちょっと悔しいので、作成したscriptをタスクスケジューラに登録して「最上位の権限で実行」のチェックを入れてやります。ユーザーログオン時に起動としておけば、自動で上がってきます。Windows自体にログオンする必要がありますがGUI操作にログオンが必要なのでこれは致し方ないです。
インストーラーを操作する
これはAutoITの基本操作なので、上方にもあるリンクをご覧ください。
気をつけることがいくつかあります。
同じウィンドウタイトルの画面を区別する
インストーラーの場合、「次へ」をクリックしてもウィンドウタイトルが同じことが良くあります。その場合、ウィンドウの中の文字列を指定してウィンドウを区別する必要があります。AutoITだと-Textオプションになります。
1 2 3 |
$InstallerTitle = "Symantec Endpoint Protection" $Text ="インストールウィザードはコンピュータに Symantec Endpoint Protection をインストールします。続行するには[次へ]をクリックします。" Wait-AU3Win -Title $InstallerTitle -Text $Text |
Wait-AU3Winは指定したウィンドウが表示されるのを待機する命令です。
タイムラグに備える
圧縮ファイルを展開したりファイルを検証したり、ウィンドウが表示されてからクリックできるようになるまでにタイムラグがあります。また、通常操作でも画面描画のラグがあります。実機が目の前にある対話ログオンで1−2秒1、リモート接続で3秒ぐらいクリックの前に入れておくと安全です。どのRPAツールでも似たようなものらしいです。
SEPの場合は起動してファイルの検証が入るので10秒ほど入れました。
選択したオプションによって画面が変わることがある
オプション指定すると画面が切り替わってボタン表示が変わることがあります。SEPではボタンのコントロール番号が変わることもあるようです。選択したいオプションをクリックしてからコントロール番号を調べましょう。
ショートカットキーの使い所に気をつける
Alt+N(次へ)、Alt+I(インストール)、Alt+F(完了)などショートカットキーが頻繁に登場します。Altは”!”をコントロールに送ることで実現できます。完了画面にAlt+Fを送るには下記のようにします。
1 2 3 4 |
$Text ="インストールウィザードが完了しました" Wait-AU3Win -Title $InstallerTitle -Text $Text Show-AU3WinActivate -Title $InstallerTitle -Text $Text Send-AU3ControlKey -Title $InstallerTitle -Text $Text -Key "!F" |
上に関連するんですが、コントロールが変わるならこれを使えばいいんじゃないかとつい思ってしまいますが、ウィンドウに対して仮想キーを送るだけのコマンドなので送る時点ではコマンド成功となってしまいます。なので、どこから自動化が失敗しているのかわかりづらくなる原因になります。
インストール完了後のFinishボタンなど明確な所に留めておいたほうが(デバックの観点から)無難です。
設定画面を操作する
インストール済かどうか調べる
設定する前にインストール後の再起動が必要です。当然、そこでスクリプトが一旦終了します。
なので、最初にインストール済かどうか調べる必要があります。WmiObjectをつかいましょう。
1 2 3 4 |
$Symantec = Get-WmiObject -Class Win32_Product -Filter "Name='Symantec Endpoint Protection'" -ComputerName . if ($null -eq $Symantec){ #処理内容を記述 } |
具体的なインストール名はWmiオブジェクトの一覧を出力しましょう。
1 2 |
Log = "C:\log\" Get-WmiObject -Class Win32_Product |Export-CSV (Join-path $Log w32_product.csv) -Encoding Default -NoTypeInformation |
インストール先を調べて起動する
多くのプログラムはインストール先を変えることができます。SEPの場合は変えなくてもパスの中にバージョン番号が含まれるので変動してしまいます💧インストール先がわかってるなら直接叩いてやるのが早いです。
1 |
Start-Process "C:\Program Files (x86)\Symantec\Symantec Endpoint Protection\14.2.5323.2000.105\Bin\SymCorpUI.exe" -Verb RunAs |
インストール先が変動したり、バージョンが違ったりする場合はWmiオブジェクトからインストール先を引っ張ることができます。(ただ、遅いです)InstallLocationプロパティに入っています。
1 |
Start-Process (Join-Path (Get-WmiObject -Class Win32_Product -Filter "Name='Symantec Endpoint Protection'" -ComputerName . ).InstallLocation "Bin\SymCorpUI.exe") -Verb RunAs |
動的に生成されるボタンをクリックする
設定画面は動的に生成されるようで、ボタンのコントロール番号が一定しません。スキャンを設定するために「脅威のスキャン」にクリックを贈ろうとすると、Button2かButton8のどちらかになるようでうまく動きません。
そこで、各コントロールのテキストを取り出して「脅威のスキャン」になっている番号を取り出します。AutoITだとGet-AU3ControlTextでテキストを抽出できます。
1 2 3 4 5 |
$i = 1 for($i;$i -le 12;$i++){$Value = Get-AU3ControlText -Title $Title -Control "[CLASS:Button; INSTANCE:$i]" if($Value -eq "脅威のスキャン"){break} } Invoke-AU3ControlClick -Title "状態 - Symantec Endpoint Protection" -Control "[CLASS:Button; INSTANCE:$i]" |
ComboBoxを操作する
ウィルススキャンはそんな毎日しなくても週イチくらいでいいと思ってます。で、スキャン単位を週にすると何曜日にするかComboBoxで聞かれます。
別記事にしてあるんで、詳細はそちらをご覧ください。
まとめ
- 実際にインストーラーを動かして操作するオブジェクトのコントロールを調べる
(2−3台は実際に入れてやらないとデバッグが終了しないので、10台以上じゃないとペイしないと思う) - Wmiオブジェクト もしくは レジストリ操作を併用して操作する
完成したスクリプト
完成した全体のスクリプトはこちら。参考まで。
“GUI インストールを自動化する” に対して1件のコメントがあります。