GUI インストールを自動化する

Windowsの管理者をしていると避けられないGUI Installerの作業を自動化するメモ

GUI Installer

何台もWindowsマシンを管理していると嫌なものの一つ、GUI Installer

Windows95からの悪弊ですが20年経っても根絶されません。

実機並べて並行作業しても、仮想マシンリモートログインしてもどれがどこまで終わったかわからなくなる。資源配布ソフト展開するまででもない台数のときは特に。ということでこれも自動化していきます。使うツールはPowerShell & AutoIT

AutoITの基本的な使い方はこちら

アンチウイルスソフトのインストール

題材は難易度の高かったSymantec Endpoint Protection(以下SEP)、アンチウイルスソフトの大手です。これをインストールして週1のスキャンスケジュールをセットするまでがお題です。

インストーラーを管理者権限で起動する

インストーラーはユーザアクセス制御により、システムへの変更を許可するかどうかを求められます。制御のレベルを低くするのは本末転倒なので他の手段を。

まずはPowerShellのコマンドから。

Start-Processに-Verb runAsオプションを付けると管理者権限で起動します。こんな感じ。

Start-Process .\SEP14RU2_64bit_CLT_setup.exe -Verb runAs

PowerShell自体が管理者権限で動いていると何も聞かれずに起動します。

PowerShellを右クリック→管理者として起動はちょっと悔しいので、作成したscriptをタスクスケジューラに登録して「最上位の権限で実行」のチェックを入れてやります。ユーザーログオン時に起動としておけば、自動で上がってきます。Windows自体にログオンする必要がありますがGUI操作にログオンが必要なのでこれは致し方ないです。

インストーラーを操作する

これはAutoITの基本操作なので、上方にもあるリンクをご覧ください。

気をつけることがいくつかあります。

同じウィンドウタイトルの画面を区別する

インストーラーの場合、「次へ」をクリックしてもウィンドウタイトルが同じことが良くあります。その場合、ウィンドウの中の文字列を指定してウィンドウを区別する必要があります。AutoITだと-Textオプションになります。

$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を送るには下記のようにします。

$Text ="インストールウィザードが完了しました"
Wait-AU3Win -Title $InstallerTitle -Text $Text
Show-AU3WinActivate -Title $InstallerTitle -Text $Text
Send-AU3ControlKey -Title $InstallerTitle -Text $Text -Key "!F"

上に関連するんですが、コントロールが変わるならこれを使えばいいんじゃないかとつい思ってしまいますが、ウィンドウに対して仮想キーを送るだけのコマンドなので送る時点ではコマンド成功となってしまいます。なので、どこから自動化が失敗しているのかわかりづらくなる原因になります。

インストール完了後のFinishボタンなど明確な所に留めておいたほうが(デバックの観点から)無難です。

設定画面を操作する

インストール済かどうか調べる

設定する前にインストール後の再起動が必要です。当然、そこでスクリプトが一旦終了します。

なので、最初にインストール済かどうか調べる必要があります。WmiObjectをつかいましょう。

$Symantec = Get-WmiObject -Class Win32_Product -Filter "Name='Symantec Endpoint Protection'" -ComputerName .
if ($null -eq $Symantec){
#処理内容を記述
}

具体的なインストール名はレジストリから一覧が出せます。

$Applications = Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |Sort-Object DisplayName |Export-CSV .\app.csv -Encoding Default -NoTypeInformation

インストール先を調べて起動する

多くのプログラムはインストール先を変えることができます。SEPの場合は変えなくてもパスの中にバージョン番号が含まれるので変動してしまいます💧インストール先がわかってるなら直接叩いてやるのが早いです。

Start-Process "C:\Program Files (x86)\Symantec\Symantec Endpoint Protection\14.2.5323.2000.105\Bin\SymCorpUI.exe" -Verb RunAs

インストール先が変動したり、バージョンが違ったりする場合はWmiオブジェクトからインストール先を引っ張ることができます。(ただ、遅いです)InstallLocationプロパティに入っています。

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でテキストを抽出できます。

$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オブジェクト もしくは レジストリ操作を併用して操作する

完成したスクリプト

完成した全体のスクリプトはこちら。参考まで。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください