びぼうろぐ

ネ申エクセルからの卒業

【Powershell】WindowsUpdateの適用状況を一覧出力する

Vulsに関するプレスがIPAから出てますね。 www.ipa.go.jp

とてもガッツリ書かれていて、読み終えたら導入する択以外は選べないレベルです。私もお世話になっているツールなのですが、いかんせん無償版なのでWindowsに対する管理が...

できないことを嘆いても仕方がないので、今回は以下のコードを参考にWindowsのセキュリティパッチの当たり具合を取得してみます。

social.technet.microsoft.com

動作環境

WSUSサーバ

  • OS: Windows Server 2016
  • WSUS: 10.0.14393.2791

クライアント

実践

準備

WSUS関連のPowerShellモジュールが必要になるので、リモートサーバ管理ツール(RSAT)をインストールします。

# インストールできる機能を確認
PS> Get-WindowsFeature
# WSUSのRSATをインストール
PS> Install-WindowsFeature -Name UpdateServices-RSAT

実行

以下のコードをps1ファイルに保存し、管理者権限で実行します。
※5行目は環境ごとに修正してください。

$myDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition);
Set-Location $myDir;

[reflection.assembly]::LoadWithPartialName("Microsoft.UpdateServices.Administration") | Out-Null;
$wsus = Get-WsusServer -name <myWsusHost> -PortNumber <myWsusPort>;
$wsus.PreferredCulture ="ja";
Write-Host "WSUS接続完了";

# 「承認済み」 & 「未適用」のKBオブジェクト
$updateScope = New-Object Microsoft.UpdateServices.Administration.UpdateScope;
$updateScope.ApprovedStates = [Microsoft.UpdateServices.Administration.ApprovedStates]::LatestRevisionApproved;
$updateScope.ExcludedInstallationStates = 'NotApplicable','Unknown','Installed';

$computerScope = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope;

Write-Host "データ作成中..."
$dataHolder = @();
$wsus.GetSummariesPerComputerTarget($updateScope, $computerScope) | ForEach {
  $myMachines = New-Object Microsoft.UpdateServices.Administration.ComputerTargetScope;
  $myMachines.NameIncludes = $wsus.GetComputerTarget(([guid]$_.ComputerTargetId)).FullDomainName;
  $pcupSum = ($wsus.GetSummariesPerUpdate($updateScope,$myMachines) | ForEach-Object {($wsus.GetUpdate($_.UpdateId).Title)});
     
  $data = New-Object PSObject -Property @{
    "LastSync" = $wsus.GetComputerTarget(([guid]$_.ComputerTargetId)).LastReportedStatusTime;
    "HostName" = $wsus.GetComputerTarget(([guid]$_.ComputerTargetId)).FullDomainName;
    "OS" = $wsus.GetComputerTarget(([guid]$_.ComputerTargetId)).OSDescription;
    "IP" = $wsus.GetComputerTarget(([guid]$_.ComputerTargetId)).IPAddress;
    "Updates" = ($_.NotInstalledCount + $_.DownloadedCount);
    "Failed" = $_.FailedCount;
    "Titles" = $pcupSum | Sort-Object | Out-String;
  }

  $dataHolder += $data;
}

$date = Get-Date -Format "yyyyMMdd";
$result = $dataHolder | Select "LastSync", "HostName", "OS", "IP", "Updates", "Failed", "Titles" | Sort-Object -Property "LastSync";
$result | Export-Csv "WindowsUpdate適用状況_$date.csv" -NoTypeInformation -Encoding Default;
$result | Out-GridView -Title "WindowsUpdate適用状況";
Pause;

ps1ファイルと同じ階層にWindowsUpdateの適用情報がCSVで出力されました。

まとめ

Windows脆弱性に対する対策って「最新のWindowsUpdateを適用して下さい」くらいしか見た覚えがないので、WSUSがしっかり運用できていれば状況が十分把握できるデータが取得できます。またWSUS標準のレポート機能は個人的に使いづらい&見づらいので、こういう形式のほうが応用が利きますね。

が!網羅できる範囲はMicrosoft製品に限られるので、用途は限定的です。
WSUS管理外のWindows?知らない子ですね...

FutureVuls使ってみたいなーーー