結論から先に言うと、PowerShell の Invoke-Command では wusa /quiet /forcerestart が出来ないので、pkgmgr か dism を使う必要があります。(どちらでもOK)
脆弱性対策で特定の KB だけをインストールすることがありますね。
KB をサイレントインストールする場合、「wusa /quiet
/forcerestart」が常套手段なので、CVE-2015-1635(http.sysの脆弱性)の場合、以下のようにオペレーションします。
(C:\InstallKB\ に KB をコピーしている前提)
wusa C:\InstallKB\Windows8.1-KB3042553-x64.msu /quiet /forcerestart |
対象台数が少ない場合は、直接コンソールを開くかリモートデスクトップ接続して wusa を叩けば良いのですが、ターゲット台数が多いと非効率でやってられないです。
方法として真っ先に思い付くのが Invoke-Command での wusa 投入ですが、残念ながらこれはうまくいきません。
ちなみに、Enter-PSSession もダメです。
試しに以下の実験をしてみましょう。
(認証は省略しているので、必要に応じで New-PSSession とか
-Credential を使ってください)
(ターゲット サーバーの C:\InstallKB\ に KB をコピーしている前提です)
まずは、KB がインストールされているかの確認です。
PS C:\> $Result = Invoke-Command TergetServer -ScriptBlock {
Get-HotFix -ErrorAction SilentlyContinue KB3042553 } PS C:\> $Result -eq $null True |
Get-HotFix の戻り値が Null なので、KB がインストールされていません。
それでは、wusa で KB
をインストールしてみます
PS C:\> Invoke-Command TergetServer -ScriptBlock { cmd /c wusa C:\InstallKB\Windows8.1-KB3042553-x64.msu /quiet /forcerestart } |
KB が適用されれば再起動されるはずですが、いつまで待っても再起動してくれません。
KB が適用されたか確認してみます。
PS C:\> $Result = Invoke-Command TergetServer -ScriptBlock {
Get-HotFix -ErrorAction SilentlyContinue KB3042553 } PS C:\> $Result -eq $null True |
残念ながら、Invoke-Command で wusa /quiet /forcerestart は出来ないのです。(色々試行錯誤してみると、リモート操作自体をサポートしていないようです)
この問題の回避方法は、.msu を解凍し、pkgmgr で KB をインストールします。
コマンドで言うと
wusa C:\InstallKB\xxxx.msu /extract:C:\InstallKB pkgmgr /n:C:\InstallKB\xxxx.xml /quiet |
こいつでイケます。
それでは、KB をインストールします。
PS C:\> Invoke-Command TergetServer -ScriptBlock { cmd /c wusa
C:\InstallKB\Windows8.1-KB3042553-x64.msu /extract:C:\InstallKB } PS C:\> Invoke-Command TergetServer -ScriptBlock { cmd /c pkgmgr /n:C:\InstallKB\Windows8.1-KB3042553-x64.xml /quiet } |
今度は無事再起動されました。
再起動が完了したら KB がインストールされたか確認します。
|
Get-HotFix の戻り値が返ってきたので、今度は無事 KB のインストールが出来ました。
pkgmgr.exe が使えるという事は、dism.exe も使えるので、同様に dism で KB をインストールしてみます。
コマンドは以下になります
wusa C:\InstallKB\xxxx.msu /extract:C:\InstallKB dism /online /add-package /PackagePath:C:\InstallKB\xxxx.cab /Quiet |
同様に dism.exe で KB をインストールしてみます。
PS C:\> Invoke-Command TergetServer -ScriptBlock { cmd /c wusa
C:\InstallKB\Windows8.1-KB3042553-x64.msu /extract:C:\InstallKB } PS C:\> Invoke-Command TergetServer -ScriptBlock { cmd /c dism /online /add-package /PackagePath:C:\InstallKB\Windows8.1-KB3042553-x64.cab /Quiet } |
無事再起動されました。
KBの確認をすると、インストール成功していることがわかります。
これで、大量にある Server に特定 KB 展開ができますね
リモート コンピューターのバッチ操作(Invoke-Command)
リモート コンピューターのパラレル バッチ操作(Invoke-Command -AsJob)
Copyright © MURA All rights reserved.