Получить метку тома из номера диска (не буквы диска) - PullRequest
0 голосов
/ 12 марта 2019

Я могу получить метку тома (что я хочу) из букв дисков, как это ..

 try
        {
            DriveInfo[] myDrives = DriveInfo.GetDrives();

        foreach (DriveInfo drive in myDrives)
        {
            Console.WriteLine("Drive:" + drive.Name);
            Console.WriteLine("Drive Type:" + drive.DriveType);

            if (drive.IsReady == true)
            {
                Console.WriteLine("Vol Label:" + drive.VolumeLabel);

            }
        }
    }
    catch (Exception)
    {

        throw;
    }

но я хочу метку тома с номера диска. Я могу получить номера дисков с этим ...

 foreach (var drive in new ManagementObjectSearcher("Select * from Win32_LogicalDiskToPartition").Get().Cast<ManagementObject>().ToList())
            {

                var driveNumber = Regex.Match((string)drive["Antecedent"], @"Disk #(\d*),").Groups[1].Value;

                Console.WriteLine("Drive Number: " + driveNumber);
                Console.WriteLine(Environment.NewLine);
            }

Как можно собрать что-нибудь вместе, чтобы получить метку тома всех заданных номеров дисков (из показанного 2-го блока кода)?

Подробнее: Я не могу использовать «LogicalDisk ...» для запроса, потому что я нахожу смонтированные VHDS, которые, кажется, не считаются «LogicalDisks

»

enter image description here

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

То, что вы называете «номером диска», на языке WMI называется «Индекс диска». Вам не нужно ничего анализировать, чтобы установить отношения между классами WMI.

Метку тома можно получить только из свойства Win32_LogicalDisk * VolumeName. Это должно работать и для смонтированного VHD (X). Следующий код просматривает все разделы (обратите внимание, что диск может иметь несколько разделов) и выводит соответствующие имена томов логических дисков (обратите внимание, что раздел может иметь несколько логических дисков), если таковые имеются:

foreach (var partition in new ManagementObjectSearcher("SELECT * FROM Win32_DiskPartition").Get())
{
    Console.WriteLine("Caption : " + partition["Caption"]);
    Console.WriteLine("Disk Index : " + partition["DiskIndex"]);

    // associate the partition with logical disk(s)
    foreach (var logicalDisk in new ManagementObjectSearcher(
        "ASSOCIATORS OF {Win32_DiskPartition.DeviceID='" +
        partition["DeviceID"] +
        "'} WHERE AssocClass=Win32_LogicalDiskToPartition").Get())
    {
        Console.WriteLine(" " + logicalDisk["VolumeName"]);
    }
}

Если вам нужны разделы и имена томов для данного диска, просто ограничьте начальный запрос, например, так: SELECT * FROM Win32_DiskPartition WHERE DiskIndex=1 например.

0 голосов
/ 12 марта 2019

Выполните поиск по Win32_LogicalDiskToPartition с поиском по Win32_LogicalDisk фильтрации по установленному драйверу письма, возвращающему свойство VolumeName.

            var drives = new ManagementObjectSearcher("Select * from Win32_LogicalDiskToPartition").Get().Cast<ManagementObject>();
            var disks = new ManagementObjectSearcher("Select * from Win32_LogicalDisk").Get().Cast<ManagementObject>();
            foreach (var drive in drives)
            {
                var driveLetter = Regex.Match((string)drive["Dependent"], @"DeviceID=""(.*)""").Groups[1].Value;
                var driveNumber = Regex.Match((string)drive["Antecedent"], @"Disk #(\d*),").Groups[1].Value;

                Console.WriteLine("Drive Letter: " + driveLetter);
                Console.WriteLine("Drive Number: " + driveNumber);

                // TODO: Enhance this to properly handle when the LINQ returns nothing.
                //       Likely only an edge case, but BSTS.
                var foundDisk = disks.Where((d) => d["Name"].ToString() == driveLetter).FirstOrDefault();

                // In the event that Drive Letter is not available, try the disk path
                if (foundDisk == null) {
                  foundDisk = disks.Where((d) => d.Path.ToString() == drive["Dependent"].ToString()).FirstOrDefault();
                }

                if (foundDisk == null) {
                  Console.WriteLine("Drive Label: <Unknown>");
                } else {
                  Console.WriteLine("Drive Label: " + foundDisk["VolumeName"]);
                }

                Console.WriteLine(Environment.NewLine);
            }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...