WMI搜索的重叠属性?

问题描述 投票:0回答:1

我正在编写一个应用程序,它存储计算机的磁盘对象以及每个磁盘的逻辑分区。我正在远程使用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
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.