WIN1@Codename

Codename

スポンサーサイト

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

VBからPowerShellを実行する場合の、エラーの取得方法

VBからPowerShellを呼び出す場合には、「RunspaceInvoke 」を用いて実行しますが、その時のPowerShell側で発生したエラーの取得方法です。

RunspaceInvokeオブジェクトのInvokeメソッド実行時に、エラー内容をIList 型で取得できます。

あとは、エラーがある場合にこのオブジェクトを利用してエラー内容を表示することになります。

下記は、リモートから Get-VM2 という存在しないPowerShellコマンドをわざと実行して、エラーを表示しています。

PowerShellのリモート実行のサンプルコードも含まれていますので参考までに。

    1:          Dim strCmdlet As String = ""
   2:          strCmdlet += "$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList 'admin', (ConvertTo-SecureString 'adminpass' -AsPlainText -Force);"
   3:          strCmdlet += "Invoke-Command -ComputerName 'Server01' -Credential $Cred {"
   4:          strCmdlet += "Get-VM2 | Select Name"
   5:          strCmdlet += "}"
   6:   
   7:          Dim objRunspace As Runspace = RunspaceFactory.CreateRunspace()
   8:          objRunspace.Open()
   9:          Dim objRunspaceInvoke As RunspaceInvoke = New RunspaceInvoke(objRunspace)
  10:          Dim objErrors As IList = Nothing
  11:          Dim objResult As ObjectModel.Collection(Of PSObject) = objRunspaceInvoke.Invoke(strCmdlet, Nothing, objErrors)
  12:   
  13:          If objErrors.Count() > 0 Then
  14:              Dim objError As PSObject = objErrors(0)
  15:              Dim objRecord As ErrorRecord = objError.BaseObject
  16:              Console.WriteLine(objRecord.Exception.Message)
  17:              Console.WriteLine(objRecord.FullyQualifiedErrorId)
  18:          Else
  19:              For Each objPSObject As PSObject In objResult
  20:                  Console.WriteLine(objPSObject.Properties("Name").Value)
  21:              Next
  22:          End If

エラー内容はPowerShell実行時のエラーと同じ内容が取得できます。

用語 'Get-VM2' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。
名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
CommandNotFoundException

スポンサーサイト

Hyper-V上での仮想マシンのエクスポートとインポート

Hyper-Vのエクスポートとインポート機能

Windows Server 2012 のHyper-Vからは、仮想マシンが稼働中であってもエクスポートが可能となり、仮想マシンをエスポーとすることなく、直接仮想マシンフォルダからインポートもできるようになりました。

とても便利になったHyper-Vのエクスポートとインポート機能ですが、インポートする場合では、新しい root\virtualization\v2 名前空間では少々手順が複雑化しており、
新しいメソッド「ImportSystemDefinition」を実行するだけではVMのインポートは完了せず、設定ファイルだけが作成されるだけとなっています。

新しいHyper-Vで、エクスポートから一通りのインポート作業が完了するまでの手順をご紹介します。

仮想マシンののエクスポート

WMI経由で仮想マシンのエクスポートを行う場合は、Msvm_VirtualSystemExportSettingDataクラスを使用します。
実際にコード内でMsvm_VirtualSystemExportSettingDataクラスでプロパティーを指定して、ExportSystemDefinition メソッドで実行します。

Msvm_VirtualSystemExportSettingDataクラスのプロパティーは以下となります。

CopySnapshotConfiguration エクスポートする場合にスナップショットを含めるか否か。(Windows Server 2012R2 からは「スナップショット」は「チェックポイント」とう名前に変更されました。)
全てのスナップショットを含める(ExportAllSnapshots)= 0
スナップショットを含まない(ExportNoSnapshots)= 1
スナップショットの一つをエクスポート(ExportOneSnapshot)= 2
※仮想マシンのスナップショットの1つだけを指定してエクスポートもできます。
CopyVmRuntimeInformation 仮想マシンが保存された状態である場合にメモリ内容をエクスポートするか否か。メモリ内容が無い状態でインポートを実行すると、保存状態は破棄され停止状態で仮想マシンはインポートされます。
CopyVmStorage エクスポートに仮想ハードディスクを含めるか否か。
CreateVmExportSubdirectory サブディレクトリを作成するか否か。
SnapshotVirtualSystem CopySnapshotConfiguration で ExportOneSnapshot(=2)を選択した場合に、エクスポートするスナップショットの Msvm_VirtualSystemSettingData クラスを指定する。

これらを踏まえた仮想マシンのエクスポートのサンプルコードは以下となります。


   1:  Imports System.Management
   2:   
   3:  Module GMOReport
   4:      Sub Main()
   5:          Dim strUser As String = ""
   6:          Dim strPass As String = ""
   7:          Dim objManagementScope As ManagementScope = ConnectManagementScope("WinSvr2012R2", strUser, strPass)
   8:          objManagementScope.Connect()
   9:   
  10:          Dim strVMName As String = "VM01"
  11:   
  12:          Call ExportVm(objManagementScope, strVMName, 0, True, True, True, "D:\Hyper-V\Exp", "")
  13:      End Sub
  14:   
  15:      Function ConnectManagementScope(ByVal strServer As String, ByVal strAccount As String, ByVal strPassword As String) As ManagementScope
  16:          Dim objConnectionOptions As New ConnectionOptions()
  17:          objConnectionOptions.Impersonation = ImpersonationLevel.Impersonate 'WMI への接続に使用される偽装レベルを設定
  18:          objConnectionOptions.EnablePrivileges = True 'WNI経由の操作のためにユーザー特権を有効にする
  19:          objConnectionOptions.Username = strAccount
  20:          objConnectionOptions.Password = strPassword
  21:          Dim objManagementScope As New ManagementScope("\\" + strServer + "\root\virtualization\v2", objConnectionOptions)
  22:          objManagementScope.Connect()
  23:          Return (objManagementScope)
  24:      End Function
  25:   
  26:      Function ExportVm(ByVal objManagementScope As ManagementScope, strVMName As String, intCopySnapshotConfiguration As Integer, blnCopyVmRuntimeInformation As Boolean, blnCopyVhd As Boolean, blnCreateSubdirectory As Boolean, ByVal strExportDirectory As String, strSnapshotName As String) As Boolean
  27:          Dim objComputerSystem As ManagementObject = Nothing
  28:          For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
  29:              objComputerSystem = objManagementObject
  30:          Next
  31:   
  32:          Dim objVirtualSystemsettingData As ManagementObject = Nothing
  33:          If strSnapshotName <> "" Then
  34:              For Each objManagementObject As ManagementObject In objComputerSystem.GetRelated("Msvm_VirtualSystemSettingData")
  35:                  If objManagementObject("ElementName") = strSnapshotName Then
  36:                      objVirtualSystemsettingData = objManagementObject
  37:                      Exit For
  38:                  End If
  39:              Next
  40:          End If
  41:   
  42:          Dim objVirtualSystemExportSettingData As New ManagementClass(objManagementScope, New ManagementPath("Msvm_VirtualSystemExportSettingData"), Nothing)
  43:          Dim objVirtualSystemExportSettingDataInstance As ManagementObject = objVirtualSystemExportSettingData.CreateInstance
  44:          objVirtualSystemExportSettingDataInstance("CopySnapshotConfiguration") = intCopySnapshotConfiguration 'ExportAllSnapshots:0 ExportNoSnapshots:1 ExportOneSnapshot:2
  45:          objVirtualSystemExportSettingDataInstance("CopyVmRuntimeInformation") = blnCopyVmRuntimeInformation
  46:          objVirtualSystemExportSettingDataInstance("CopyVmStorage") = blnCopyVhd
  47:          objVirtualSystemExportSettingDataInstance("CreateVmExportSubdirectory") = blnCreateSubdirectory
  48:          objVirtualSystemExportSettingDataInstance("SnapshotVirtualSystem") = objVirtualSystemsettingData
  49:          Dim strExportSettingData As String = objVirtualSystemExportSettingDataInstance.GetText(TextFormat.CimDtd20)
  50:   
  51:          For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  52:              Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("ExportSystemDefinition")
  53:              objParams("ComputerSystem") = objComputerSystem.Path.Path
  54:              objParams("ExportDirectory") = strExportDirectory
  55:              objParams("ExportSettingData") = strExportSettingData
  56:              Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("ExportSystemDefinition", objParams, Nothing)
  57:              Return JobComplete(objManagementBaseObject, objManagementScope)
  58:          Next
  59:      End Function
  60:   
  61:      Function JobComplete(ByVal objManagementBaseObject As ManagementBaseObject, ByVal objManagementScope As ManagementScope) As Boolean
  62:          'JobState New = 2  Starting = 3  Running = 4  Suspended = 5  ShuttingDown = 6  Completed = 7  Terminated = 8  Killed = 9  Exception = 10  Service = 11
  63:          If objManagementBaseObject("ReturnValue") <> 0 Then
  64:              Dim strJobPath As String = objManagementBaseObject("Job")
  65:              Dim objJob As New ManagementObject(objManagementScope, New ManagementPath(strJobPath), Nothing)
  66:              objJob.Get()
  67:              Do While objJob("JobState") = 3 Or objJob("JobState") = 4
  68:                  System.Threading.Thread.Sleep(1000)
  69:                  objJob.Get()
  70:              Loop
  71:              If objJob("JobState") <> 7 Then
  72:                  Console.WriteLine("ErrorCode=" & objJob("ErrorCode") & " JobState=" & objJob("JobState"))
  73:                  Return False
  74:              Else
  75:                  Return True
  76:              End If
  77:          Else
  78:              Return True
  79:          End If
  80:      End Function
  81:  End Module


エクスポートが成功すると、このようにスナップショットも含めてファオルダが作成されます。


仮想マシンのインポート

次にインポートです。先にも述べましたが、root\virtualization\v2 名前空間ではインポートがいくつかのステップによって実行されます。大まかな流れとしてはこのようになります。Hyper-V マネージャーの仮想マシンのインポートウィザードとほぼ同じ手順となります。

1. 仮想マシンをインポートするための設定ファイルを読み込み、実行するインポートの種類を指定する
ImportSystemDefinition


2. 仮想マシンの保存場所の設定
ModifySystemSettings


3. ハードディスクの保存場所の設定
ModifyResourceSettings


4. インポート設定の検証
ValidatePlannedSystem


5. インポートの実行
RealizePlannedSystem

6. インポート構成ファイルの削除
DestroySystem


1. 仮想マシンをインポートするための設定ファイルを読み込む

仮想マシンをインポートするためには、Definition Fileと呼ばれるxmlの構成ファイルを読み込む必要があります。通常は、仮想マシンフォルダやエクスポートした仮想マシンフォルダの中の、「Virtual Machines」フォルダに 1D5E37BD-202C-4B76-B8C1-F4CFD3B67313.XML といったようなファイル名で保存されています。

Msvm_VirtualSystemManagementService クラスのImportSystemDefinition メソッドで各パラメーターを指定して実行します。

SystemDefinitionFile構成ファイルのフルパスを指定します。
SnapshotFolderエクスポートした仮想マシンにスナップショットがある場合に、スナップショットの構成ファイル(xml)があるフォルダを指定します。
GenerateNewSystemIdentifier「実行するインポートの種類」のうち、「仮想マシンをインプレースで登録する(既存の一意なIDを使用する)」「仮想マシンを復元する(既存の一意なIDを使用する)」を選択した場合は「False」を、「仮想マシンをコピーする(新しい一意なIDを作成する)」の場合は「True」を指定します。

仮想マシンの設定ファイルの読み込みが成功すると、"C:\ProgramData\Microsoft\Windows\Hyper-V\Planned Virtual Machines" フォルダに、インポート候補の構成ファイルが作成されます。

以降の操作対象となるのは、仮想マシンではなく、インポート候補となっている仮想マシンが対象となります。

そのため、これまでは
 SELECT * FROM Msvm_ComputerSystem
としていた操作対象となる仮想マシンの指定部分が
 SELECT * FROM Msvm_PlannedComputerSystem
と変更になっている点に注意が必要です。

2. 仮想マシンの保存場所の設定

インポートする時に仮想マシンのフォルダ構成を変更することができます。エクスポートファイルをバックアップとしてのリストアを行う場合は問題ありませんが、エクスポートファイルから仮想マシンのクローンを作る場合などはこの設定が必要となります。

エクスポートした仮想マシンの構成ファイルには、元々の仮想マシンの構成フォルダなどのパスが記載されており、エクスポート元の仮想マシンと同一の構成内容となっています。そのため、そのままインポートしてしまうと、パスなどが競合してしまうこととなるので、変更が必要となります。

変更対象となるのは、先ほど構成ファイルを読み込み、"C:\ProgramData\Microsoft\Windows\Hyper-V\Planned Virtual Machines" フォルダに保存された、インポート候補の構成ファイルとなります。

こちらの構成ファイルをMsvm_VirtualSystemSettingDataクラスのプロパティーを指定して、ModifySystemSettings メソッドで変更します。

Msvm_VirtualSystemSettingData クラスのプロパティーは以下となります。

ConfigurationDataRoot仮想マシンの構成フォルダ
SnapshotDataRootチェックポイント ストア
SwapFileDataRootスマート ページング フォルダ

今回は仮想マシンの構成フォルダを、すべてのフォルダパスとしています。


3. ハードディスクの保存場所の設定

仮想マシンの保存場所の設定変更同様に、仮想ハードディスクのパスも変更する必要があります。また、指定するパスに仮想ハードディスクファイル(vhdx)や、スナップショットファイル(avhdx)が事前に配置されている必要があります。エクスポートフォルダ内から、該当フォルダにファイルをコピーもしくは、移動をしておきます。

Msvm_StorageAllocationSettingDataクラスのプロパティーを指定して、ModifyResourceSettings メソッドで変更します。変更するMsvm_StorageAllocationSettingDat クラスのプロパティーは以下となります。

HostResourcet仮想ハードディスクのファイルパスを指定します。

今回は仮想マシンの構成フォルダをルートパスとしています。

スナップショットのファイル(avhdx)パスについては、「1.ImportSystemDefinition」でスナップショットの構成フォルダを指定することで、自動的にパスを書き換えてくるので、設定変更の必要はありません。


4. インポート設定の検証

"C:\ProgramData\Microsoft\Windows\Hyper-V\Planned Virtual Machines" フォルダに保存された、インポート候補の構成ファイルをインポートを実行する前に事前に問題がないか検証を行います。

XMLのファイル構文や、仮想ハードディスクのパスが有効なものであるか否かなどが検証対象となります。Msvm_VirtualSystemManagementService クラスの ValidatePlannedSystem メソッドで検証を実行します。


5. インポートの実行

インポート設定の検証に問題がなければ、最実際の仮想マシンとしてHyper-V上にインポートを実行します。

"Msvm_VirtualSystemManagementService クラスの RealizePlannedSystem メソッドで実行します。


6. インポート構成ファイルの削除

読み込んだインポート構成ファイルを削除して完了となります。Msvm_VirtualSystemManagementService クラスの DestroySystem メソッドで実行します。

エクスポートファイルからクローンを作成する場合は、仮想マシンの名前も変更する必要があるので、仮想マシンの名前の変更方法も追記しておきます。
こちらは、インポートした仮想マシンのIDを元に名前変更を行っています。

実行結果は、このように仮想マシンのクローンとしてインポートが完了しました。


以上を踏まえて、仮想マシンのインポートの一通りの手順のサンプルコードを紹介します。


   1:  Imports System.Management
   2:   
   3:  Module GMOReport
   4:      Sub Main()
   5:          Dim strUser As String = ""
   6:          Dim strPass As String = ""
   7:          Dim objManagementScope As ManagementScope = ConnectManagementScope("WinSvr2012R2", strUser, strPass)
   8:          objManagementScope.Connect()
   9:   
  10:          Dim strVMName As String = "VM01"
  11:   
  12:          Call ImportVm(objManagementScope, True, "VM01", "D:\Hyper-V\Exp\VM01\Virtual Machines\1D5E37BD-202C-4B76-B8C1-F4CFD3B67313.XML", "D:\Hyper-V\Exp\VM01\Snapshots", "D:\Hyper-V\VM02", "D:\Hyper-V\VM02", "VM02")
  13:      End Sub
  14:   
  15:      Function ConnectManagementScope(ByVal strServer As String, ByVal strAccount As String, ByVal strPassword As String) As ManagementScope
  16:          Dim objConnectionOptions As New ConnectionOptions()
  17:          objConnectionOptions.Impersonation = ImpersonationLevel.Impersonate 'WMI への接続に使用される偽装レベルを設定
  18:          objConnectionOptions.EnablePrivileges = True 'WNI経由の操作のためにユーザー特権を有効にする
  19:          objConnectionOptions.Username = strAccount
  20:          objConnectionOptions.Password = strPassword
  21:          Dim objManagementScope As New ManagementScope("\\" + strServer + "\root\virtualization\v2", objConnectionOptions)
  22:          objManagementScope.Connect()
  23:          Return (objManagementScope)
  24:      End Function
  25:   
  26:   
  27:      Function ImportVm(ByVal objManagementScope As ManagementScope, ByVal blnNewId As Boolean, strVMName As String, ByVal strImportConfigFilePath As String, strImportSnapshotFolder As String, strVMRootPath As String, strDiskRootPath As String, strNewVMName As String) As Boolean
  28:          Dim strRealizedVmId As String = ""
  29:          If ImportVmConfig(objManagementScope, strImportConfigFilePath, strImportSnapshotFolder, blnNewId) Then
  30:              If ChangePlannedConfig(objManagementScope, strVMName, strVMRootPath) Then
  31:                  If ChangePlannedHardDisk(objManagementScope, strVMName, strDiskRootPath) Then
  32:                      If ValidatePlannedVm(objManagementScope, strVMName) Then
  33:                          If RealizePlannedVm(objManagementScope, strVMName, strRealizedVmId) Then
  34:                              If RenameVM(objManagementScope, strRealizedVmId, strVMName, strNewVMName) Then
  35:                                  Return True
  36:                              End If
  37:                          End If
  38:                      End If
  39:                  End If
  40:              End If
  41:          End If
  42:          Call DeletePlannedVm(objManagementScope, strVMName)
  43:          Return False
  44:      End Function
  45:   
  46:      Function ImportVmConfig(ByVal objManagementScope As ManagementScope, ByVal strSystemDefinitionFilePath As String, strSnapshotFolder As String, ByVal blnNewId As Boolean) As Boolean
  47:          For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  48:              Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("ImportSystemDefinition")
  49:              objParams("SystemDefinitionFile") = strSystemDefinitionFilePath
  50:              objParams("SnapshotFolder") = strSnapshotFolder
  51:              objParams("GenerateNewSystemIdentifier") = blnNewId
  52:              Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("ImportSystemDefinition", objParams, Nothing)
  53:              Return JobComplete(objManagementBaseObject, objManagementScope)
  54:          Next
  55:      End Function
  56:   
  57:      Function ValidatePlannedVm(ByVal objManagementScope As ManagementScope, ByVal strVMName As String) As Boolean
  58:          Dim objComputerSystem As ManagementObject = Nothing
  59:          For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_PlannedComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
  60:              objComputerSystem = objManagementObject
  61:          Next
  62:          For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  63:              Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("ValidatePlannedSystem")
  64:              objParams("PlannedSystem") = objComputerSystem.Path.Path
  65:              Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("ValidatePlannedSystem", objParams, Nothing)
  66:              Return JobComplete(objManagementBaseObject, objManagementScope)
  67:          Next
  68:      End Function
  69:   
  70:      Function RealizePlannedVm(ByVal objManagementScope As ManagementScope, ByVal strVMName As String, ByRef strRealizedVmId As String) As Boolean
  71:          Dim objComputerSystem As ManagementObject = Nothing
  72:          For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_PlannedComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
  73:              objComputerSystem = objManagementObject
  74:          Next
  75:          For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  76:              Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("RealizePlannedSystem")
  77:              objParams("PlannedSystem") = objComputerSystem.Path.Path
  78:              Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("RealizePlannedSystem", objParams, Nothing)
  79:              Call JobComplete(objManagementBaseObject, objManagementScope)
  80:   
  81:              Dim objJob As New ManagementObject(objManagementBaseObject("Job").ToString())
  82:              objJob.Scope = objManagementScope
  83:              objJob.Get()
  84:              For Each objManagementObject As ManagementObject In objJob.GetRelated("Msvm_ComputerSystem")
  85:                  strRealizedVmId = objManagementObject("Name")
  86:              Next
  87:              Return True
  88:          Next
  89:      End Function
  90:   
  91:      Function DeletePlannedVm(ByVal objManagementScope As ManagementScope, ByVal strVMName As String) As Boolean
  92:          Dim objComputerSystem As ManagementObject = Nothing
  93:          For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_PlannedComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
  94:              objComputerSystem = objManagementObject
  95:          Next
  96:          For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
  97:              Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("DestroySystem")
  98:              objParams("AffectedSystem") = objComputerSystem.Path.Path
  99:              Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("DestroySystem", objParams, Nothing)
 100:              Return JobComplete(objManagementBaseObject, objManagementScope)
 101:          Next
 102:      End Function
 103:   
 104:      Function ChangePlannedConfig(ByVal objManagementScope As ManagementScope, ByVal strVMName As String, ByVal strRootPath As String) As Boolean
 105:          Dim objComputerSystem As ManagementObject = Nothing
 106:          For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_PlannedComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
 107:              objComputerSystem = objManagementObject
 108:          Next
 109:   
 110:          Dim objVirtualSystemsettingData As ManagementObject = Nothing
 111:          For Each objManagementObject As ManagementObject In objComputerSystem.GetRelated("Msvm_VirtualSystemSettingData")
 112:              If String.Compare(objManagementObject("ElementName").ToString, strVMName, True) = 0 Then
 113:                  objVirtualSystemsettingData = objManagementObject
 114:                  objVirtualSystemsettingData("ConfigurationDataRoot") = strRootPath
 115:                  objVirtualSystemsettingData("SnapshotDataRoot") = strRootPath
 116:                  objVirtualSystemsettingData("SwapFileDataRoot") = strRootPath
 117:              End If
 118:          Next
 119:   
 120:          For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
 121:              Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("ModifySystemSettings")
 122:              objParams("SystemSettings") = objVirtualSystemsettingData.GetText(TextFormat.CimDtd20)
 123:              Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("ModifySystemSettings", objParams, Nothing)
 124:              Return JobComplete(objManagementBaseObject, objManagementScope)
 125:          Next
 126:      End Function
 127:   
 128:      Function ChangePlannedHardDisk(ByVal objManagementScope As ManagementScope, ByVal strVMName As String, ByVal strDiskRootPath As String) As Boolean
 129:          Dim objComputerSystem As ManagementObject = Nothing
 130:          For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_PlannedComputerSystem WHERE ElementName = '" & strVMName & "'")).Get
 131:              objComputerSystem = objManagementObject
 132:          Next
 133:   
 134:          Dim objHardDisk As ManagementObject = Nothing
 135:          Dim objVirtualSystemsettingData As ManagementObject = Nothing
 136:          For Each objManagementObject As ManagementObject In objComputerSystem.GetRelated("Msvm_VirtualSystemSettingData")
 137:              objVirtualSystemsettingData = objManagementObject
 138:              For Each objResourceAllocationSettingData As ManagementObject In objVirtualSystemsettingData.GetRelated("Msvm_StorageAllocationSettingData")
 139:                  If objResourceAllocationSettingData("ResourceType") = 31 Then 'Logical Disk  http://msdn.microsoft.com/en-us/library/hh859775(v=vs.85).aspx
 140:                      objHardDisk = objResourceAllocationSettingData
 141:                      Dim strOldPath As String = objHardDisk("HostResource")(0)
 142:                      Dim strFileName As String = System.IO.Path.GetFileName(strOldPath)
 143:                      Dim strNewDiskPath As String = System.IO.Path.Combine(strDiskRootPath, strFileName)
 144:                      objHardDisk("HostResource") = New String(0) {strNewDiskPath} 'http://msdn.microsoft.com/en-us/library/cc136877(v=vs.85).aspx
 145:                      For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
 146:                          Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("ModifyResourceSettings")
 147:                          Dim strResourceSettingData As String() = New String(0) {}
 148:                          strResourceSettingData(0) = objHardDisk.GetText(TextFormat.CimDtd20)
 149:                          objParams("ResourceSettings") = strResourceSettingData 'http://msdn.microsoft.com/en-us/library/hh850099(v=vs.85).aspx
 150:                          Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("ModifyResourceSettings", objParams, Nothing)
 151:                          Call JobComplete(objManagementBaseObject, objManagementScope)
 152:                      Next
 153:                  End If
 154:              Next
 155:          Next
 156:          Return True
 157:      End Function
 158:   
 159:      Function RenameVM(ByVal objManagementScope As ManagementScope, ByVal strVMID As String, ByVal strVMName As String, ByVal strNewVMName As String) As Boolean
 160:          Dim objComputerSystem As ManagementObject = Nothing
 161:          For Each objManagementObject As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_ComputerSystem WHERE Name = '" & strVMID & "'")).Get
 162:              objComputerSystem = objManagementObject
 163:          Next
 164:   
 165:          Dim objVirtualSystemsettingData As ManagementObject = Nothing
 166:          For Each objManagementObject As ManagementObject In objComputerSystem.GetRelated("Msvm_VirtualSystemSettingData")
 167:              If String.Compare(objManagementObject("ElementName").ToString, strVMName, True) = 0 Then
 168:                  objVirtualSystemsettingData = objManagementObject
 169:                  objVirtualSystemsettingData("ElementName") = strNewVMName
 170:              End If
 171:          Next
 172:   
 173:          For Each objVirtualSystemManagementService As ManagementObject In New ManagementObjectSearcher(objManagementScope, New ObjectQuery("SELECT * FROM Msvm_VirtualSystemManagementService")).Get
 174:              Dim objParams As ManagementBaseObject = objVirtualSystemManagementService.GetMethodParameters("ModifySystemSettings")
 175:              objParams("SystemSettings") = objVirtualSystemsettingData.GetText(TextFormat.CimDtd20)
 176:              Dim objManagementBaseObject As ManagementBaseObject = objVirtualSystemManagementService.InvokeMethod("ModifySystemSettings", objParams, Nothing)
 177:              Return JobComplete(objManagementBaseObject, objManagementScope)
 178:          Next
 179:      End Function
 180:   
 181:      Function JobComplete(ByVal objManagementBaseObject As ManagementBaseObject, ByVal objManagementScope As ManagementScope) As Boolean
 182:          'JobState New = 2  Starting = 3  Running = 4  Suspended = 5  ShuttingDown = 6  Completed = 7  Terminated = 8  Killed = 9  Exception = 10  Service = 11
 183:          If objManagementBaseObject("ReturnValue") <> 0 Then
 184:              Dim strJobPath As String = objManagementBaseObject("Job")
 185:              Dim objJob As New ManagementObject(objManagementScope, New ManagementPath(strJobPath), Nothing)
 186:              objJob.Get()
 187:              Do While objJob("JobState") = 3 Or objJob("JobState") = 4
 188:                  System.Threading.Thread.Sleep(1000)
 189:                  objJob.Get()
 190:              Loop
 191:              If objJob("JobState") <> 7 Then
 192:                  Console.WriteLine("ErrorCode=" & objJob("ErrorCode") & " JobState=" & objJob("JobState"))
 193:                  Return False
 194:              Else
 195:                  Return True
 196:              End If
 197:          Else
 198:              Return True
 199:          End If
 200:      End Function
 201:  End Module


今回のポイントとしては、インポート時に仮想ハードディスクのパスをきちんと指定することと、該当パスに仮想ハードディスクをきちんと配置しておくということになります。また、最新のHyper-Vではエクスポートは仮想マシンの稼働中でも可能となっている点も非常に便利な機能となっています。

いくつか複雑な手順がありましたが、Hyper-VマネージャーなのGUIでは設定しきれないポイントまで細かく指定できるのがやはりWMIの利点となります。

是非ご利用ください。





Hyper-Vをみんなで使いやすくするためのオープンコミュニティーをスタートしました

WMIのサンプルコードやTipなど幅広く情報共有してゆきたいと思います。

Hyper-Vというキーワードにピンときたら、是非メンバーとしてご参加ください。


→ 日本初のHyper-V オープンコミュニティー 「InvokeV」



*本文中に記載されている会社名および商品名・サービス名は、各社の商標 または登録商標です。


FC2Ad

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