かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.131 Defenderの定義の更新も自動化したい|どうする!?残る閉域網の更新管理(6)

 

 

vol.131 Defenderの定義の更新も自動化したい|どうする!?残る閉域網の更新管理(6)

2025年08月25日配信
2025年08月25日更新
執筆者:山内 和朗

 共有フォルダーを利用した、閉域網(クローズドネットワーク)内のサーバーの更新管理環境を自作し、数か月運用してきましたが、更新プログラムのファイルサーバーへのコピー作業という手間はかかるものの、それ以外は自動化でき、期待通りに動作しています。しかし、そういえばMicrosoft Defenderウイルス対策の定義ファイルが更新されていないことに気付きました。

 

オフラインスキャン用「wsusscn2.cab」には定義の更新は含まれない?

 

 この連載で構築した閉域網内のサーバーの更新管理環境では、ファイルサーバーにオフラインスキャン用の最新の更新カタログ「wsusscn2.cab」を自動的にダウンロードし、更新対象のサーバーで「wsusscn2.cab」を使用してオフラインスキャンを実施して、利用可能な更新プログラムの一覧をCSV形式のログファイルとしてファイルサーバーに保存します。管理者は、CSVファイルを参照して必要な更新プログラム(MSUファイル)をMicrosoft Updateカタログからダウンロードして、ファイルサーバーに専用のフォルダーに格納します。更新対象のサーバーは、共有フォルダー内に新しい更新プログラムを見つけると、自動的にそれをインストールし、必要があれば再起動します。前回(vol130)は応用編として、同様に共有フォルダーを介したMicrosoft Edgeの更新にも対応しました。

 2025年6月、7月とこの一連の作業を実施していて、利用可能な更新プログラムにMicrosoft Defenderウイルス対策の定義(セキュリティインテリジェンス、プラットフォームやエンジンの更新が含まれる場合もある)の更新が含まれていないことに気付きました(画面1、画面2)。通常のWindows Updateであれば、毎月のWindows Updateの実行時に定義の更新が行われることは珍しくありません。
 
画面1 オフラインスキャンでMicrosoft Defenderウイルス対策の定義の更新が検出されることはない
画面1 オフラインスキャンでMicrosoft Defenderウイルス対策の定義の更新が検出されることはない
 
画面2 Microsoft Defenderウイルス対策の定義のバージョンは、閉域網に接続する前の時点(2025年6月)に更新されたままの状態
画面2 Microsoft Defenderウイルス対策の定義のバージョンは、閉域網に接続する前の時点(2025年6月)に更新されたままの状態

 更新カタログ「wsusscn2.cab」は、通常、毎月第2火曜日(米国時間)に最新のものが提供されます。これに対して、定義の更新は、より頻繁に、例えば、1日に複数回、更新バージョンが提供されます。そのため、更新カタログ「wsusscn2.cab」には定義の更新が含まれないのだと思います。定義の更新は通常、「KB2267602」としてWindows Updateを通じてインストールされますが、Microsoft Updateカタログで「KB2267602」を検索しても、何も見つかりません(一部のバージョンは「Microsoft Defender Antivirusマルウェア対策更新プログラム – KB4052623」としてダウンロードできます) 。

 閉域網にあり、インターネットのブラウジングでセキュリティの脅威に直面するようなことはありませんが、別の方法(メールの添付ファイルやリムーバブルメディアなど)で入り込んだウイルスが共有フォルダーを介して感染しないとも限りません。そのため、どうにかして閉域網にあるサーバーでも定義を更新できるようにしてみましょう。
 

共有フォルダーを介した定義の更新

 
 方法としては、これまでWindowsの更新プログラムやMicrosoft Edgeの更新を閉域網のサーバーにインストールするのに使用したのと同じアプローチにします。まず、ファイルサーバーの共有フォルダーに、最新の定義の更新のスタンドアロンインストーラー(mpam-fe.exe)をダウンロードします。最新の定義の更新のスタンドアロンインストーラーは次のWebサイトからダウンロードできます。Windows Server向けのダウンロードリンクは常に同じようです。ダウンロードリンクが一定であれば、ダウンロード作業を自動化でき、Windowsの更新プログラムやMicrosoft Edgeのように、人が手動でダウンロードして、共有フォルダーに配置するという面倒な手間を省くことができます。

Security intelligence updates for Microsoft Defender Antivirus and other Microsoft antimalware|Microsoft Security Intelligencee(Microsoft)
Microsoft Defender Antivirus for Windows 11, Windows 10, Windows 8.1, and Windows Server
https://go.microsoft.com/fwlink/?LinkID=121721&arch=x64
 
 「mpam-fe.exe」はオプションを指定しなても、サイレントで実行され、定義を更新してくれることを事前に確認しました。つまり、更新対象のサーバーでは、共有フォルダー上に新しい「mpam-fe.exe」があれば、それを実行すれば完了です。
 

最新の「mpam-fe.exe」を共有フォルダーにダウンロードするサンプルスクリプト

 
 次のPowerShellスクリプト「getmpamfe.ps1」は、インターネットアクセスが可能なサブネットと閉域網のサブネットの両方に接続されたファイルサーバーで自動実行することを想定した、最新の「mpam-fe.exe」を共有フォルダーにダウンロードするスクリプトです。ポイントは、一時フィルダー(%TEMP%、$env:Temp)にダウンロードして、ファイルのプロパティの「詳細」にある「製品バージョン」(署名のバージョンと一致)を確認し、ダウンロード済みの製品バージョンと比較して、新しければ入れ替えるようにしています。

 このスクリプトをタスクスケジューラで定期的(1日に2回など)に自動実行するようにスケジュール(実行ユーザー SYSTEMまたはAdministrator、ユーザーがログオンしているかどうかに関わらず実行する、最上位の特権で実行する)しておけば、管理者が介在することなく、共有フォルダー上の「mpam-fe.exe」を最新のものに維持することができます(画面3)。
 
画面3 「posershell.exe <パス>¥getmpamfe.ps1」を定期的に実行するようにファイルサーバーのタスクスケジューラにタスクを登録する
画面3 「posershell.exe <パス>¥getmpamfe.ps1」を定期的に実行するようにファイルサーバーのタスクスケジューラにタスクを登録する
 

[getmpamfe.ps1]プレーンテキストで表示)
ログのパス($LogPath)と、「mpam-fe.exe」のダウンロード先のパスは適宜変更してください。

function Write-Log {
param (
[string]$Message,
[string]$LogPath = "$env:TEMP\getmpamfe.log"
)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$entry = "[$timestamp] $Message"
Add-Content -Path $LogPath -Value $entry
}
$LogPath = "E:\work\WUPackages\logs\getmpamfe.log"

Write-Log -Message "Downloading the latest mpam-fe.exe..." -LogPath $LogPath

$mpamfeCurrent = "E:\Work\WUPackages\Defender\mpam-fe.exe"
$mpamfeTemp = "$env:TEMP\mpam-fe.exe"

Invoke-WebRequest -uri "https://go.microsoft.com/fwlink/?LinkID=121721&arch=x64" -outfile $mpamfeTemp -UseBasicParsing
$newSigVer = [version](Get-ItemProperty $mpamfeTemp).VersionInfo.ProductVersion

if (Test-Path $mpamfeCurrent) {
$currentSigVer = [version](Get-ItemProperty $mpamfeCurrent).VersionInfo.ProductVersion
if ($newSigVer -gt $currentSigVer) {
Remove-Item $mpamfeCurrent -Force
Move-Item -Path $mpamfeTemp -Destination $mpamfeCurrent
Write-Log -Message "Updated to the latest mpam-fe.exe(ver: $newSigVer)." -LogPath $LogPath
} else {
Remove-Item $mpamfeTemp -Force
Write-Log -Message "Current mpam-fe.exe(ver: $currentSigVer) is up-to-date." -LogPath $LogPath
}
} else {
 Move-Item -Path $mpamfeTemp -Destination $mpamfeCurrent
Write-Log -Message "Downloaded to the latest mpam-fe.exe(ver: $newSigVer)." -LogPath $LogPath
}

 

共有フォルダー上の最新の「mpam-fe.exe」をインストールするサンプルスクリプト

 

 次のPowerShellスクリプト「sigupdate.ps1」は、共有フォルダー上の指定したパスを参照し、「mpam-fe.exe」が存在すれば、そのファイルのプロパティの製品バージョンと、現在インストールされている定義ファイルのバージョンを比較し、「mpam-fe.exe」のほうが新しいバージョンであれば実行して最新の定義をインストールします。バージョンチェックしてからインストールするかどうかを判断しているため、スクリプトを繰り返し実行した場合でも、同じ定義がインストールされることはありません(画面4)。このスクリプトのポイントは、共有フォルダーのUNCパスは信頼できない場所(例: IPアドレス指定はインターネットゾーン)として判断され、直接実行するとWindows Defender SmartScreenなどのセキュリティ機能でブロックされる可能性があるため、一時フォルダーにコピーしてから実行することです。また、インストールが完了し、更新されたことを確認するために、Start-Process -Waitで実行が終わるまで待機しているところもポイントです。

 

画面4 「mpam-fe.exe」が存在するUNCパスを-PackageDirに、ログ出力先を-LogDirに指定して実行することで、最新の定義をインストールする
画面4 「mpam-fe.exe」が存在するUNCパスを-PackageDirに、ログ出力先を-LogDirに指定して実行することで、最新の定義をインストールする

 更新対象のサーバーのタスクスケジューラに、「powershell.exe <パス>¥sigupdate.ps1」を定期的に実行するようにタスクを登録すれば、共有フォルダー上に最新の「mpam-fe.exe」を自動的にインストールできます(画面5)。なお、タスクは、ビルトインAdministratorなどの管理者の権限で、ログオンしているかどうかに関係なく実行するように構成します(ネットワーク共有に接続するためSYSTEMは不可)。

 

画面5 「posershell.exe <パス>¥sigupdate.ps1」を定期的に実行するように更新対象のサーバーのタスクスケジューラにタスクを登録する
画面5 「posershell.exe <パス>¥sigupdate.ps1」を定期的に実行するように更新対象のサーバーのタスクスケジューラにタスクを登録する

 

[sigupdate.ps1]プレーンテキストで表示)

Param($PackageDir, $LogDir)
if ($PSBoundParameters.Count -ne 2) { Write-host "Error: -PackageDir <path> -LogDir <Path>" ;exit 1}
If ( -not (Test-Path $packagedir)) { Write-host "Error: -PackageDir <path> does not exist." ;exit 1}
If ( -not (Test-Path $LogDir)) { Write-host "Error: -LogDir <path> does not exist." ;exit 1}

function Write-Log {
param (
[string]$Message,
[string]$LogPath = "$env:TEMP\sigupdate.log"
)
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$entry = "[$timestamp] $Message"
Add-Content -Path $LogPath -Value $entry
}

$LogPath = "$LogDir\$(hostname)_sigupdate.log"
if (Test-Path $logPath) {
$logTime = (get-item $logPath).LastWriteTime
} else {
$logTime = get-Date("1900/1/1")
}

Write-Log -Message "Start sigupdate.ps1" -LogPath $LogPath

$package = (Get-ChildItem -Path $packagedir| where {$_.name -eq "mpam-fe.exe"} | Sort Name | %{$_.FullName})
$currentSigVer = [version](Get-MpComputerStatus).AntivirusSignatureVersion

$success = $true
if ($package.Count -gt 0){
$newSigVer = [version](Get-ItemProperty $package).VersionInfo.ProductVersion
if ($newSigVer -gt $currentSigVer) {
$outmsg = "Signature Update is starting... "
$outmsg = $outmsg + "`nCurrent Signature Version: $currentSigVer"
$outmsg = $outmsg + "`nNew Signature Version: $newSigVer"
Write-Output $outmsg
Write-Log -Message $outmsg -LogPath $LogPath
Copy-Item $package -Destination "$env:TEMP\" -Force
Start-Process "$env:TEMP\mpam-fe.exe" -Wait
if (!($LASTEXITCODE -eq 0)) {
$success = $false
$package = "+ " + (Get-Item $package).Name + ": Failed"
} else {
$package = "+ " + (Get-Item $package).Name + ": Success"
}
Write-Output $package
Write-Log -Message $package -LogPath $LogPath
$outmsg = "Current Microsoft Defender Security intelligence:"
$outmsg = $outmsg + "`nVersion: $((Get-MpComputerStatus).AntivirusSignatureVersion)"
$outmsg = $outmsg + "`nEngine Version: $((Get-MpComputerStatus).AMEngineVersion)"
$outmsg = $outmsg + "`nPlatform Version: $((Get-MpComputerStatus).AMProductVersion)"
$outmsg = $outmsg + "`nLast Updated: $((Get-MpComputerStatus).AntivirusSignatureLastUpdated )"
Write-Output $outmsg
Write-Log -Message $outmsg -LogPath $LogPath
} else {
$outmsg = "No update."
Write-Output $outmsg
Write-Log -Message $outmsg -LogPath $LogPath
exit 0
}
}
exit 0

 

 6月の更新は、この連載シリーズの方法で問題なく完了しました。今後、数か月、この方法で1台のマシンの更新管理を運用してみますが、ひとまずこの連載シリーズは完結です。

 

 

「どうする!?残る閉域網の更新管理」連載シリーズの目次

vol131_summary

  1.  WSUSにさよなら|どうする!?残る閉域網の更新管理
  2.  オフラインスキャンの自動化に挑む
  3.  インストールから再起動まで、更新の自動化に挑む
  4.  毎月第2火曜日(パッチチューズデイ)の週末に更新タスクを開始したい
  5.  Microsoft Edgeの更新も自動化したい
  6.  Defenderの定義の更新も自動化したい

 この連載で作成したスクリプトとその配置については、左のを参照して下さい。

 

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事