GUIポチポチは卒業!Windowsキッティング自動化スクリプト入門【後編】

PC

製造業の情シス部門で奮闘する皆さん、こんにちは。

【前編】では、なぜ手作業のキッティングから脱却すべきなのかという背景と、バッチファイル・PowerShellを使った自動化の第一歩について解説しました。

【後編】では、1台の成功体験を「10台、100台の大量展開」へと引き上げるための、より高度で実践的なプロのテクニックを解説します。

キッティングの台数が増えると、必ず「途中で謎のエラーが起きて止まるPC」や「再起動のたびに手入力が必要になる場面」に直面します。ここをいかにスクリプトで乗り越え、完全な「無人化」を達成するかが、情シスエンジニアの腕の見せ所です。

トラブルシューティングを劇的に変える「ログ出力」

50台のPCにスクリプトを流し込んだ後、もし3台だけ特定のソフトが入っていなかったらどうしますか?1台ずつイベントビューアーを開いたり、手動で設定を見直したりするのは「地獄」です。

プロのスクリプトには必ず「ログ出力」の仕組みが組み込まれています。成否の記録をテキストファイルに残すことで、原因究明を数秒で終わらせるためです。

▼ログ出力機能とエラー検知のコード▼

PowerShell
function Write-Log {
param([string]$Message)
$DateTime = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$LogMessage = "[$DateTime] $Message"
Write-Host $LogMessage
$LogMessage | Out-File -FilePath "C:\Kitting_Logs\setup.txt" -Append -Encoding UTF8
}

try {
Write-Log "ソフトAのインストールを開始します。"
Start-Process -FilePath ".\setupA.exe" -ArgumentList "/S" -Wait -ErrorAction Stop
Write-Log "ソフトAのインストールに成功しました。"
} catch {
Write-Log "エラー発生:ソフトAのインストールに失敗しました。"
}

・使用例の解説: スクリプト内に Write-Log という独自の「ログ書き出し機能」を作り、それを各処理の節目で呼び出しています。 ・重要なポイント: try { ~ } catch { ~ } という構文を使うことで、「もし try の中でエラーが起きたら、処理を強制終了させずに catch の中身(エラーログの出力)を実行する」という安全な動きを作ることができます。これで「どこまで成功して、どこで失敗したか」がテキストファイルを見れば一目瞭然になります。

OSの制約をハックする「RunOnceレジストリ」

キッティングにおいて最大の壁となるのが「OSの再起動」です。 PC名の変更やActive Directoryドメインへの参加を行った後は、設定を反映させるために必ずPCを再起動しなければなりません。しかし、再起動するとそこでスクリプトの実行は途切れてしまいます。

これを解決するのが、Windowsのレジストリにある「RunOnce(ランワンス)」という仕組みです。ここにコマンドを登録しておくと、「次回のログオン時に、1回だけ自動でそのコマンドを実行」してくれます。

▼再起動後に続きを実行させるコード▼

PowerShell
$MyPath = $MyInvocation.MyCommand.Path
$Command = "powershell.exe -ExecutionPolicy Bypass -File "$MyPath" -Phase 2"

Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce" -Name "KittingPhase2" -Value $Command

Write-Log "フェーズ1終了。再起動します。"
Restart-Computer -Force

・使用例の解説: 現在実行している自分自身のスクリプトのパス($MyPath)を取得し、それに「-Phase 2」という目印(引数)を付けて、RunOnceレジストリに登録してから再起動をかけています。 ・重要なポイント: スクリプトの冒頭で「Phaseが1ならPC名を変更して再起動」「Phaseが2ならソフトのインストールをする」という条件分岐を書いておくことで、1つのスクリプトファイルで再起動を跨いだ一連の処理を実現できます。

誰も触らない完全無人化「AutoLogon(自動ログオン)」

RunOnceを仕込んで再起動を自動化しても、Windowsの「ログオン画面(パスワード入力画面)」で止まってしまっては、結局人が張り付いてキーボードを叩かなければなりません。

そこで、キッティング作業中だけ一時的に「自動ログオン」を有効化します。

▼自動ログオンを設定するコード▼

PowerShell
$RegPath = "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon"
Set-ItemProperty -Path $RegPath -Name "AutoAdminLogon" -Value "1"
Set-ItemProperty -Path $RegPath -Name "DefaultUserName" -Value "SetupUser"
Set-ItemProperty -Path $RegPath -Name "DefaultPassword" -Value "Password123"

・使用例の解説: Winlogonレジストリに、ログオンに使用する「ユーザー名」と「パスワード」をあらかじめ書き込み、AutoAdminLogonを「1(有効)」に設定しています。これで再起動後、パスワード入力なしで一気にデスクトップ画面まで進みます。 ・重要なポイント【※警告※】: この設定はレジストリにパスワードが平文(そのままの文字)で保存されるため、セキュリティ上非常に危険です。すべてのキッティング処理が終わる一番最後の行で、必ず Remove-ItemProperty を使ってこれらのレジストリ値を削除(またはAutoAdminLogonを0に)する処理を入れてください。この「後片付け」を徹底できるかどうかが、プロの情シスの倫理観です。

後編のまとめ

前編・後編にわたり、Windowsキッティング自動化のスクリプト技術を解説してきました。

・見えないエラーを可視化する「try-catch」と「ログ出力」 ・再起動の壁を越える「RunOnceレジストリ」 ・作業員の手を完全に離す「AutoLogon」の設定と確実な削除

これらを組み合わせれば、「USBを挿してバッチをダブルクリックし、あとはコーヒーを飲んで待っていれば、再起動も終えてすべての業務ソフトが入ったPCが完成している」という夢のような環境が構築できます。

最初から完璧なものを作る必要はありません。まずはファイルコピー1つ、ソフトのサイレントインストール1つから自動化を始め、徐々に自分だけの「秘伝のタレ(スクリプト)」を育てていってください。

そのスクリプトは確実に、あなた自身の業務時間を創出し、現場の安定稼働を支える強力な「資産」になります。応援しています!

コメント

タイトルとURLをコピーしました