2017年6月23日金曜日

Windows Defenderの定義ファイルを手動で適用するスクリプトを作った

自宅の検証環境にWindows Server 2016を評価版としてインストールして使っているのだが、Windows Defenderの定義ファイルがうまく更新できないという事象が発生している(WSUS環境なので、WSUS側の問題かもしれない)。

そのため、不定期に定義ファイルをダウンロードして、手動で適用していたのだが、それすらも面倒にもなってきたし、セキュリティ的にも可能な限り定義ファイルは最新にしておきたいと考え、スクリプトを組んで自動化することにした。

手作業でやる場合

Windows Defenderの定義ファイルをダウンロード元は、以下URLとなる。

・Updating your Microsoft antimalware and antispyware software
https://www.microsoft.com/en-us/security/portal/definitions/adl.aspx

「Antimalware and antispyware updates」の項目に、Microsoftの各セキュリティ製品の定義ファイルの最新リンクが記載されているので、該当するものをクリックしてダウンロードする。Windows Server 2016であれば、「Windows Defender in Windows 10 and Windows 8.1 - 64bit」を選べばよい。


「mpam-fe.exe」というexeファイルがダウンロードされる(2017年6月時点で124MB)。このexeファイルをダブルクリックで実行するだけで、定義ファイルが更新される。

スクリプトでやる場合

手作業でやっていた作業を単純にPowerShellで実行するスクリプト「update_windefender.ps1」を作成し、タスクスケジューラで1日1回実行するようにした。動作はPowerShell 3.0で確認している。

------------------------------
#
# Windows Defender定義ファイル更新スクリプト
# update_windefender.ps1
#

# 定義ファイルのダウンロード先を指定
$url = "http://go.microsoft.com/fwlink/?LinkID=121721&arch=x64"

# 定義ファイルのダウンロードフォルダを指定
$workdir = "c:\work\"

# 実行コマンド
$cmd = $workdir + "mpam-fe.exe"

# 定義ファイルをダウンロード
Invoke-WebRequest -Uri $url -OutFile $cmd

# 適用チェック
if ( (Get-Item $cmd).VersionInfo.FileVersion -eq (Get-MpComputerStatus).AntivirusSignatureVersion ){
   echo "定義ファイルは最新です。"   
}else{
   echo "定義ファイルを更新します。"

   # 更新処理
   Start-Process $cmd -Wait
}
------------------------------

シンプルなスクリプトではあるが、Windows版wgetのようなInvoke-WebRequestコマンドの存在を知ることができたり、久しぶりにPowerShellに触れたこともあって、なかなか楽しく作ることができた。

参考

・Defender Cmdlets
https://technet.microsoft.com/ja-jp/library/dn433280.aspx