2010/07/08

Hyper-V & Windows Update 自動化スクリプトのまとめ (+α)

一連の Windows Update および Hyper-V スクリプト シリーズをまとめておきます。

  1. Hyper-V Scripting: テキスト ベースの Hyper-V マネージャー http://yamanxworld.blogspot.com/2010/06/hyper-v-server-core.html
  2. Hyper-V Scripting: “実行中”の仮想マシン=ゲスト OS が“実行中”ではないhttp://yamanxworld.blogspot.com/2010/07/hyper-v-scripting-os.html
  3. Windows Scripting: Windows Update をスクリプトから ( WindowsUpdate.vbs ) http://yamanxworld.blogspot.com/2010/07/windows-scripting-windows-update.html
  4. Windows Scripting: Windows Update をスクリプトから ( WindowsUpdate.ps1 ) http://yamanxworld.blogspot.com/2010/07/windows-scripting-windows-update_05.html
  5. Windows Scripting: Windows Update をリモートから ( PowerShell Remoting は NG ) http://yamanxworld.blogspot.com/2010/07/windows-scripting-windows-update_06.html
  6. Windows Scripting: Windows Update をリモートから ( WinRM/WinRS も NG )http://yamanxworld.blogspot.com/2010/07/windows-scripting-windows-update_592.html
  7. Windows & Hyper-V Scripting: Windows Update をスクリプトから ( ゲスト OS のスタートアップに仕込む) http://yamanxworld.blogspot.com/2010/07/windows-hyper-v-scripting-windows_07.html
  8. Windows & Hyper-V Scripting: Windows Update スクリプトのバリエーションhttp://yamanxworld.blogspot.com/2010/07/windows-hyper-v-scripting-windows.html
とりあえず、7 で当初の目的 (めったに起動しない仮想マシンの更新を自動化する) は達成できたわけですが、Windows Update による更新で問題があった場合の対処も考えておく必要がありそうです。たとえば、Windows Update 後に起動できなくなる、再起動を繰り返すなどの問題が出た場合です。物理マシンの場合は、トラブルシューティングは面倒ですが、仮想マシンの場合、スナップショットという便利な機能を利用できます。

次の hvvmsnap.vbs は、指定した仮想マシンに対してスナップショットの作成を開始するスクリプトです。スナップショットの作成をキックして終了するため、スナップショットが終了(100%)するまで待つことはしません。このスクリプトを 7 のバッチで仮想マシンを起動する直前に挟んでおけば、もしものときにスナップショットから回復できるようになります。

[hvvmsnap.vbs]
Option Explicit
Dim arg, targetVM, WMIService, VMs, VM, InputKey
Dim VMManagementService, VMSystemSettingData, ret

If Right((LCase(WScript.FullName)),11) <> "cscript.exe" then
 WScript.Echo "このスクリプトはCSCRIPT.EXEを使用して実行して下さい。"
 WScript.Quit
End if

Set arg = WScript.Arguments
if arg.Count = 0 then
 WScript.StdOut.Write "スナップショットを作成する仮想マシン名を入力して下さい: "
 InputKey = Trim(WScript.StdIn.ReadLine)
 If InputKey <> "" then
  targetVM = InputKey
 Else
  WScript.Echo "仮想マシン名が入力されませんでした。中止します。"
  WScript.Quit
 End If
else
 targetVM = arg(0)
end if

Set WMIService = GetObject("winmgmts:\\.\root\virtualization")
Set VMs = WMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName='" & targetVM & "'")
if VMs.Count < 1 then
 WScript.Echo "仮想マシン " & targetVM & " が見つかりません。"
 WScript.Quit
end if

Set VM = VMs.ItemIndex(0)
Set VMManagementService = WMIService.ExecQuery("SELECT * FROM Msvm_VirtualSystemManagementService").ItemIndex(0)
WScript.StdOut.Write "仮想マシン " & targetVM & " のスナップショットを開始しています ..."
set VMSystemSettingData = (VM.Associators_("Msvm_SettingsDefineState","Msvm_VirtualSystemSettingData")).ItemIndex(0)
ret = VMManagementService.CreateVirtualSystemSnapShot(VM.Path_.Path,VMSystemSettingData)
if ret = 0 or ret = 4096 then
 WScript.Echo "... 成功しました。"
else
 WScript.Echo "... 失敗しました。"
end if

0 件のコメント: