トップ回答者
「Hyper-V」コマンド操作でisoイメージをマウント

質問
回答
-
- 回答としてマーク kuukun 2010年4月30日 0:58
-
こんにちは。
RemoveVirtualSystemResourcesのサンプルはここにあります。
http://blogs.msdn.com/virtual_pc_guy/default.aspx
サンプルからisoのアンマウント部分だけを抜き出して実行したところ、isoをアンマウントできました。
確認した環境は、Windows Server 2008 R2 Enterprise English です。- 確認環境
Host OS のコンピュータ名 : VMHost
Guest OS のコンピュータ名 : VM-1
Guest OS には、E:\ISO\test.iso をマウント中です。( 下記Powershellの$existingRASD.Connectionにisoのパスが読み込まれます)----PowerShellの実行コマンド-----
PS C:\> $HyperVServer = 'VMHost'
PS C:\> $VMName ='VM-1'
PS C:\> $VMMS = gwmi -namespace root\virtualization Msvm_VirtualSystemManagementService -computername $HyperVServer
PS C:\> $VM = gwmi MSVM_ComputerSystem -filter "ElementName='$VMName'" -namespace "root\virtualization" -computername $HyperVServer
PS C:\> $SystemSettingData = $VM.getRelated("Msvm_VirtualSystemSettingData") | where {$_.SettingType-eq 3}
PS C:\> $DVDDrive = $SystemSettingData.getRelated("Msvm_ResourceAllocationSettingData") | where{$_.ResourceType -eq 16} | select -first 1
PS C:\> $existingRASD = $SystemSettingData.getRelated("Msvm_ResourceAllocationSettingData") | where {$_.Parent -eq $DVDDrive.__Path}
PS C:\> $existingRASD.Connection
E:\ISO\test.isoPS C:\> $result1 = $VMMS.RemoveVirtualSystemResources($VM, @($existingRASD))
- 回答としてマーク kuukun 2010年5月6日 8:52
すべての返信
-
- 回答としてマーク kuukun 2010年4月30日 0:58
-
ちょうどHyper-Vに対してのプログラムからのアプローチをあれこれやっていたので、HDDの接続の応用でやってみました。
http://codename2010.blog11.fc2.com/blog-entry-134.html
Hyper-Vに対するディスクへのアプローチは一番複雑な手順を踏むことになっていますのでコードがかなり長くなってしまいました。
手順としては
・設定を行う仮想マシンの取得
・IDEコントローラーの取得
・DVDドライブの作成
・ISOイメージのマウント
と、いった感じです。
細かい説明を省いているのでご質問などは何なりと。
WIN1 -
こんにちは。
AddVirtualSystemResourcesでイメージファイルをマウント可能なようですので、RemoveVirtualSystemResourcesでアンマウントになると思います。
http://msdn.microsoft.com/en-us/library/cc160711(v=VS.85).aspx
-
ModifyVirtualSystemResources で別のisoイメージにマウントしなおすことはできたのですが、isoを外そうとしてみましたが、"Connection"プロパティーの部分を"Nothing"にしたとしても、解除できませんでした。
次に、RemoveVirtualSystemResources でisoの接続自体を削除しようといろいろ試してみたのですが、うまくいきません。
RemoveVirtualSystemResources は有用なサンプルもないようですし、isoのみならず、HDDなども同様にうまくいかないので根本的な問題があるかもしれません。
WIN1 -
こんにちは。
RemoveVirtualSystemResourcesのサンプルはここにあります。
http://blogs.msdn.com/virtual_pc_guy/default.aspx
サンプルからisoのアンマウント部分だけを抜き出して実行したところ、isoをアンマウントできました。
確認した環境は、Windows Server 2008 R2 Enterprise English です。- 確認環境
Host OS のコンピュータ名 : VMHost
Guest OS のコンピュータ名 : VM-1
Guest OS には、E:\ISO\test.iso をマウント中です。( 下記Powershellの$existingRASD.Connectionにisoのパスが読み込まれます)----PowerShellの実行コマンド-----
PS C:\> $HyperVServer = 'VMHost'
PS C:\> $VMName ='VM-1'
PS C:\> $VMMS = gwmi -namespace root\virtualization Msvm_VirtualSystemManagementService -computername $HyperVServer
PS C:\> $VM = gwmi MSVM_ComputerSystem -filter "ElementName='$VMName'" -namespace "root\virtualization" -computername $HyperVServer
PS C:\> $SystemSettingData = $VM.getRelated("Msvm_VirtualSystemSettingData") | where {$_.SettingType-eq 3}
PS C:\> $DVDDrive = $SystemSettingData.getRelated("Msvm_ResourceAllocationSettingData") | where{$_.ResourceType -eq 16} | select -first 1
PS C:\> $existingRASD = $SystemSettingData.getRelated("Msvm_ResourceAllocationSettingData") | where {$_.Parent -eq $DVDDrive.__Path}
PS C:\> $existingRASD.Connection
E:\ISO\test.isoPS C:\> $result1 = $VMMS.RemoveVirtualSystemResources($VM, @($existingRASD))
- 回答としてマーク kuukun 2010年5月6日 8:52
-
こんにちは..
既にサンプルが掲示されていますが..
RemoveVirtualSystemResources
AddVirtualSystemResources
は、 スナップショットでいう "現在" (R1では今すぐ実行) に対してしか実行できません。
Msvm_VirtualSystemSettingData は スナップショットの数(+現在) の数だけあるので、
$_.SettingType-eq 3 のように、"現在" を特定した上で、
それに対して、 RemoveVirtualSystemResources, AddVirtualSystemResources する必要があります。
スナップショットを作成していない場合でも、"現在" は必ず存在しますので、 SettingType == 3 で絞り込むのは万能の方法です。
-
RemoveVirtualSystemResources のPowerShell以外での呼び出しがなんとかできました。
http://codename2010.blog11.fc2.com/blog-entry-138.html
でも、PowerShellのほうが何かと面倒な手続きが簡略化されているので気軽に使うにはよいのかなと。
WIN1 -
こんにちは。
試しにVBSを作成してみました。
以下をコピーし、拡張子をvbsにして実行してみて下さい。一時間ぐらいで作成したので、エラー処理などは最小限です。予期しない動作をするかもしれませんが、そこまでは確認できていません。
構文は cscript <vbsファイル> <VM> です。例: Guest OS のコンピュータ名がVM-1 の場合は以下のコマンド
cscript <vbsファイル> VM-1--------vbsサンプル-------------
option explicitdim objWMIService
dim managementService
dim fileSystem
dim strVM
Main()Sub Main()
dim computer, vm , objArgsset objArgs = WScript.Arguments
if WScript.Arguments.Count = 1 then
strVM = objArgs.Unnamed.Item(0)
else
WScript.Echo "usage: cscript vbs vmName"
WScript.Quit(1)
end if
set fileSystem = Wscript.CreateObject("Scripting.FileSystemObject")
computer = "."
set objWMIService = GetObject("winmgmts:\\" & computer & "\root\virtualization")
set managementService = objWMIService.ExecQuery("select * from Msvm_VirtualSystemManagementService").ItemIndex(0)
set vm = GetComputerSystem(strVM)
RemoveVirtualSystemResources(vm)End Sub
Function GetComputerSystem(vmElementName)
On Error Resume Next
dim query
query = Format1("select * from Msvm_ComputerSystem where ElementName = '{0}'", vmElementName)
set GetComputerSystem = objWMIService.ExecQuery(query).ItemIndex(0)
if (Err.Number <> 0) then
WScript.Quit(1)
end ifEnd Function
Function GetDvDSetting(vmSetting)dim query, DvDsettingsData, DvdData
set GetDvDSetting = Nothing
query = Format1("ASSOCIATORS OF {{0}} WHERE " &_
"resultClass = Msvm_ResourceAllocationSettingData " &_
"AssocClass = Msvm_VirtualSystemSettingDataComponent " &_
"ResultRole = PartComponent " &_
"Role = GroupComponent", vmSetting.Path_.Path)
set DvDsettingsData = objWMIService.ExecQuery(query)
for each DvdData in DvDsettingsData
If DvdData.ResourceSubType = "Microsoft Virtual CD/DVD Disk" Then
set GetDvDSetting = DvdData
exit function
end if
nextEnd Function
Function RemoveVirtualSystemResources(computerSystem)dim query, virtualSystemSetting, DvDsettingData
dim resourcesettings, objInParam, objOutParams
RemoveVirtualSystemResources = false
query = Format1("ASSOCIATORS OF {{0}} WHERE resultClass = Msvm_VirtualSystemsettingData", computerSystem.Path_.Path)
set virtualSystemSetting = objWMIService.ExecQuery(query).ItemIndex(0)WScript.Echo "ElementName: " & virtualSystemSetting.ElementName
set DvDsettingData = GetDVDSetting(virtualSystemSetting)if (DvDsettingData Is Nothing) then
WScript.Echo "DVD is not mounted "
exit function
end if
resourcesettings = Array(1)
resourcesettings(0) = DvDsettingData.Path_.Path
set objInParam = managementService.Methods_("RemoveVirtualSystemResources").InParameters.SpawnInstance_()'
objInParam.TargetSystem = computerSystem.Path_.Path
objInParam.ResourcesettingData = resourcesettings
set objOutParams = managementService.ExecMethod_("RemoveVirtualSystemResources", objInParam)WScript.Echo "Unmount Success "
End Function
Function Format1(myString, arg0)
Format1 = Replace(myString, "{0}", arg0)
End Function