マイクロソフトの最新製品、テクノロジのトレーニングを提供する、無償オンライン トレーニング サイト
Microsoft Virtual Academy (MVA) のご紹介です。
現在受講内容に応じて付与されるポイントを集めると、Amazon ギフト券が手に入るキャンペーンを実施中です。
ポイントを集めて、スキルアップしながらギフト券にチャレンジしてみませんか?
▼ 5 月末日まで! キャンペーン詳細を確認 ▼
http://go.microsoft.com/?linkid=9807668
選手権には、個人戦と団体戦の 2 種類があり、団体戦は上位 100 チームには “もれなく” ギフト券が進呈されます。
個人戦と団体戦は重複してのエントリーが可能ですので、職場の同僚やご友人を誘いながら、ぜひダブルでチャンスを狙ってください。
前回までのプロビジョニングで、とりあえずの仮想マシンができあがりました。基本的なCPU、メモリ、ハードディスク、ネットワークアダプタが実装されています。Hyper-Vの仮想マシンはこの他にも、SCSIハードディスクや、DVDドライブなどの追加装備が実装可能です。今回は、この追加装備の一つであるSCSIハードディスクのプロビジョニング方法をご紹介します。
SCSIハードディスクを追加するには、手順としてSCSIコントローラーを追加して、vhdハードディスクを接続するといった手順になります。まずはSCSIコントローラーの追加から。
[ コード01 ]1: Function SetScsiController(ByVal objManagementScope As ManagementScope, ByVal strVMName As String) As Boolean
2: Dim objComputerSystem As ManagementObject = Nothing
3: For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
4: objComputerSystem = objManagementObject5: Next
6: 7: Dim objSCSIController As ManagementObject = Nothing
8: For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE ResourceType = 6 AND ResourceSubType = 'Microsoft Synthetic SCSI Controller' AND OtherResourceType = null")).Get
9: objSCSIController = objManagementObject10: objSCSIController("ElementName") = "SCSI コントローラー"
11: Next
12: 13: For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
14: Dim objParams As ManagementBaseObject = objVirtualSystemManagementService. GetMethodParameters ("AddVirtualSystemResources")
15: Dim strResourceSettingData As String() = New String(0) {}
16: strResourceSettingData(0) = objSCSIController. GetText(TextFormat.CimDtd20)17: objParams("ResourceSettingData") = strResourceSettingData
18: objParams("TargetSystem") = objComputerSystem.Path.Path
19: Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod ("AddVirtualSystemResources", objParams, Nothing)
20: Return JobComplete(objManagementBaseObject, objManagementScope)
21: Next
22: End Function
1行目:
引数として、ManagementScope オブジェクト、仮想マシン名を渡します。
2〜5行目:
仮想マシン名をキーにして、WMIクエリにてメモリ設定を行なう仮想マシンオブジェクトを取得します。
ここまではいつもどおり同様のパターンとなります。
7〜11行目:
SCSIコントローラーのオブジェクトはMsvm_ResourceAllocationSettingDataの中に格納されていますので、ResourceType =6(Parallel SCSI HBA)、 ResourceSubType = Microsoft Synthetic SCSI Controllerといった内容でSQL文でフィルタします。
13行目:
抽出したSCSIコントローラーオブジェクトを仮想マシン作成時と同様に、
Msvm_VirtualSystemManagementService クラスを使用して追加していきます。Msvm_VirtualSystemManagementServiceクラスのオブジェクトの中の一つをFor〜Nextの文で取り出します。
14行目:
AddVirtualSystemResourcesメソッドを使用して各パラメーターを設定しています。
15〜17行目:
ディスクドライブオブジェクトのXML化した設定情報を、ResourceSettingDataパラメーターに入力します。
18行目:
objComputerSystemパラメーターには、4行目で取得した、SCSIコントローラーを追加する仮想マシンを格納したMsvm_ComputerSystemオブジェクトを指定します。
19行目:
AddVirtualSystemResourcesメソッドを、入力したパラメーターの内容で実行します。
20行目:
いつものようにJobCompleteを実行してエラーがなければ、SCSIコントローラーが追加されます。
[ コード02 ]1: Function SetScsiHardDisk(ByVal objManagementScope As ManagementScope, ByVal strVMName As String, ByVal strDiskPath As String) As Boolean
2: Dim objComputerSystem As ManagementObject = Nothing
3: For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")). Get
4: objComputerSystem = objManagementObject5: Next
6: 7: Dim objDiskDrive As ManagementObject = Nothing
8: For Each objResourcePool As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_ResourcePool WHERE ResourceType = 22 AND ResourceSubType = 'Microsoft Synthetic Disk Drive' AND OtherResourceType = null")). Get
9: Dim objAllocationCapabilitiesCollection As ManagementObjectCollection = objResourcePool. GetRelated("Msvm_AllocationCapabilities")
10: For Each objAllocationCapabilities As ManagementObject In objAllocationCapabilitiesCollection
11: Dim objSettingsDefineCapabilitiesCollection As ManagementObjectCollection = objAllocationCapabilities. GetRelationships("Msvm_SettingsDefineCapabilities")
12: For Each objSettingsDefineCapabilities As ManagementObject In objSettingsDefineCapabilitiesCollection
13: If objSettingsDefineCapabilities("ValueRole") = 0 Then
14: objDiskDrive = New ManagementObject(objSettingsDefineCapabilities ("PartComponent").ToString())
15: objDiskDrive.Scope = objManagementScope16: End If
17: Next
18: Next
19: Next
20: 21: Dim objSCSIController As ManagementObject = Nothing
22: For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE ResourceType = 6 AND ResourceSubType = 'Microsoft Synthetic SCSI Controller' AND OtherResourceType = null")).Get
23: objDiskDrive("Parent") = objManagementObject.Path.Path
24: objDiskDrive("Address") = 0
25: 26: For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_VirtualSystemManagementService")). Get
27: Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters ("AddVirtualSystemResources")
28: Dim strResourceSettingData As String() = New String(0) {}
29: strResourceSettingData(0) = objDiskDrive.GetText(TextFormat.CimDtd20)30: objParams("ResourceSettingData") = strResourceSettingData
31: objParams("TargetSystem") = objComputerSystem.Path.Path
32: Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod ("AddVirtualSystemResources", objParams, Nothing)
33: If objManagementBaseObject("ReturnValue") = 0 Then
34: objSCSIController = objManagementObject35: End If
36: Next
37: Next
38: 39: Dim objHardDisk As ManagementObject = Nothing
40: For Each objResourcePool As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_ResourcePool WHERE ResourceType = 21 AND ResourceSubType = 'Microsoft Virtual Hard Disk' AND OtherResourceType = null")).Get
41: Dim objAllocationCapabilitiesCollection As ManagementObjectCollection = objResourcePool.GetRelated("Msvm_AllocationCapabilities")
42: For Each objAllocationCapabilities As ManagementObject In objAllocationCapabilitiesCollection
43: Dim objSettingsDefineCapabilitiesCollection As ManagementObjectCollection = objAllocationCapabilities. GetRelationships("Msvm_SettingsDefineCapabilities")
44: For Each objSettingsDefineCapabilities As ManagementObject In objSettingsDefineCapabilitiesCollection
45: If objSettingsDefineCapabilities("ValueRole") = 0 Then
46: objHardDisk = New ManagementObject(objSettingsDefineCapabilities ("PartComponent").ToString())
47: objHardDisk.Scope = objManagementScope48: End If
49: Next
50: Next
51: Next
52: 53: Dim objSCSIDrive As ManagementObject = Nothing
54: For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE Parent = '" & objSCSIController.Path.Path.Replace("\", "\\") & "' AND Address = '0'")).Get
55: objSCSIDrive = objManagementObject56: objHardDisk("Parent") = objSCSIDrive.Path.Path
57: objHardDisk("Connection") = New String(0) {strDiskPath}
58: Next
59: 60: For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
61: Dim objParams As ManagementBaseObject = objVirtualSystemManagementService. GetMethodParameters ("AddVirtualSystemResources")
62: Dim strResourceSettingData As String() = New String(0) {}
63: strResourceSettingData(0) = objHardDisk.GetText(TextFormat.CimDtd20)64: objParams("ResourceSettingData") = strResourceSettingData
65: objParams("TargetSystem") = objComputerSystem.Path.Path
66: Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod ("AddVirtualSystemResources", objParams, Nothing)
67: Return JobComplete(objManagementBaseObject, objManagementScope)
68: Next
69: End Function
1行目:
引数として、ManagementScope オブジェクト、仮想マシン名、ハードディスクとして接続するvhdのファイルパスを渡します。
2〜5行目:
仮想マシン名をキーにして、WMIクエリにてメモリ設定を行なう仮想マシンオブジェクトを取得します。
7行目:
まずは、ディスクドライブオブジェクトを作成します。
8行目:
ディスクドライブオブジェクトを作成する場合は、Hyper-Vのリソース一覧にあるオブジェクトを呼び出し、各パラメーターを設定して作成していきます。Msvm_ResourcePoolクラスには仮想マシンに追加することができるリソースが格納されています。Msvm_ResourcePoolクラスから、ResourceType = 22(Disk)、ResourceSubType = Microsoft Synthetic Disk Drive、OtherResourceType = null といった内容でSQL文でフィルタします。
ResourceTypeについては、こちらに一覧があります。
9〜19行目:
Msvm_AllocationCapabilities オブジェクト(Msvm_AllocationCapabilities)、
Msvm_SettingsDefineCapabilitiesオブジェクトを利用してディスクドライブオブジェクトを取得していきます。ほぼ決まり文句といった感じでこのまま利用することになります。
21〜23行目:
ディスクドライブオブジェクトを接続するSCSIコントローラーを取得します。先ほど作成したすでに接続済みのSCSIコントローラーがありあますので、これを取得します。
24行目:
SCSIコントローラーの0番に接続します。
26行目:
IDEディスクと同様に、Msvm_VirtualSystemManagementService クラスを使用して、ディスクドライブを追加していきます。Msvm_VirtualSystemManagementServiceクラスのオブジェクトの中の一つをFor〜Next文で取り出します。
27行目:
AddVirtualSystemResourcesメソッドを使用して各パラメーターを設定しています。
28〜30行目:
ディスクドライブオブジェクトのXML化した設定情報を、ResourceSettingDataパラメーターに入力します。
31行目:
objComputerSystemパラメーターには、ディスクドライブオブジェクトを追加する仮想マシンを格納したMsvm_ComputerSystemオブジェクトを指定します。
32行目:
AddVirtualSystemResourcesメソッドを、入力したパラメーターの内容で実行します。
33〜34行目:
ディスクドライブの追加に成功したSCSIコントローラーをオブジェクトに格納します。これは、次にvhdのハードディスクを接続するときに使用します。
39行目:
次に、ハードディスクオブジェクトを作成します。作成方法としては、前出のディスクドライブオブジェクトの作成方法と同じです。
40行目:
ハードディスクオブジェクトを作成する場合は、Hyper-Vのリソース一覧にあるオブジェクトを呼び出し、各パラメーターを設定して作成していきます。Msvm_ResourcePoolクラスには仮想マシンに追加することができるリソースが格納されています。Msvm_ResourcePoolクラスから、ResourceType = 21(Storage Extent)、ResourceSubType = Microsoft Virtual Hard Disk、OtherResourceType = null といった内容でSQL文でフィルタします。
ResourceTypeについては、こちらに一覧があります。
41〜51行目:
Msvm_AllocationCapabilities オブジェクト(Msvm_AllocationCapabilities)、 Msvm_SettingsDefineCapabilitiesオブジェクトを利用してディスクドライブオブジェクトを取得していきます。ディスクドライブの作成のときと同様、この部分のコードは解説自体が非常に困難なものとなりますので、ほぼ決まり文句といった感じでこのまま利用することになります。
53行目:
ディスクドライブオブジェクトを格納する変数を定義します。
54行目:
前述のMsvm_ResourceAllocationSettingDataを利用して、SCSIコントローラーの0番に接続されたディスクドライブオブジェクトを抽出します。
56行目:
追加するハードディスクは、先ほど作成したディスクドライブオブジェクトに接続します。
57行目:
追加するハードディスクで使用するvhdファイルのパスを指定します。
60行目:
ディスクドライブオブジェクトを作成したときと同様に、 MMsvm_VirtualSystemManagementService クラスを使用して、ディスクドライブを追加していきます。Msvm_VirtualSystemManagementServiceクラスのオブジェクトの中の一つをFor〜Nextの文で取り出します。
61〜66行目:
AddVirtualSystemResourcesメソッドを使用して追加します。ここからもほぼ定型文のようになっていますので、同様にパラメーターを設定していきます。
67行目:
お約束のJobCompleteを実行してエラーがなければ、Hyper-V上の仮想マシンにSCSIコントローラー0番に接続されたハードディスクが追加されています。
IDEハードディスクに比べ、SCSIコントローラーを追加しなければならない分、ちょっとコードが長くなってしまいますが、基本的にはIDEハードディスクの追加と方法は同じです。
次回は、DVDドライブの追加と、そのドライブにISOイメージファイルをマウントする方法をご紹介します。
『Hyper-Vを使ったクラウドサービスの作り方』完成までもう一息となりました。
今回はハードディスクの追加について解説します。
前回のネットワークアダプタの追加同様、若干難易度の高いコードとなりますが、こちらもある程度パターンに副っていると思ってもらえればよいと思います。(参照:コード01)
[ コード01 ]1: Function SetIDEHardDisk(ByVal objManagementScope As ManagementScope, ByVal strVMName As String, ByVal strDiskPath As String) As Boolean
2: Dim objComputerSystem As ManagementObject = Nothing
3: For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
4: objComputerSystem = objManagementObject5: Next
6: 7: Dim objDiskDrive As ManagementObject = Nothing
8: For Each objResourcePool As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ResourcePool WHERE ResourceType = 22 AND ResourceSubType = 'Microsoft Synthetic Disk Drive' AND OtherResourceType = null")).Get
9: Dim objAllocationCapabilitiesCollection As ManagementObjectCollection = objResourcePool.GetRelated("Msvm_AllocationCapabilities")
10: For Each objAllocationCapabilities As ManagementObject In objAllocationCapabilitiesCollection
11: Dim objSettingsDefineCapabilitiesCollection As ManagementObjectCollection = objAllocationCapabilities.GetRelationships ("Msvm_SettingsDefineCapabilities")
12: For Each objSettingsDefineCapabilities As ManagementObject In objSettingsDefineCapabilitiesCollection
13: If objSettingsDefineCapabilities("ValueRole") = 0 Then
14: objDiskDrive = New"PartComponent").ToString())
15: objDiskDrive.Scope = objManagementScope16: End If
17: Next
18: Next
19: Next
20: 21: Dim objIDEController As ManagementObject = Nothing
22: For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE ResourceType = 5 AND ResourceSubType = 'Microsoft Emulated IDE Controller' AND Address = '0'")).Get
23: objIDEController = objManagementObject24: objDiskDrive("Parent") = objIDEController.Path.Path
25: objDiskDrive("Address") = 0
26: Next
27: 28: For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
29: Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters ("AddVirtualSystemResources")
30: Dim strResourceSettingData As String() = New String(0) {}
31: strResourceSettingData(0) = objDiskDrive.GetText(TextFormat.CimDtd20)32: objParams("ResourceSettingData") = strResourceSettingData
33: objParams("TargetSystem") = objComputerSystem.Path.Path
34: Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod ("AddVirtualSystemResources", objParams, Nothing)
35: Next
36: 37: Dim objHardDisk As ManagementObject = Nothing
38: For Each objResourcePool As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_ResourcePool WHERE ResourceType = 21 AND ResourceSubType = 'Microsoft Virtual Hard Disk' AND OtherResourceType = null")).Get
39: Dim objAllocationCapabilitiesCollection As ManagementObjectCollection = objResourcePool.GetRelated("Msvm_AllocationCapabilities")
40: For Each objAllocationCapabilities As ManagementObject In objAllocationCapabilitiesCollection
41: Dim objSettingsDefineCapabilitiesCollection As ManagementObjectCollection = objAllocationCapabilities.GetRelationships ("Msvm_SettingsDefineCapabilities")
42: For Each objSettingsDefineCapabilities As ManagementObject In objSettingsDefineCapabilitiesCollection
43: If objSettingsDefineCapabilities("ValueRole") = 0 Then
44: objHardDisk = New ManagementObject(objSettingsDefineCapabilities ("PartComponent").ToString())
45: objHardDisk.Scope = objManagementScope46: End If
47: Next
48: Next
49: Next
50: 51: Dim objIDEDrive As ManagementObject = Nothing
52: For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE Parent = '" & objIDEController.Path.Path.Replace ("\", "\\") & "' AND Address = '0'")).Get
53: objIDEDrive = objManagementObject54: objHardDisk("Parent") = objIDEDrive.Path.Path
55: objHardDisk("Connection") = New String(0) {strDiskPath}
56: Next
57: 58: For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery ("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
59: Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters ("AddVirtualSystemResources")
60: Dim strResourceSettingData As String() = New String(0) {}
61: strResourceSettingData(0) = objHardDisk.GetText(TextFormat.CimDtd20)62: objParams("ResourceSettingData") = strResourceSettingData
63: objParams("TargetSystem") = objComputerSystem.Path.Path
64: Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod ("AddVirtualSystemResources", objParams, Nothing)
65: Return JobComplete(objManagementBaseObject, objManagementScope)
66: Next
67: End Function
1行目:
引数として、ManagementScope オブジェクト、仮想マシン名、ハードディスクとして接続するvhdのファイルパスを渡します。
2〜5行目:
仮想マシン名をキーにして、WMIクエリにてメモリ設定を行なう仮想マシンオブジェクトを取得します。
ここまでは前回までと同様のパターンとなります。
さて、ここからはハードディスク関連のオブジェクトの取り扱いになります。 IDEハードディスクの追加の手順としては、ディスクドライブオブジェトを作成し、IDEコントローラーに接続、次にvhdファイルパスを指定してハードディスクオブジェクトを作成します。最後に、ハードディスクオブジェクトを、ディスクドライブオブジェクトに接続する、という手順になります。
7行目:
まずはディスクドライブオブジェクトを作成します。
8行目:
ディスクドライブオブジェクトを作成する場合は、Hyper-Vのリソース一覧にあるオブジェクトを呼び出し、各パラメーターを設定して作成していきます。
Msvm_ResourcePoolクラスには仮想マシンに追加することができるリソースが格納されています。
Msvm_ResourcePoolクラスから、ResourceType = 22(Disk)、
ResourceSubType = Microsoft Synthetic Disk Drive、
OtherResourceType = null という内容でSQL文でフィルタします。
ResourceTypeについては、こちらに一覧があります。
9〜19行目
Msvm_AllocationCapabilities オブジェクト(Msvm_AllocationCapabilities)、Msvm_SettingsDefineCapabilitiesオブジェクトを利用してディスクドライブオブジェクトを取得していきますが、ネットワークアダプタの追加のときと同様、この部分のコードは解説自体が非常に困難なものとなりますので、ほぼ決まり文句といった感じでこのまま利用することになります。
21行目:
ディスクドライブオブジェクトを接続するIDEコントローラーを取得します。IDEコントローラーは仮想マシンの骨組みが作成された時点で自動的に追加されていますので、改めて作成、追加する必要はありません。
22行目:
すでに作成、追加されている仮想マシンのオブジェクトはMsvm_ResourceAllocationSettingDataオブジェクトの中に格納されていますので、ResourceType = 5(IDE Controller)、ResourceSubType = Microsoft Emulated IDE Controller、
Address = 0という内容のSQL文でフィルタします。
Address = 0というのは、IDEコントローラーの番号となります。
今回はIDEコントローラーの0番にディスクドライブオブジェクトを接続します。
23〜26行目:
先ほど作成したディスクドライブオブジェクトをIDEコントローラーに接続するように指定します。
28行目:
仮想マシン作成時同様に、Msvm_VirtualSystemManagementService クラスを使用して、ディスクドライブを追加していきます。Msvm_VirtualSystemManagementServiceクラスのオブジェクトの中の一つをFor〜Next文で取り出します。
29行目:
AddVirtualSystemResourcesメソッドを使用して、各パラメータを設定します。
30〜32行目:
ディスクドライブオブジェクトのXML化した設定情報を、ResourceSettingDataパラメーターに入力します。
33行目:
ComputerSystemパラメーターには、ディスクドライブオブジェクトを追加する仮想マシンを格納したMsvm_ComputerSystemオブジェクトを指定します。
34行目:
AddVirtualSystemResourcesメソッドを、入力したパラメーターの内容で実行します。
38行目:
ハードディスクオブジェクトを作成する場合は、Hyper-Vのリソース一覧にあるオブジェクトを呼び出し、各パラメーターを設定して作成していきます。
Msvm_ResourcePoolクラスには仮想マシンに追加することができるリソースが格納されています。
Msvm_ResourcePoolクラスから、ResourceType = 21(Storage Extent)、
ResourceSubType = Microsoft Virtual Hard Disk、OtherResourceType = null という内容のSQL文でフィルタします。
ResourceTypeについては、こちらに一覧があります。
39〜49行目:
Msvm_AllocationCapabilities オブジェクト(Msvm_AllocationCapabilities)、Msvm_SettingsDefineCapabilitiesオブジェクトを利用してディスクドライブオブジェクトを取得していきます。ディスクドライブの作成のときと同様、この部分のコードは解説自体が非常に困難なものとなりますので、ほぼ決まり文句といった感じでこのまま利用することになります。先ほど作成して、追加したディスクドライブオブジェクトを呼び出して、作成したハードディスクオブジェクトを接続します。
51行目:
ディスクドライブオブジェクトを格納する変数を定義します。
52行目:
前述のMsvm_ResourceAllocationSettingDataを利用して、IDEコントローラーの0番に接続されたディスクドライブオブジェクトを抽出します。
54行目:
追加するハードディスクは、先ほど作成したディスクドライブオブジェクトに接続します。
55行目:
追加するハードディスクで使用するvhdファイルのパスを指定します。
58行目:
ディスクドライブオブジェクトを作成したときと同様に、Msvm_VirtualSystemManagementService クラスを使用して、ディスクドライブを追加していきます。Msvm_VirtualSystemManagementServiceクラスのオブジェクトの中の一つをFor〜Next文で取り出します。
59〜66行目:
AddVirtualSystemResourcesメソッドを使用して追加します。ここからもほぼ定型文のようになっていますので、同様にパラメータを設定していきます。
以上で、エラーが出ること無くコードが走れば、Hyper-V上の仮想マシンにIDEコントローラー0番に接続されたハードディスクが追加されています。
今回でひととおり、仮想マシンのブロビジョニングが完了したことになります。
このほかにもWMI経由では、DVDドライブの追加や、ISOイメージファイルのマウント、VLANIDの設定など、仮想マシンに対して様々なことが設定可能となっています。その他細かい設定も順次ご紹介していく予定ですので、ご期待ください。
久々ですが、覚書がてらすでに接続されているVHDのファイルパスの変更方法です。
1: Option Explicit
2: 3: Dim strServerName, strVMName, objWMIService, objManagementServicestrServerName = "."
4: strVMName = "TestVM"
5: Set objWMIService = GetObject("winmgmts:\\" & strServerName & "\root\virtualization")
6: Set objManagementService = objWMIService.ExecQuery("SELECT * FROM Msvm_VirtualSystemManagementService").ItemIndex(0)
7: 8: Call ChangeVhd(strVMName, "NewVhdPath.vhd")
9: 10: Sub ChangeVhd(strVMName, strDiskPath)
11: Dim objComputerSystem, objVirSettingDatas, objVirSettingData, objVirSettingDatas, objResSettingDatas, objResSettingData, objHardDisk
12: Set objComputerSystem = objWMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'").ItemIndex(0)
13: 14: Set objVirSettingDatas = objWMIService.ExecQuery("SELECT * FROM Msvm_VirtualSystemSettingData WHERE ElementName = '" & strVMName & "'")
15: 16: For Each objVirSettingData In objVirSettingDatas
17: Set objResSettingDatas = objWMIService.ExecQuery("ASSOCIATORS OF {Msvm_VirtualSystemSettingData='" & objVirSettingData.InstanceID & "'} WHERE ResultClass = Msvm_ResourceAllocationSettingData")
18: 19: For Each objResSettingData In objResSettingDatas
20: If objResSettingData.ResourceSubType = "Microsoft Virtual Hard Disk" Then
21: Set objHardDisk = objResSettingData
22: objHardDisk.Connection(0) = strDiskPath23: End If
24: Next
25: Next
26: 27: Dim strResourceSettingData
28: strResourceSettingData = Array(1) 29: strResourceSettingData(0) = objHardDisk.GetText_(1) 30: Dim objInParam, objOutParams
31: Set objInParam = objManagementService.Methods_("ModifyVirtualSystemResources").InParameters.SpawnInstance_()
32: objInParam.ResourceSettingData = strResourceSettingData 33: objInParam.ComputerSystem = objComputerSystem.Path_.Path34: Set objOutParams = objManagementService.ExecMethod_("ModifyVirtualSystemResources", objInParam)
35: 36: Call JobCompleted(objOutParams, objWMIService)
37: End Sub
38: 39: Function JobCompleted(objOutParams, objWMIService)
40: Dim objJob
41: If (objOutParams.ReturnValue = 0) Then
42: Wscript.Echo "OK"
43: ElseIf (objOutParams.ReturnValue <> 4096) Then
44: Wscript.Echo "NG"
45: Else
46: Set objJob = objWMIService.Get(objOutParams.Job)
47: While (objJob.JobState = 3) Or (objJob.JobState = 4)
48: WScript.Sleep(1000) 49: Set objJob = objWMIService.Get(objOutParams.Job)
50: Wend
51: If (objJob.JobState <> 7) Then
52: Wscript.Echo "NG"
53: Wscript.Echo "ErrorCode:" & objJob.ErrorCode
54: Wscript.Echo "ErrorDescription:" & objJob.ErrorDescription
55: Else
56: Wscript.Echo "OK"
57: End If
58: End If
59: End Function
こんな感じですね。
Author:WIN1
