WIN1@Codename

Codename

Hyper-V をプログラムでどうにかしてみる その16 (VLAN ID の設定)

Hyper-Vを使用する場合、状況によってはVLANを使用する場合もあるかと思います。
Hyper-Vでは、VLAN ID を割り振ることでVLANを使用することが出来ます。
WMIを使用してVLAN ID を設定してみましょう。

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

Dim objVirtualSystemsettingData As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In objComputerSystem.GetRelated("Msvm_VirtualSystemsettingData")
    objVirtualSystemsettingData = objManagementObject
Next

Dim objVirtualSwitch As ManagementObject = Nothing
Dim strVirtualSwitchName As String = ""
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSwitch WHERE ElementName = '" & strNetworkName & "'")).Get
    objVirtualSwitch = objManagementObject
    strVirtualSwitchName = objVirtualSwitch("Name")
Next

Dim objSyntheticEthernetPortSettingData As ManagementObject = Nothing
Dim objNic As ManagementObject = Nothing
Dim strConnection As String = ""
For Each objManagementObject As ManagementObject In objVirtualSystemsettingData.GetRelated("Msvm_SyntheticEthernetPortSettingData")
    If objManagementObject("ElementName") = "ネットワーク アダプター" Then
        objNic = objManagementObject
        strConnection = objNic("Connection")(0)
    End If
Next

Dim objVLANEndpoint As ManagementObject = Nothing
Dim strVLANEndpointName As String = ""
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VLANEndpoint WHERE SystemName = '新しい仮想ネットワーク'")).Get
    objVLANEndpoint = objManagementObject
    strVLANEndpointName = objVLANEndpoint("Name")
    If InStr(strConnection, strVLANEndpointName) > 0 Then
        Exit For
    End If
Next

Dim objVLANEndpointSettingData As ManagementObject = Nothing
For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VLANEndpointSettingData WHERE InstanceID LIKE '%" & strVLANEndpointName & "'")).Get
    objVLANEndpointSettingData = objManagementObject
    objVLANEndpointSettingData("AccessVLAN") = intVLanID
    objVLANEndpointSettingData.Put()
Next 

今回のポイントは、一番最後の objVLANEndpointSettingData.Put() の部分です。
これまで設定を変更するには、「ModifyVirtualSystemResources」を使用していましたが、VLAN ID に関しては「Put」メソッドで設定完了となります。

共有フォルダ上のvhdを使用して仮想マシンを作成する

Hyper-Vマネージャにて、いわゆるUNCパスを使用して仮想マシンを作成しようとすると、「アクセス権がない」とのエラーにて仮想マシンを作成することができません。
20104514090615

この場合以下の設定で仮想マシンを作成することが可能となります。
ドメイン環境下限定となります。

vhdファイルがある共有フォルダに対し、Hyper-Vを実行しているサーバーのコンピューターアカウントをフルコントロールにて追加します。

仮想マシン作成時にvhdのパスとして、「\\ファイルサーバー名\フォルダ名\○○.vhd」という形式で指定します。

これで作成可能となります。

ただし注意しなければならないのは、Hyper-Vマネージャのリモート管理ツールが使用できなくなるので、リモートデスクトップで接続管理をしなければなりません。

参考元:
http://www.gilham.org/Blog/Lists/Posts/Post.aspx?List=aab85845%2D88d2%2D4091%2D8088%2Da6bbce0a4304&ID=283

Hyper-V をプログラムでどうにかしてみる その15 (SCSIディスクの追加)

前回SCSIコントローラを仮想マシンに追加しましたので、こちらにvhdディスクをマウントしてみます。

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

Dim objDiskDrive As ManagementObject = Nothing
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
    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
    objDiskDrive = New ManagementObject(objSettingsDefineCapabilities("PartComponent").ToString())
    objDiskDrive.Scope = objManagementScope
End If
        Next
    Next
Next

Dim objSCSIController As ManagementObject = Nothing
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
    objSCSIController = objManagementObject
    objDiskDrive("Parent") = objSCSIController.Path.Path
    objDiskDrive("Address") = 0
    If objSCSIController("InstanceID").ToString.EndsWith("0") Then Exit For
Next

For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
    Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("AddVirtualSystemResources")
    Dim strResourceSettingData As String() = New String(0) {}
    strResourceSettingData(0) = objDiskDrive.GetText(TextFormat.CimDtd20)
    objParams("ResourceSettingData") = strResourceSettingData
    objParams("TargetSystem") = objComputerSystem.Path.Path
    Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("AddVirtualSystemResources", objParams, Nothing)
Next

Dim objHardDisk As ManagementObject = Nothing
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
    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
    objHardDisk = New ManagementObject(objSettingsDefineCapabilities("PartComponent").ToString())
    objHardDisk.Scope = objManagementScope
End If
        Next
    Next
Next

Dim objSCSIDrive As ManagementObject = Nothing
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
    objSCSIDrive = objManagementObject
    objHardDisk("Parent") = objSCSIDrive.Path.Path
    objHardDisk("Connection") = New String(0) {strDiskPath}
Next

For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
    Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("AddVirtualSystemResources")
    Dim strResourceSettingData As String() = New String(0) {}
    strResourceSettingData(0) = objHardDisk.GetText(TextFormat.CimDtd20)
    objParams("ResourceSettingData") = strResourceSettingData
    objParams("TargetSystem") = objComputerSystem.Path.Path
    Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("AddVirtualSystemResources", objParams, Nothing)
Next 

SCSIコントローラーさえ出来ていればIDEのハードディスクをマウントする方法と同じです。
SCSI接続であれば、ホットスワップができるので、使い方次第ではvhdファイルを使ってのファイルの受け渡しなどいろいろできそうです。

Hyper-V をプログラムでどうにかしてみる その14 (SCSIコントローラーの追加)

Hyper-V2.0よりSCSI接続のディスクであれば、仮想マシンが稼働中でも接続したり、外したりとホットスワップに対応しました。
今回は、こちらの機能をプログラムでどうにかしてみようということで。

まずは、SCSIコントローラーを追加します。

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

Dim objDiskDrive As ManagementObject = Nothing
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
    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
    objDiskDrive = New ManagementObject(objSettingsDefineCapabilities("PartComponent").ToString())
    objDiskDrive.Scope = objManagementScope
End If
        Next
    Next
Next

Dim objSCSIController As ManagementObject = Nothing
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
    objSCSIController = objManagementObject
    objSCSIController("ElementName") = "SCSI コントローラー"
Next

For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
    Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("AddVirtualSystemResources")
    Dim strResourceSettingData As String() = New String(0) {}
    strResourceSettingData(0) = objSCSIController.GetText(TextFormat.CimDtd20)
    objParams("ResourceSettingData") = strResourceSettingData
    objParams("TargetSystem") = objComputerSystem.Path.Path
    Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("AddVirtualSystemResources", objParams, Nothing)
Next

次回はこの作成したSCSIコントローラーにvhdハードディスクを接続してみます。

WindowsServer2008R2 のリモートデスクトップでAeroグラスを使う方法(追記3)

Windows7 から WindowsServer2008R2 にリモートデスクトップで接続した場合、あらかじめローカルログオンをしてAeroGlassを有効にしておく必要がありましたが、以下の設定でリモートデスクトップの接続先からでも自由にAeroGlassのON,OFFを設定できるようになります。

レジストリエディタにて、
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\ThemeManager
を開きます。
もしこのとき、ThemeManagerキーの下に何かサブキーがある場合は削除します。
ThemeManagerキーを右クリックして、「アクセス許可」を選択します。
20104105020623

リモートデスクトップで接続するユーザーを選択し、「詳細設定」を選択します。
20104305020618

該当するユーザーを選択し、「編集」を選択します。
アクセス許可一覧から、「サブキーの作成」の「拒否」のチェックボックスを選択します。
20104405020604

これで設定完了です。

この状態でリモートデスクトップに接続してみると、
20104705020653

これまでグレーアウトしていたAeroテーマが選択できるようになりました。

WindowsServer2008R2 のリモートデスクトップでAeroグラスを使う方法(追記2)

サーバー側の設定は以前紹介しましたが、接続する側のクライアントの設定を紹介します。
リモートデスクトップでエアログラスを有効にするには、リモートデスクトップの7.0が必要となります。
http://support.microsoft.com/kb/969084

こちらをダウンロードして、リモートデスクトップクライアントを起動します。

設定項目のポイントとしては、画面の色を32ビット
20105003030653

パフォーマンスをLANの設定にします。
20105103030603

この設定で接続するとエアログラスを使うことが出来るようになります。

FC2Ad