2010/07/07

Windows & Hyper-V Scripting: Windows Update スクリプトのバリエーション

WindowsUpdate.vbs (PowerShell がお好きな場合は WindowsUpdate.ps1) をコンピューターのスタートアップ スクリプトに仕込む方法は、仮想マシンに限らず、物理マシンでも、Windows を最新状態に維持する手っ取り早い方法として、いろいろ応用できそうです。

例えば、次の WindowsUpdate.cmd をスタートアップ スクリプトに仕込んでおけば、コンピューター起動時に Windows Update を強制実行し、再起動が完了するまで、すべての着信とルールで許可されていない発信を Windows ファイアウォール (セキュリティが強化された Windows ファイアウォール) でブロックできます。めったに起動しない仮想マシンに仕込んでおけば、仮想マシンが脆弱性を抱えたままネットワークに参加するのを防止できるでしょう。

[windowsupdate.cmd]
@echo off
netsh advfirewall set currentprofile firewallpolicy blockinboundalways,blockoutbound
cscript WindowsUpdate.vbs //NoLogo
if %errorlevel% == -1 goto REBOOTNOW
GOTO END
:REBOOTNOW
shutdown /r /t 0
:END
netsh advfirewall set currentprofile firewallpolicy blockinbound,allowoutbound
なお、Windows XP および Windows Server 2003 の場合は、以下のコマンドラインで例外の許可/禁止を設定することができます。

netsh firewall set opmode mode=ENABLE exceptions=DISABLE
netsh firewall set opmode mode=ENABLE exceptions=ENABLE

次の WindowsUpdate2.cmd は、WindowsUpdate.cmd にログオン中のユーザーの有無をチェックする機能を追加したものです。ログオン中のユーザーについては、NoLogonUser.vbs というスクリプトで判断しています。このスクリプトでは、explorer.exe (Windows シェル) または rdpshell.exe (RemoteApp 用シェル) のプロセスが動作していれば、ログオン中のユーザー ありと判断して、再起動を省略して、バッチを終了します。その後については、タスクバーの Windows Update システム アイコンが再起動を催促してくれるはずです。
[windowsupdate2.cmd]
@echo off
netsh advfirewall set currentprofile firewallpolicy blockinboundalways,blockoutbound
cscript WindowsUpdate.vbs //NoLogo
if %errorlevel% == -1 goto REBOOTREQUIRED
GOTO END
:REBOOTREQUIRED
cscript NoLogonUser.vbs //NoLogo
if %errorlevel% == -1 goto REBOOTNOW
GOTO END
:REBOOTNOW
shutdown /r /t 0
:END
netsh advfirewall set currentprofile firewallpolicy blockinbound,allowoutbound

[NoLogonUser.vbs]
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'explorer.exe' or Name = 'rdpshell.exe'")
If colProcesses.Count = 0 Then
Wscript.Echo now & vbTab & "ログオン中のユーザーはいません。"
WScript.Quit(-1)
Else
For Each objProcess in colProcesses
colProperties = objProcess.GetOwner(strNameOfUser,strUserDomain)
Wscript.Echo now & vbTab & strUserDomain & "\" & strNameOfUser & "(ログオン中)"
Next
WScript.Quit(0)
End If

長らく続いた Windows Update の(使える)スクリプト化シリーズは、これでひとまず終了します。

0 件のコメント: