WIN1@Codename

Codename (http://codename.win1.jp/)

News

無料お試しサービス Codename(http://codename.win1.jp/) からスピンアウトしてきたました。

【無償オンライントレーニング】ポイント獲得で Amazon® ギフト券を入手!

マイクロソフトの最新製品、テクノロジのトレーニングを提供する、無償オンライン トレーニング サイト
Microsoft Virtual Academy (MVA) のご紹介です。

現在受講内容に応じて付与されるポイントを集めると、Amazon ギフト券が手に入るキャンペーンを実施中です。
 
ポイントを集めて、スキルアップしながらギフト券にチャレンジしてみませんか?
 
▼ 5 月末日まで! キャンペーン詳細を確認 ▼
http://go.microsoft.com/?linkid=9807668
 
選手権には、個人戦と団体戦の 2 種類があり、団体戦は上位 100 チームには “もれなく” ギフト券が進呈されます。
個人戦と団体戦は重複してのエントリーが可能ですので、職場の同僚やご友人を誘いながら、ぜひダブルでチャンスを狙ってください。

20123226100407

Hyper-Vを使ったクラウドサービスの作り方 Vol.7 -Hyper-V Provisioning SCSIハードディスクの追加-

前回までのプロビジョニングで、とりあえずの仮想マシンができあがりました。基本的なCPU、メモリ、ハードディスク、ネットワークアダプタが実装されています。Hyper-Vの仮想マシンはこの他にも、SCSIハードディスクや、DVDドライブなどの追加装備が実装可能です。今回は、この追加装備の一つであるSCSIハードディスクのプロビジョニング方法をご紹介します。


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 = objManagementObject
   5:  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 = objManagementObject
  10:  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コントローラーが追加されます。


SCSIハードディスクの追加方法
次に、SCSIハードディスクを追加していきましょう。SCSIハードディスクの追加は、IDEハードディスクの追加方法とほぼ同様の方法です。ディスクドライブオブジェクトを作成し、SCSIコントローラーに追加して、vhdハードディスクを接続します。

[ コード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 = objManagementObject
   5:  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 = objManagementScope
  16:  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 = objManagementObject
  35:  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 = objManagementScope
  48:  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 = objManagementObject
  56:  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を使ったクラウドサービスの作り方 Vol.6 -Hyper-V Provisioning IDEハードディスクの追加-

『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 = objManagementObject
   5:  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 = objManagementScope
  16:  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 = objManagementObject
  24:  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 = objManagementScope
  46:  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 = objManagementObject
  54:  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の設定など、仮想マシンに対して様々なことが設定可能となっています。その他細かい設定も順次ご紹介していく予定ですので、ご期待ください。



Hyper-V をプログラムでどうにかしてみる VBScript その16 (VHDの変更)

久々ですが、覚書がてらすでに接続されている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) = strDiskPath
  23:              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_.Path
  34:      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

こんな感じですね。

次のページ

FC2Ad

FC2ブログ