2016/12/06

PsExecを使用したクライアント一括設定 その1

この記事は SRA Advent Calendar 2016 参加記事です。


■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に不要ファイルが残っていないか、チェックするコマンドを流した方がよいと思います。

明日は、このスクリプトを使って、
ホスト名変更、ドメイン参加、各種設定を実施した方法をお伝えします。


スポンサーリンク

スポンサーリンク