Перекрывающиеся свойства для поиска WMI? - PullRequest
0 голосов
/ 05 февраля 2019

Я пишу приложение, в котором хранятся дисковые объекты для компьютера, а также логические разделы для каждого диска.Я удаленно использую WMI и (в частности) ManagementObjectSearch для запроса компьютеров в моем домене.Мне интересно, есть ли какие-либо свойства между классами WMI Win32_DiskDrive и Win32_LogicalDrive, которые позволили бы мне проверить, принадлежит ли раздел к определенному диску или нет.Я могу просто добавить разделы, но когда я пытаюсь добавить их на диск, мой ManagementObjectSearch просто захватывает все разделы со всех дисков.Я хочу сузить область поиска, чтобы при поиске разделов, скажем, на диске, на котором установлена ​​ОС, мне нужны базовые GPT-разделы, а если я ищу разделы на диске с данными, я хочуодин раздел, который, вероятно, будет расположен на этом диске.(Извините, если это не имело особого смысла).

Я пробовал прямой запрос для разделов, но, похоже, мой ManagementObjectSearch запрашивает все разделы между обоими дисками, а не только диск, который я хочу найти.

        ManagementScope scope = new ManagementScope("\\\\" + computer.Name + "\\root\\cimv2:Win32_LogicalDisk", computer.Options);
        scope.Connect();

        foreach (ComputerDisk disk in computer.DiskList)
        {
            try
            {
                disk.PartitionList = new List<DiskPartition>();
                MessageBox.Show("Disk Name: " + disk.Name);

                SelectQuery query = new SelectQuery("Select * from Win32_LogicalDisk ");
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

                ManagementObjectCollection obj = searcher.Get();

                foreach (ManagementObject os in obj)
                {
                    DiskPartition partition = new DiskPartition();

                    UInt64 fS = (UInt64)os.Properties["FreeSpace"].Value / 1000000000;
                    UInt64 tS = (UInt64)os.Properties["Size"].Value / 1000000000;

                    partition.FreeSpace = fS;
                    partition.TotalSpace = tS;
                    partition.PercentFreeSpace = Convert.ToDouble(partition.FreeSpace / partition.TotalSpace);

                    partition.PartitionName = Convert.ToString(os.Properties["Name"].Value);
                    partition.FileSystem = Convert.ToString(os.Properties["FileSystem"].Value);

                    if (!disk.PartitionList.Contains(partition))
                    {
                        disk.PartitionList.Add(partition);
                    }
                }
            }
            catch (Exception ex)
            {
                //MessageBox.Show("Exception: " + ex.ToString());
            }
        }

На этом этапе я ожидаю, что все разделы будут найдены при выполнении запроса, но в основном я хочу запрашивать только разделы на рассматриваемом диске.При настройке моего кода у меня есть компьютерный объект, который содержит список дисковых объектов, причем каждый дисковый объект содержит список объектов DiskPartition.

1 Ответ

0 голосов
/ 15 февраля 2019

В итоге я просто добавил информацию о логическом диске и разделе диска по отдельности и только один раз, не привязывая эту информацию к каждому найденному диску.Причина этого в том, что есть только одно свойство, которое объединяет два из этих трех классов: win32_logicaldisk.diskindex и win32_diskdrive.index.Если бы существовало свойство, связывающее разделы диска и классы логических дисков, я бы нашел способ гарантировать, что только соответствующая информация для каждого диска добавлялась только на этот диск, а не на другие.Но, увы, из того, что я нашел, не было никакого свойства, которое я мог бы найти, чтобы связать все эти классы.Я реализовал компьютерный класс, в котором размещалась вся информация о дисках, разделах и логических дисках.Таким образом, для каждого компьютера я могу перечислить, какие разделы были найдены, их индекс, какие диски есть, и только визуально я могу видеть, к какому диску относится этот раздел.Не лучшая система, но единственная, которую я смог найти, дала мне решение, которое я искал.

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