WIN1@Codename

Codename

スポンサーサイト

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

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

TechNetの方でDVDのマウントを自動で行いたいとの質問があったので、このシリーズに追加してみました。

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 objDiskDrive As ManagementObject = Nothing
For Each objResourcePool As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ResourcePool WHERE ResourceType = 16 AND ResourceSubType = 'Microsoft Synthetic DVD 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 objIDEController As ManagementObject = Nothing
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 = '1'")).Get
    objIDEController = objManagementObject
    objDiskDrive("Parent") = objIDEController.Path.Path
    objDiskDrive("Address") = 0
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 objDVD 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 CD/DVD 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
objDVD = New ManagementObject(objSettingsDefineCapabilities("PartComponent").ToString())
objDVD.Scope = objManagementScope
    End If
Next
    Next
Next

Dim objIDEDrive As ManagementObject = Nothing
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
    objIDEDrive = objManagementObject
    objDVD("Parent") = objIDEDrive.Path.Path
    objDVD("Connection") = New String(0) {"C:\Hyper-V\TestVM.iso"}
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) = objDVD.GetText(TextFormat.CimDtd20)
    objParams("ResourcesettingData") = strResourcesettingData
    objParams("TargetSystem") = objComputerSystem.Path.Path
    Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("AddVirtualSystemResources", objParams, Nothing)
    Console.WriteLine("SetHardDisk=" & objManagementBaseObject("ReturnValue"))
Next 

「TestVM」という名前の仮想マシンのIDEコントローラー1番ににDVDドライブを追加、「TestVM.iso」というISOイメージディスクを読み込ませています。
大まかな流れとしては、まずIDEコントローラーの1番を取得します。
取得したコントローラーの1番にDVDドライブを接続しています。
20103629060455

ほとんどハードディスクの追加と同じ手順ですね。
今回も細かい説明は省いていますが、詳細などなんなりとご質問ください。

スポンサーサイト

差分仮想ハードディスクは容量拡大(ボリューム拡張)ができない

検証で使っている仮想マシンのWindows7のディスクの空き容量がそろそろ心もとなくなってきたので、ボリュームの拡張をしようと。
20105622040435

Windows7やWindowsServer2008R2ではディスクの管理からボリュームの拡張をすることができます。 この機能と仮想ハードディスクの拡張を組み合わせることで、簡単に仮想マシンのボリューム拡張ができるはずです。 
検証で使用している仮想マシンのWindows7は差分ハードディスクを使用しています。 なので、まずは差分仮想ハードディスクの親仮想ハードディスクのボリュームを拡張を行います。 vhdファイルの読み取り専用のプロパティーを解除してHype-Vマネージャーから「ディスクの編集」-「拡張」を選択して容量を増やします。
20100322050428
とりあえず成功。
あとは、仮想マシンを起動して「ディスクの管理」から「ボリュームの拡張」を実行するだけです。

いざ、起動・・・ おっとエラーです。
20101322050429

えーと、つまり親仮想ハードディスクの容量が変わってしまったので、起動できないということらしぃです・・・。
と、いうことで差分仮想ハードディスクを使用している場合は容量拡大(ボリューム拡張)ができないということになるようです。

こうなると、改めてボリューム拡張したvhdを元に、差分仮想ハードディスクを作成しなおすしか方法はないようです。 残念。

アプリケーションプールのセキュリティーアカウントとASP.NET偽装(その2)

以前「アプリケーションプールのセキュリティーアカウントとASP.NET偽装」の記事を書きましたが、追加の覚え書きとして(その2)です。

まず、現在の実行アカウントを知りたい場合は、
Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name)
で取得できます。

匿名認証のみ有効にした場合だと、 IIS APPPOOL\<サイト名> となります。
20105916090414

次に、基本認証のみ有効にした場合は、認証ダイアログが表示されるものの、匿名認証のみと同様に IIS APPPOOL\<サイト名> となります。
20100016100456
感覚的には、認証ダイアログで入力したアカウントが表示されるような気がするのですが、あくまでもアプリケーションプールの実行アカウントがサイトを動かしているということなので、こちらが正しい表示となります。

そこで、ASP.NET偽造を有効にすると、思惑通り認証に使用したアカウントが表示されます。
 20101016100437

では、こんな場合は?
匿名認証・ASP.NET偽装を有効にして、ASP.NET偽装の特定のユーザーを指定した場合。
この場合は、指定した特定ユーザーとなります。
 20101416100406

ではでは、これは??
基本認証・ASP.NET偽装を有効にして、ASP.NET偽装の特定のユーザーを指定した場合。
認証ダイアログにはASP.NET偽装の特定のユーザーに使用したアカウントとは別のものを使用します。
こちらは、ASP.NET偽装の特定のユーザーとなりました。
20102316100422 20102216100403

 

ちなみに、ASP.NET偽装の特定のユーザー の設定内容は web.config の
<identity impersonate="true" userName="" password="" />
セクションに連動しているので、IISマネージャーの設定内容により自動的にweb.configが書きかえれれます。

Hyper-V をプログラムでどうにかしてみる その10 (ハードディスクの設定)

ようやく仮想マシンの作成も最終ステップとなりました。
ハードディスクの設定が最後になります。
最後の最後が一番複雑なコードになっています。

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 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 objIDEController As ManagementObject = Nothing
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
    objIDEController = objManagementObject
    objDiskDrive("Parent") = objIDEController.Path.Path
    objDiskDrive("Address") = 0
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 objIDEDrive As ManagementObject = Nothing
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
    objIDEDrive = objManagementObject
    objHardDisk("Parent") = objIDEDrive.Path.Path
    objHardDisk("Connection") = New String(0) {"C:\Hyper-V\TestVM.vhd"}
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)
    Console.WriteLine("SetHardDisk=" & objManagementBaseObject("ReturnValue"))
Next 

「TestVM」という名前の仮想マシンに、「TestVM.vhd」という仮想ハードディスクを接続しています。
大まかな流れとしては、まずIDEコントローラーの0番を取得します。
取得したコントローラーの0番にvhdを接続しています。
20100916100400

と、いうことでひとまず仮想マシンの一通りの設定が完了しました。
今回も細かい説明は省いていますが、詳細などなんなりとご質問ください。

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」になれば無事設定完了となります。

Hyper-V をプログラムでどうにかしてみる その8 (メモリの設定)

前回は骨組みとなる仮想マシンを作成しました。
前回のプログラム実行後であれば、仮想マシン、CPU、メモリが実装された状態をHyper-Vマネージャーから確認することができると思います。
今回は、メモリの搭載値を任意に設定するプログラムとなります。

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 = 'TetVM'")).Get
    objComputerSystem = objManagementObject
Next

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

Dim strMemorySettingData As String = ""
Dim objMemorySettingDataCollection As ManagementObjectCollection = objVirtualSystemSettingData.GetRelated("Msvm_MemorySettingData")
For Each objManagementObject As ManagementObject In objMemorySettingDataCollection
    objManagementObject("VirtualQuantity") = 512
    strMemorySettingData = objManagementObject.GetText(TextFormat.CimDtd20)
Next

For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
    Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("ModifyVirtualSystemResources")
    objParams("ResourcesettingData") = New String() {strMemorySettingData}
    objParams("ComputerSystem") = objComputerSystem.Path.Path
    Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("ModifyVirtualSystemResources", objParams, Nothing)
    Console.WriteLine("SetMemory=" & objManagementBaseObject("ReturnValue"))
Next

前回作成した「TestVM」という仮想マシンに512MBのメモリを割り当てています。 

FC2Ad

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