我希望在所有物理磁盘上看到每个分区/卷(也包括隐藏的系统卷)。 卷的信息应包含
在我看来,“WMI”可能是解决此任务的正确选择。
示例输出看起来与此类似:
- PHYSICALDRIVE4
- --> 0 - m: - Data - 2TB
- PHYSICALDRIVE1
- --> 0 - '' - System Reserved - 100MB
- --> 1 - c: - Windows - 100GB
- --> 2 - d: - Programs - 200GB
- PHYSICALDRIVE2
- --> 0 - '' - Hidden Recovery Partition - 50GB
- --> 1 - f: - data - 1TB
我在网上找到了几个解决方案,以便将driveletter(c :)与diskid(disk0)结合起来。 One of those solution can be found here
public Dictionary<string, string> GetDrives()
{
var result = new Dictionary<string, string>();
foreach ( var drive in new ManagementObjectSearcher( "Select * from Win32_LogicalDiskToPartition" ).Get().Cast<ManagementObject>().ToList() )
{
var driveLetter = Regex.Match( (string)drive[ "Dependent" ], @"DeviceID=""(.*)""" ).Groups[ 1 ].Value;
var driveNumber = Regex.Match( (string)drive[ "Antecedent" ], @"Disk #(\d*)," ).Groups[ 1 ].Value;
result.Add( driveLetter, driveNumber );
}
return result;
}
此解决方案的问题在于它忽略了隐藏的分区。输出字典只包含4个条目(m,4 - c,1 - d,1 - f,2)。
这是因为使用“Win32_LogicalDiskToPartition”将“win32_logicalDisk”与“win32_diskpartion”组合在一起。但“win32_logicalDisk”不包含未分配的卷。
我只能在“win32_volume”中找到未分配的卷,但我无法将“win32_volume”与“win32_diskpartition”结合起来。
简化的我的数据类应如下所示:
public class Disk
{
public string Diskname; //"Disk0" or "0" or "PHYSICALDRIVE0"
public List<Partition> PartitionList;
}
public class Partition
{
public ushort Index //can be of type string too
public string Letter;
public string Label;
public uint Capacity;
//Example for Windows Partition
// Index = "1" or "Partition1"
// Letter = "c" or "c:"
// Label = "Windows"
// Capacity = "1000202039296"
//
//Example for System-reserved Partition
// Index = "0" or "Partition0"
// Letter = "" or ""
// Label = "System-reserved"
// Capacity = "104853504"
}
也许任何人都可以提供帮助: - )
答案 0 :(得分:0)
root \ microsoft \ windows \ storage中的MSFT_Partition包含所有分区,包括隐藏分区。我从该类中获取DiskNumber和Offset,然后将它们与Win32_DiskPartition中的DiskIndex和StartingOffset值进行匹配。该组合应提供唯一标识符。
从Win32_DiskDrive开始,然后使用上面的方法获取分区。 MSFT_Partition对象还具有一个名为AccessPaths的属性,该属性将包含Win32_Volume中的DeviceID,您可以检查该ID以将卷与分区关联。然后,还可以使用您描述的方法对分区检查Win32_LogicalDisk,如:
using (ManagementObjectSearcher LogicalDiskSearcher = new ManagementObjectSearcher(new ManagementScope(ManagementPath.DefaultPath), new ObjectQuery(String.Format("ASSOCIATORS OF {{Win32_DiskPartition.DeviceID=\"{0}\"}} WHERE AssocClass = Win32_LogicalDiskToPartition", ((string)Partition["DeviceID"]).Replace("\\", "\\\\")))))
这将从分区获取LogicalDisks的集合(如果存在)。希望这种答案可以解决其他人遇到类似问题的问题。不幸的是,MSFT_Partition仅适用于Windows 8 / Server 2012及更高版本。