2016/12/07

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

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

昨日は、PsExecを使ってlist.txtに記述したIPアドレスのPCを対象に
バッチを実行するスクリプトを紹介しました。

今回はマスタイメージを展開した後、
実際にホスト名、ドメイン参加を一斉に実行した方法を紹介します。



■ホスト名変更

ホスト名を変更するにあたり、
MACアドレスとホスト名を紐づけたCSVファイルをあらかじめ用意します。

・maclist.csv (サンプル)
------------------------------------------------------------
MAC,HOST
AA-BB-CC-DD-EE-FF-GG,host1
HH-II-JJ-KK-LL-MM-NN,host2

------------------------------------------------------------

前回紹介したスクリプトから、少し手を加え
MACアドレスを参照し バッチを実行するPowerShellを用意しました。

■一括展開用 PowerShellスクリプト MACアドレス確認版
---------------------------------------------------------------------------------
$path = "<list.txtや、実行したいバッチファイルを配置してあるPath>"
cd $path

$log = "$path\log\domainadd.log" #logフォルダはあらかじめ用意しておいてください。
$txtname = "$path\list.txt" #リモート実行したいPCのIPアドレスリスト
$filebat="$path\<実行バッチファイル>" #接続先PCで実行したいバッチ
$maclist=@(Get-Content $path\maclist.csv | ConvertFrom-Csv) #ホスト名とMACアドレスが紐づいているリスト
$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){
    $b=getmac /s $a /u $u /p $p
    $flag="0"
    $maclist | %{
        if($b -match "$($_.mac)"){
            $flag="1"
            .\PsExec.exe -u $u -p $p -s \\$a /f /c $filebat $_.mac $a $_.host | Tee-Object -FilePath  $log -Append        
        }
    }
    if($flag -eq "0") {
        read-host $a はMACアドレスリストに存在しません
    } 
}

read-host 処理終了します。Enter

---------------------------------------------------------------------------------

ポイントは、getmacコマンドを使い対象PCのMACアドレスを確認した上で、
maclist.csvに書かれてあるホスト名を引数を渡す点にあります。

以下はホスト名変更のバッチ例です。

■ホスト名変更バッチ
---------------------------------------------------------------------------------
@echo off
echo %1
echo %2
echo %3
echo ---
hostname
echo ---

if not '%computername%'=='%1' (
    echo ホスト名変更します。実行はEnter
    pause

    wmic computersystem where name="%computername%" call rename name="%3"
    echo Return Valueが0の場合成功。それ以外は失敗
    echo 設定を完了するには再起動が必要です。キーを押すと再起動が始まります。
    pause
    shutdown -r -t 0 

) else (
    echo ホスト名は正しいです。
    pause
)
---------------------------------------------------------------------------------

通常、ホスト名変更を行う場合、UACによるシステム権限が必要ですが
前回紹介したリモートUACの解除により、PsExecに引数-sをつけることで
System権限での実行が可能となり、ホスト名変更させることができます。
ちなみに-sをつけずに実行した場合は、
System権限を持っていないためRetturn Valueの値が5となりホスト名は変更されません。

実際実行すると、以下のような動作になります。

list.txtに記述されてあるIPを参照して、疎通できるもののみを対象とする

MACアドレスに応じて、ホスト名変更。完了後再起動し、順次対象PCに対し処理が進む

■ドメイン参加

PsExec一括スクリプトに関しては特に変更ありません。
実行バッチファイルを以下のものに差し替え、実行することで対象PCをドメイン参加させることができます。

■ドメイン参加バッチ
---------------------------------------------------------------------------------
@echo off
hostname
echo ドメイン参加します
echo Enterを押してください
pause
wmic ComputerSystem WHERE "name='%computername%'" CALL JoinDomainOrWorkgroup Name="<ドメイン名>" Password="<ドメインパスワード>" Username="<ドメインアカウント>" FJoinOptions=3
echo 再起動します。Enterを押してください
pause
shutdown -r -t 0
---------------------------------------------------------------------------------

■そのほか

バッチファイルで出来る処理がほぼ可能なので、
HKLMのレジストリ編集や、cscriptの呼び出しなども可能となります。
場合によっては、レジストリを編集してオートログイン化をしてもよいですし、
WindowsやOfficeのライセンス認証なども一括で投げることが可能となります。

ちょっとしたメンテナンスの時などでも活用してみてください。

スポンサーリンク

スポンサーリンク