■PsExecを使ってリモートから一括設定をする
PsExecはマイクロソフトが提供するリモートからコマンド実行するツールです。以下のサイトよりダウンロード、使い方を確認することができます。
TechNet PsExec
より詳しい説明は、@ITの記事がわかりやすいです。
@IT PsExecを使ってリモートのWindows PC上のプログラムを実行する
今回、Windows10の大量展開作業をする機会があり、
イメージ展開後、ホスト名とドメイン変更、各種設定をPsExecコマンドを使って
一括で変更しました。
その時に使ったコマンドと流れを少し紹介したいと思います。
■対象クライアントへの準備
PsExecで一括設定変更するにあたり、対象クライアントに対し、
あらかじめ設定が必要です。
・FW許可
Windows10ではパーソナルファイアウォールの設定で
以下の項目を許可しておく必要があります。
---------------------------------------------------------------------------------
Windowsパーソナルファイヤーウォール 受信規則
ファイルとプリンタの共有(エコー要求 ICMPv4受信)プライベート、パブリック
ファイルとプリンタの共有(エコー要求 ICMPv4受信)ドメイン
WindowsManagementInstrumentation(DCOM受信) プライベート、パブリック
WindowsManagementInstrumentation(DCOM受信)ドメイン
WindowsManagementInstrumentation(WMI受信) プライベート、パブリック
WindowsManagementInstrumentation(WMI受信)ドメイン
WindowsManagementInstrumentation(非同期受信) プライベート、パブリック
WindowsManagementInstrumentation(非同期受信)ドメイン
リモートサービス管理(NP受信) プライベート、パブリック
リモートサービス管理(NP受信) ドメイン
リモートサービス管理(RPC) プライベート、パブリック
リモートサービス管理(RPC) ドメイン
リモートサービス管理(RPC-EPMAP) プライベート、パブリック
リモートサービス管理(RPC-EPMAP) ドメイン
---------------------------------------------------------------------------------
・リモートUAC解除
Vista以降では、UACの登場により、
システム権限でのPsExec.exeを使ったリモート実行は
リモートUAC機能によって、うまく動作しません。
以下を実行してレジストリ変更し リモートUACを解除しておきます。
REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f
上記レジストリは、あくまでリモートUACの解除なので、
通常利用しているUACには影響しないようです。
■PsExec一括実行スクリプト
PsExecを使うことでリモートから1対1での作業は簡単にできますが、Windows10大量展開作業では設定する対象PCが多くあった為、
一括実行するスクリプトを用意しました。
マスタイメージに対して上記の準備設定をして イメージ展開をしています。
また管理者アカウントは同一のものとします。
仕組みとしては、list.txtに書かれたIPアドレスを対象PCとして、
指定したバッチファイルをリモートから実行するPowerShellスクリプトとなります。
list.txtに書かれているPCにPingを打ち、反応するもののみ対象とする処理としました。
---------------------------------------------------------------------------------
$path = "<list.txtや、実行したいバッチファイルを配置してあるPath>" cd $path $log = "$path\log\Exec.log" #logフォルダはあらかじめ用意しておいてください。 $txtname = "$path\list.txt" #リモート実行したいPCのIPアドレスリスト $filebat="$path\<実行バッチファイル>" #接続先PCで実行したいバッチ $u="<管理者アカウント>" $p="<パスワード>" $result = $null $result+=@(foreach($name in Get-Content $txtname){ #通信ができるものを選定 write-host $name 確認中 $ping = Test-Connection -ComputerName $name -Quiet -Count 1 if($ping -eq $true){ $name } }) if($result -eq $null){ "対象なし" exit } "対象" $result foreach($a in $result){ .\PsExec.exe -u $u -p $p -s \\$a /f /c $filebat | Tee-Object -FilePath $log -Append } read-host 処理終了します。Enter---------------------------------------------------------------------------------
PsExecの利点は、引数に-sをつけることで、
実行バッチファイルをシステム権限で、リモート先で実行できるところにあります。
これを使うことで、本来リモート実行に対応していないコマンドも
PsExecを経由して実行することが可能です。
1つ注意する点は、PsExecの動作仕様として
実行バッチファイルは対象先PCのC:\Windows直下にコピーされ、PsExecの処理が完了すると
自動で削除されます。
しかし、通信断などで途中で処理ができなくなった場合は、
バッチファイルがc:\Windows上に残ってしまうので注意が必要です。
なので作業した後は、C:\Windowsに不要ファイルが残っていないか、チェックするコマンドを流した方がよいと思います。
明日は、このスクリプトを使って、
ホスト名変更、ドメイン参加、各種設定を実施した方法をお伝えします。
スポンサーリンク