WIN1@Codename

Codename

スポンサーサイト

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

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

以前紹介したSCSIディスクの追加に対して、今回はSCSIディスクの削除(取り外し)についてご紹介します。

Option Explicit

Dim strServerName, strVMName, objWMIService, objManagementServicestrServerName = "."
strVMName = "TestVM" 
Set objWMIService = GetObject("winmgmts:\\" & strServerName & "\root\virtualization")
Set objManagementService = objWMIService.ExecQuery("SELECT * FROM Msvm_VirtualSystemManagementService").ItemIndex(0)

Call UnmountScsiHardDisk(strVMName)

Function UnmountScsiHardDisk(strVMName)
    Dim objComputerSystem
    Set objComputerSystem = objWMIService.ExecQuery("SELECT * FROM Msvm_ComputerSystem WHERE ElementName = '" & strVMName & "'").ItemIndex(0)

    Dim objSCSIController, objResourceAllocationSettingData
    Dim objSCSIDrive, objSCSIDrives, obj
    Set objResourceAllocationSettingData = objWMIService.ExecQuery("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE ResourceType = 6 AND ResourceSubType = 'Microsoft Synthetic SCSI Controller' AND OtherResourceType = null")
  
    For Each objSCSIController In objResourceAllocationSettingData
        Set objSCSIDrives = objWMIService.ExecQuery("SELECT * FROM Msvm_ResourceAllocationSettingData WHERE Parent = '" & Replace(objSCSIController.Path_.Path, "\", "\\") & "' AND Address = '0'")
        For Each obj In objSCSIDrives
Set objSCSIDrive = obj
Exit For
        Next
    Next   

    Dim objHardDisk, objManagementObject
    Set objManagementObject = objWMIService.ExecQuery("SELECT * FROM Msvm_ResourceAllocationSettingData")
    For Each obj In objManagementObject
        Set objHardDisk = obj
        If objHardDisk.Parent = objSCSIDrive.Path_.Path Then
 Exit For
        End If     
    Next 

    Dim strResourceSettingData
    strResourceSettingData = Array(1)
    strResourceSettingData(0) = objHardDisk.Path_.Path      
    Dim objInParam, objOutParams
    Set objInParam = objManagementService.Methods_("RemoveVirtualSystemResources").InParameters.SpawnInstance_()
    objInParam.ResourceSettingData = strResourceSettingData
    objInParam.TargetSystem = objComputerSystem.Path_.Path
    Set objOutParams = objManagementService.ExecMethod_("RemoveVirtualSystemResources", objInParam)

    strResourceSettingData = Array(1)
    strResourceSettingData(0) = objSCSIDrive.Path_.Path       
    Set objInParam = objManagementService.Methods_("RemoveVirtualSystemResources").InParameters.SpawnInstance_()
    objInParam.ResourceSettingData = strResourceSettingData
    objInParam.TargetSystem = objComputerSystem.Path_.Path
    Set objOutParams = objManagementService.ExecMethod_("RemoveVirtualSystemResources", objInParam)

    Call JobCompleted(objOutParams, objWMIService)    
End Function

 
Function JobCompleted(objOutParams, objWMIService) 
    Dim objJob 
    If (objOutParams.ReturnValue = 0) Then 
        Wscript.Echo "OK" 
    ElseIf (objOutParams.ReturnValue <> 4096) Then 
        Wscript.Echo "NG" 
    Else    
        Set objJob = objWMIService.Get(objOutParams.Job) 
        While (objJob.JobState = 3) Or (objJob.JobState = 4) 
WScript.Sleep(1000) 
Set objJob = objWMIService.Get(objOutParams.Job) 
        Wend 
        If (objJob.JobState <> 7) Then 
Wscript.Echo "NG" 
Wscript.Echo "ErrorCode:" & objJob.ErrorCode 
Wscript.Echo "ErrorDescription:" & objJob.ErrorDescription 
        Else 
Wscript.Echo "OK" 
        End If 
    End If 
End Function

今回のポイントは、SCSIに接続されたハードディスクをまず削除してから、SCSIドライブを削除するという点です。

コメント

コメントの投稿


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

トラックバック

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

FC2Ad

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