private static JobResult CreateJobResultFromWmiMethodResults(ManagementBaseObject outParams) { JobResult result = new JobResult(); // return value result.ReturnValue = (ReturnCode)Convert.ToInt32(outParams["ReturnValue"]); // job ManagementBaseObject objJob = wmi.GetWmiObjectByPath((string)outParams["Job"]); if (objJob != null && objJob.Properties.Count > 0) { result.Job = CreateJobFromWmiObject(objJob); } return(result); }
private static void MountVHD() { // check parameters AssertParameter("path"); string vhdPath = Parameters["path"]; ManagementObject objImgSvc = GetImageManagementService(); Console.WriteLine("Mount VHD: " + vhdPath); // get method params ManagementBaseObject inParams = objImgSvc.GetMethodParameters("Mount"); inParams["Path"] = vhdPath; ManagementBaseObject outParams = (ManagementBaseObject)objImgSvc.InvokeMethod("Mount", inParams, null); JobResult result = CreateJobResultFromWmiMethodResults(outParams); // load storage job if (result.ReturnValue != ReturnCode.JobStarted || result.Job.JobState == ConcreteJobState.Exception) { throw new Exception("Mount job failed to start with the following message: " + result.Job.ErrorDescription); } ManagementObject objJob = wmi.GetWmiObject("msvm_StorageJob", "InstanceID = '{0}'", result.Job.Id); if (JobCompleted(result.Job)) { // load output data ManagementObject objImage = wmi.GetRelatedWmiObject(objJob, "Msvm_MountedStorageImage"); int pathId = Convert.ToInt32(objImage["PathId"]); int portNumber = Convert.ToInt32(objImage["PortNumber"]); int targetId = Convert.ToInt32(objImage["TargetId"]); int lun = Convert.ToInt32(objImage["Lun"]); string diskAddress = String.Format("Port{0}Path{1}Target{2}Lun{3}", portNumber, pathId, targetId, lun); // find mounted disk using VDS Vds.Advanced.AdvancedDisk advancedDisk = null; Vds.Pack diskPack = null; // first attempt System.Threading.Thread.Sleep(3000); Console.WriteLine("Querying mounted disk..."); FindVdsDisk(diskAddress, out advancedDisk, out diskPack); // second attempt if (advancedDisk == null) { System.Threading.Thread.Sleep(20000); Console.WriteLine("Querying mounted disk - second attempt..."); FindVdsDisk(diskAddress, out advancedDisk, out diskPack); } if (advancedDisk == null) { throw new Exception("Could not find mounted disk"); } List <string> volumes = new List <string>(); Console.WriteLine("Disk flags: " + advancedDisk.Flags); // clear READONLY if ((advancedDisk.Flags & Vds.DiskFlags.ReadOnly) == Vds.DiskFlags.ReadOnly) { Console.Write("Clearing disk Read-Only flag..."); advancedDisk.ClearFlags(Vds.DiskFlags.ReadOnly); while ((advancedDisk.Flags & Vds.DiskFlags.ReadOnly) == Vds.DiskFlags.ReadOnly) { System.Threading.Thread.Sleep(100); advancedDisk.Refresh(); } Console.WriteLine("Done"); } // bring disk ONLINE if (advancedDisk.Status == Vds.DiskStatus.Offline) { Console.Write("Bringing disk online..."); advancedDisk.Online(); while (advancedDisk.Status == Vds.DiskStatus.Offline) { System.Threading.Thread.Sleep(100); advancedDisk.Refresh(); } Console.WriteLine("Done"); } // determine disk index for DiskPart Wmi cimv2 = new Wmi(computer, "root\\CIMV2"); ManagementObject objDisk = cimv2.GetWmiObject("win32_diskdrive", "Model='Msft Virtual Disk SCSI Disk Device' and ScsiTargetID={0} and ScsiLogicalUnit={1} and scsiPort={2}", targetId, lun, portNumber); if (objDisk != null) { Console.WriteLine("DiskPart disk index: " + Convert.ToInt32(objDisk["Index"])); } // find volume diskPack.Refresh(); foreach (Vds.Volume volume in diskPack.Volumes) { volumes.Add(volume.DriveLetter.ToString()); } if (volumes.Count == 0 && objDisk != null) { // find volumes using WMI foreach (ManagementObject objPartition in objDisk.GetRelated("Win32_DiskPartition")) { foreach (ManagementObject objVolume in objPartition.GetRelated("Win32_LogicalDisk")) { volumes.Add(objVolume["Name"].ToString().TrimEnd(':')); } } } foreach (string volume in volumes) { Console.WriteLine("Volume found: " + volume); } //// find disk index //Wmi win32 = new Wmi(computer, @"root\cimv2"); //System.Threading.Thread.Sleep(1000); // small pause //ManagementObject objDisk = win32.GetWmiObject("win32_DiskDrive", // "Model='Msft Virtual Disk SCSI Disk Device' and ScsiTargetID={0} and ScsiLogicalUnit={1} and ScsiPort={2}", // targetId, lun, portNumber); //int diskIndex = Convert.ToInt32(objDisk["Index"]); Console.WriteLine("\nDisk has been mounted.\n"); //Console.WriteLine("Disk index: " + advancedDisk.); } }