Home > Windows にまつわる e.t.c.

Invoke-Command で KB をインストールする


結論から先に言うと、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 は出来ないのです。(色々試行錯誤してみると、リモート操作自体をサポートしていないようです)

 

解決方法(pkgmgr.exe を使う)

この問題の回避方法は、.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 がインストールされたか確認します。

PS C:\> $Result = Invoke-Command TergetServer -ScriptBlock { Get-HotFix -ErrorAction SilentlyContinue KB3042553 }
PS C:\> $Result -eq $null
False
PS C:\> echo $Result

Source        Description      HotFixID      InstalledBy          InstalledOn               PSComputerName
------        -----------      --------      -----------          -----------               --------------
WIN-JFH16F... Security Update  KB3042553     WIN-JFH16F6DVS6\A... 2015/04/18 0:00:00        TergetServer

Get-HotFix の戻り値が返ってきたので、今度は無事 KB のインストールが出来ました。

 

解決方法(dism.exe を使う)

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 展開ができますね

 

関連情報

平文 ID Password から 資格情報を作成する

リモート コンピューターのバッチ操作(Invoke-Command)

リモート コンピューターのパラレル バッチ操作(Invoke-Command -AsJob)

PowerShellでファイル配置

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.