【发布时间】:2019-06-28 16:58:02
【问题描述】:
我正在编写一个应用程序来存储计算机的磁盘对象以及每个磁盘的逻辑分区。我正在远程使用 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 对象列表。
【问题讨论】: