首页 > 解决方案 > WMI 搜索的重叠属性?

问题描述

我正在编写一个应用程序来存储计算机的磁盘对象以及每个磁盘的逻辑分区。我正在远程使用 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 对象列表。

标签: c#wmi

解决方案


我最终只是单独添加了一次逻辑磁盘信息和磁盘分区信息,而不是将这些信息绑定到它所在的每个磁盘驱动器上。这样做的原因是因为这三个类中的两个只有一个共同的属性:win32_logicaldisk.diskindex 和 win32_diskdrive.index。如果有一个属性将磁盘分区和逻辑磁盘类联系在一起,我会找到一种方法来确保每个磁盘的相关信息只添加到该磁盘,而不是其他磁盘。但是,唉,根据我的发现,我找不到可以将所有这些类联系起来的属性。我实现的是一个计算机类,其中包含有关磁盘、分区和逻辑磁盘的所有信息。这样,对于每台计算机,我都可以列出找到的分区、它们的索引、那里有哪些磁盘,通过视觉我可以看到分区属于哪个磁盘。不是最好的系统,但我能找到的唯一一个给了我我正在寻找的解决方案。


推荐阅读