PowerShellとbatを活用したソフトウェアのリモートインストール方法

#●前提条件
　・インストールするソフトウェアがサイレントインストールに対応していること
　・ActiveDirectoryドメイン環境であること
　・ユーザーアカウント制御（UAC）が無効であること
　・管理共有が有効であること
　・実施ユーザーはDomainAdminsグループに所属するユーザーであること
　・サーバ間でSMBによる通信ができること（NW機器による遮断がないこと）
　・Windowsファイアウォールが無効であること
　・各サーバでPowerShellが利用できること
　・各サーバでPowerShellが「Get-ExecutionPolicy：RemoteSigned」であること
　・各サーバでWinRMサービスのスタートアップ種類が遅延開始であること
　・各サーバでWinRMサービスが起動していること

#●環境
　OS：WindowsServer2012R2（ActiveDirectoryドメイン環境）　
　リモート制御サーバA（１台）
　リモート先サーバB（N台）

#●概要
　インストーラ用フォルダを、各サーバに作る。
　作成後、インストーラを各サーバにコピーする。
　リモートコマンドより、各サーバでインストーラをたたく。


#●流れ
　・資材フォルダの作成
　・資材の配置
　・資材のコピー
　・リモートインストール
　・インストールの確認
　・資材の削除　

##リモート制御サーバへログインする。
　DomainAdminsにてログインすること。

##①リモート制御サーバにて資材作成、配置
以下は例
　・Dドライブ直下に「remoteinstall」フォルダ作成
　・「remoteinstall」フォルダにインストーラ（exe）や、
　　exeを実行するためのbatファイルを配置

##②資材のコピー準備　リモート先サーバにフォルダ作成
```powershell
PS C:\WINDOWS\system32> mkdir \\リモート先サーバホスト名\D$\remoteinstall
```

##③資材のコピー　リモート先サーバに対してひたすら資材を配布する
```powershell
PS C:\WINDOWS\system32> robocopy "D:\remoteinstall" "\\リモート先サーバホスト名\D$\remoteinstall" /S /E /V /R:0 /W:0 /TEE

-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー

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

  開始: 2018年2月21日 22:12:58
   コピー元 : D:\remoteinstall
     コピー先 : \\リモート先サーバホスト名\D$\remoteinstall

    ファイル: *.*

  オプション: *.* /V /TEE /S /E /DCOPY:DA /COPY:DAT /R:0 /W:0

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

                           0    D:\remoteinstall
        新しいディレクトリ       3      \\リモート先サーバホスト名\D$\remoteinstall
100%      新しいファイル                       3        aaa.txt
100%      新しいファイル                    1599        AcroRd32.exe
100%      新しいファイル                     811        __pycache__.lnk

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

                  合計     コピー済み      スキップ       不一致        失敗
Extras
   ディレクトリ:         2         1         0         0         0         0
     ファイル:         3         3         0         0         0         0
      バイト:     2.3 k     2.3 k         0         0         0         0
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00

```

コピーに失敗した場合、プロンプトに結果が出力されるため、適時再コピーする。
コマンドオプションは以下リンクを参照。
https://www.pg-fl.jp/program/dos/doscmd/robocopy.htm

##④-1リモートインストール：パターン1（bat不要の場合）
```powershell
PS C:\WINDOWS\system32> Invoke-Command -ComputerName "リモート先サーバホスト名" -ScriptBlock { cmd /c D:\remoteinstall\なんとか.exe exeの実行オプション（/なんとか） } 
```

##④-2リモートインストール：パターン2（batを経由する場合1）
```powershell
PS C:\WINDOWS\system32> Invoke-Command -ComputerName "リモート先サーバホスト名" -ScriptBlock { cmd /c D:\remoteinstall\なんとか.bat } 
```

##④-3リモートインストール：パターン3（batを経由する場合2）
```powershell
PS C:\WINDOWS\system32> Invoke-Command -ComputerName "リモート先サーバホスト名" -ScriptBlock { wmic process call create "D:\remoteinstall\なんとか.bat" }
 
```

ここでご紹介するリモートインストール方法は、以上の3パターンに分かれます。
パターン3はInvokeコマンドとWmicのコマンド組み合わせ。
※パターン3がつらいのはインストールが完了したかどうかが見えないところ。
　というわけで、15分程度待ってから以下で確認する。

##インストール確認
```powershell
PS C:\WINDOWS\system32> Invoke-Command -ComputerName "リモート先サーバホスト名" -ScriptBlock { Get-WmiObject Win32_Product | Where-Object {$_.Version,$_.Name -match "Micro*"} }

Name              : Update for Japanese Microsoft IME Standard Dictionary
Vendor            : Microsoft Corporation
Version           : 15.0.2013
```

コマンドライン上の「-match "Micro*"」とある"Micro*"の箇所は、
インストールするソフトウェア名とワイルドカード。
インストールするソフトウェア名によって適時変えること。

##資材の削除
```powershell
PS C:\WINDOWS\system32> rmdir /S \\リモート先サーバホスト名\D$\remoteinstall
\\リモート先サーバホスト名\D$\remoteinstall、よろしいですか (Y/N)? y
```


#●余談
こういう辛さから逃れるにはやっぱりエンターテインメント。
ジェニファーロペスはいつだって僕らのお姉さん。
この動画を見た瞬間、コマンドばっかり見ていた私の視力が復活するかと思いました。
[Jennifer Lopez - Love Don't Cost a Thing ](https://www.youtube.com/watch?v=4kGvlESGvbs)