WIN1@Codename

Codename

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Hyper-V をプログラムでどうにかしてみる その9 (ネットワークの設定)

引き続き、今回はネットワークの設定となります。
だんだんとコードが長くなってきておりますが、とりあえず動くものをということであまり意味は考えず行ってみましょう。

Dim objConnectionOptions As New ConnectionOptions()
objConnectionOptions.Impersonation = ImpersonationLevel.Impersonate
objConnectionOptions.EnablePrivileges = True
objConnectionOptions.Username = strAccount
objConnectionOptions.Password = strPassword
Dim objManagementScope As New ManagementScope("\\" + strServer + "\root\virtualization", objConnectionOptions)
objManagementScope.Connect()

Dim objComputerSystem As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = 'TestVM'")).Get
    objComputerSystem = objManagementObject
Next

Dim objVirtualSwitchManagementService As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSwitchManagementService")).Get
    objVirtualSwitchManagementService = objManagementObject
Next

Dim objVirtualSwitch As ManagementObject = Nothing
Dim objSwitchPort As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSwitch WHERE ElementName = 'TestVM'")).Get
    objVirtualSwitch = objManagementObject
    Dim objParams As ManagementBaseObject = objVirtualSwitchManagementService.GetMethodParameters("CreateSwitchPort")
    objParams("Name") = DateTime.Now.ToString("yyymmddhhmmss") 'ユニークな名前とするためタイムスタンプを使用
    objParams("FriendlyName") = "LAN"
    objParams("VirtualSwitch") = objVirtualSwitch.Path.Path
    Dim objManagementBaseObject As ManagementBaseObject = objVirtualSwitchManagementService.InvokeMethod("CreateSwitchPort", objParams, Nothing)
    Console.WriteLine(objManagementBaseObject("ReturnValue"))
    objSwitchPort = New ManagementObject(objManagementScope, New ManagementPath(objManagementBaseObject("CreatedSwitchPort").ToString), Nothing)
Next

Dim objEmulatedEthernetPortSettingData As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_EmulatedEthernetPortSettingData WHERE InstanceID like '%Default%'")).Get
    objEmulatedEthernetPortSettingData = objManagementObject
Next

Dim objDefaultNic As ManagementObject = Nothing
For Each objResourcePool As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ResourcePool WHERE ResourceType = 10 AND ResourceSubType = 'Microsoft Emulated Ethernet Port' AND OtherResourceType = null")).Get
    Dim objAllocationCapabilitiesCollection As ManagementObjectCollection = objResourcePool.GetRelated("Msvm_AllocationCapabilities")
    For Each objAllocationCapabilities As ManagementObject In objAllocationCapabilitiesCollection
Dim objSettingsDefineCapabilitiesCollection As ManagementObjectCollection = objAllocationCapabilities.GetRelationships("Msvm_SettingsDefineCapabilities")

For Each objSettingsDefineCapabilities As ManagementObject In objSettingsDefineCapabilitiesCollection
    If objSettingsDefineCapabilities("ValueRole") = 0 Then
objDefaultNic = New ManagementObject(objSettingsDefineCapabilities("PartComponent").ToString())
objDefaultNic.Scope = objManagementScope
    End If
Next
    Next
Next

For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
    Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("AddVirtualSystemResources")
    objDefaultNic("Connection") = New String() {objSwitchPort.Path.Path}
    objDefaultNic("StaticMacAddress") = False
    objDefaultNic("ElementName") = "ネットワーク アダプター"
    Dim strResourcesettingData As String() = New String(0) {}
    strResourcesettingData(0) = objDefaultNic.GetText(TextFormat.CimDtd20)
    objParams("ResourcesettingData") = strResourcesettingData
    objParams("TargetSystem") = objComputerSystem.Path.Path

    Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("AddVirtualSystemResources", objParams, Nothing)
    Dim strJobPath As String = objManagementBaseObject("Job")
    Dim objJob As New ManagementObject(objManagementScope, New ManagementPath(strJobPath), Nothing)
    objJob.Get()
    'ステータスが開始状態になるまで待機する
    Do While objJob("JobState") = 3 Or objJob("JobState") = 4 '3=Starting 4=Running
System.Threading.Thread.Sleep(1000)
objJob.Get()
Console.WriteLine(objJob("JobState"))
    Loop
    If objJob("JobState") <> 0 Then
Console.WriteLine(objJob("ErrorCode"))
Console.WriteLine(objJob("ErrorDescription"))
    End If

    Dim strNewResources As String() = objManagementBaseObject("NewResources")
    Dim objEmulatedNicDefault As New ManagementObject(strNewResources(0))
Next

「TestVM」という仮想マシンに「LAN」と名づけた仮想ネットワーク設定を接続しています。
「LAN」仮想ネットワーク設定は事前にHyper-Vマネージャーの仮想ネットワークマネージャーより作成してあることとします。
今回のポイントは、終わりの方のにあるDo While の部分です。
Invokeメソッドにてネットワーク設定が完了したかと思いきや、完全に使用できるまでは少々時間がかかるようなのでJobStatusが「0」になるまで待機する必要があります。
JobStatusが「0」になれば無事設定完了となります。

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://codename2010.blog11.fc2.com/tb.php/130-f5fe9a64
この記事にトラックバックする(FC2ブログユーザー)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。