Exemple #1
0
        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);
        }
Exemple #2
0
        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.);
            }
        }