2016/05/04

Windows Update for Nano Server

Windows Server 2016 Technical Preview 5 の Nano Server で Windows Update する方法。

Managing updates in Nano Server
[URL] https://technet.microsoft.com/en-us/library/mt651736.aspx

やってみました。フル インストール向けと同じ累積的な更新 KB3157663 が出てました。Guest ドライバーだけのやつには来ないかもしれません。何かしら役割や機能が入っていると、更新が来ると思います (私の場合、Compute と Container が入っているやつと、Containter がはいっているやつにきました)。 英語版 (en-us) の Nano Server でない場合は(例えば、日本語版のメディアから作った Nano Server)、利用可能な更新プログラムが検出されないかもしれません。

利用可能な更新がないと、次のようなエラーが表示されるけどびっくりしないで。

Invoke-CimMethod : A general error occurred that is not covered by a more specific error code.
At C:\nanoupdate.ps1:2 char:16
+ ... anResults = Invoke-CimMethod -InputObject $sess -MethodName ScanForUp ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (MSFT_WUOperatio...-7284976777f5"):CimInstance) [Invoke-CimMethod], CimExc
   eption
    + FullyQualifiedErrorId : MI RESULT 1,Microsoft.Management.Infrastructure.CimCmdlets.InvokeCimMethodCommand


コマンドラインを打つのが面倒なので、スクリプトにしてみました。
(注: 動作保障なし)

nanoupdate.ps1 
(5/5 修正: $erroractionpreference = SilentlyContinueを追加して、利用可能な更新が無いときのエラーを抑制。参考 https://technet.microsoft.com/ja-jp/library/ee176921.aspx)
--------------------------------------------------------------------------------
$erroractionpreference = "SilentlyContinue"
$sess = New-CimInstance -Namespace root/Microsoft/Windows/WindowsUpdate -ClassName MSFT_WUOperationsSession
$scanResults = Invoke-CimMethod -InputObject $sess -MethodName ScanForUpdates -Arguments @{SearchCriteria="IsInstalled=0";OnlineScan=$true}
if($scanResults)
{
  if ($scanResults.Updates)
  {
    Write-Output "Available updates:"
    $scanResults.Upates
    Write-Host "Would you like to install these update now ? (Y/N)" -NoNewline
    $input = Read-Host
   if($input -eq 'Y') {
      Write-Output "Install all available updates..."
      $scanResults = Invoke-CimMethod -InputObject $sess -MethodName ApplyApplicableUpdates
      Write-Host "Would you like to restart computer now ? (Y/N)" -NoNewline
      $input = Read-Host
     if($input -eq 'Y') {
        Write-Output "Restart computer..."
        Restart-Computer
      }
      else
      {
        Write-Output "Make sure restart computer as soon as possible."
      }
    }
    else
    {
      Write-Output "No updates were installed."
    }
  }
  else
  {
    Write-Output "No updates were found."
  }
}
else
{
    Write-Output "No updates were found."
}
--------------------------------------------------------------------------------
Nano Server で実行するとこんな感じ。

こちらはインストールの履歴。

nanoupdatehistory.ps1
--------------------------------------------------------------------------------
$sess = New-CimInstance -Namespace root/Microsoft/Windows/WindowsUpdate -ClassName MSFT_WUOperationsSession
$scanResults = Invoke-CimMethod -InputObject $sess -MethodName ScanForUpdates -Arguments @{SearchCriteria="IsInstalled=1";OnlineScan=$true}
if ($scanResults.Updates)
{
  Write-Output "Installed updates:"
  $scanResults.Updates
}
else
{
  Write-Output "No updates were installed."
}
--------------------------------------------------------------------------------
Nano Server で実行するとこんな感じ。


で、スクリプト作ったはいいけど、どうやって Nano Server にもってくのって話ですが、

Nano Server で Hyper-V 仮想マシンで動いている場合は、仮想マシンのプロパティで「ゲスト サービス」を有効化して...

PS C:\> Copy-VMFile -Name <仮想マシン名> -SourcePath:C:\work\nanoupdate.ps1 -DestinationPath:C:\ -FileSource Host

Hyper-V 仮想マシンで無い場合は、Nano Server 側でファイルとプリンターの共有のファイアウォールを許可して、\\<コンピューター名>\C$ にでもぶっこんでください。

[NANOSERVER] : PS C:\> netsh advfirewall firewall set rule group="File and Printer Sharing" new enable=yes

共有フォルダーに配置して、Nano Server 側からコピーするでもよし。Web サーバーにおいて、wget するもよし。

参考:
Nano Server 用 wget スクリプト (2015/12/11)

0 件のコメント: