我正在编写一个应用程序,该程序存储计算机的磁盘对象以及每个磁盘的逻辑分区。我正在远程使用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对象列表。
答案 0 :(得分:0)
最后,我仅将逻辑磁盘信息和磁盘分区信息分别添加了一次,而没有将该信息与找到它的每个磁盘驱动器绑定在一起。这是因为这三个类中的两个只有一个共同的属性:win32_logicaldisk.diskindex和win32_diskdrive.index。如果存在将磁盘分区和逻辑磁盘类绑定在一起的属性,我将找到一种方法来确保仅将每个磁盘的相关信息仅添加到该磁盘,而不是其他磁盘。但是,可惜,从我发现的内容来看,没有可以与所有这些类相关联的属性。我实现的是一个计算机类,其中包含有关磁盘,分区和逻辑磁盘的所有信息。这样,对于每台计算机,我都可以列出找到的分区,它们的索引,那里的磁盘,并且仅凭视觉我就可以看到该分区属于哪个磁盘。不是最好的系统,而是我能找到的唯一系统,为我提供了我所寻找的解决方案。