获得给定 MSFT_Volume 的 MSFT_Partition

Getting an MSFT_Partition for a given MSFT_Volume

我正在尝试根据驱动器盘符获取有关磁盘的一些详细信息,但在获取给定卷的分区信息时遇到问题。

这就是我正在尝试的:

var scope = new ManagementScope(@"\localhost\ROOT\Microsoft\Windows\Storage");
var query = new ObjectQuery("Associators of {MSFT_Volume.DriveLetter='" + upperCaseDiskLetter + "'} WHERE RESULTCLASS = MSFT_Partition");

using (var partitionSearcher = new ManagementObjectSearcher(
    scope,
    query))
{
    var partition = partitionSearcher.Get().Cast<ManagementBaseObject>().Single();

并得到这个异常:

Exception thrown: 'System.Management.ManagementException' in System.Management.dll

Additional information: Invalid object path

也许我处理的不对?我想一个卷可能存在于多个分区上?但仍然——我应该得到“associators”查询 return 一些结果,除非 MSFT_PartitionToVolume 由于某种原因不工作?

这是我要收集的内容:

using (var volumeSearcher = new ManagementObjectSearcher(
    @"\localhost\ROOT\Microsoft\Windows\Storage",
    $"SELECT Size, SizeRemaining, DriveType FROM MSFT_Volume WHERE DriveLetter='{ upperCaseDiskLetter }'"))
{
    var volume = volumeSearcher.Get().Cast<ManagementBaseObject>().Single();

    result = new DiskProperties
    {
        LastRetrieved = DateTime.Now,
        DriveType = GetDriveTypeDescription((UInt32)volume["DriveType"]),
        FreeSpace = (UInt64)volume["SizeRemaining"],
        PartitionSize = (UInt64)volume["Size"]
    };
}

var scope = new ManagementScope(@"\localhost\ROOT\Microsoft\Windows\Storage");
var query = new ObjectQuery("Associators of {MSFT_Volume.DriveLetter='" + upperCaseDiskLetter + "'} WHERE RESULTCLASS = MSFT_Partition");

using (var partitionSearcher = new ManagementObjectSearcher(
    scope,
    query))
{
    var partition = partitionSearcher.Get().Cast<ManagementBaseObject>().Single();

    using (var physicalDiskSearcher = new ManagementObjectSearcher(
                @"\localhost\ROOT\Microsoft\Windows\Storage",
                $"SELECT Size, Model, MediaType FROM MSFT_PhysicalDisk WHERE DeviceID='{ partition["DiskNumber"] }'"))
    {
        var physicalDisk = physicalDiskSearcher.Get().Cast<ManagementBaseObject>().Single();
        result.DiskSize = (UInt64)physicalDisk["Size"];
        result.Model = physicalDisk["Model"].ToString();
        result.IsSsd =
            (UInt16)physicalDisk["MediaType"] == 4 ||
            SSDModelSubstrings.Any(substring => result.Model.ToLower().Contains(substring)); ;

        return result;
    }
}

我仍然不确定 associators 查询有什么问题,但似乎我忽略了非常简单的解决方案 - MSFT_Partition 也有一个 DriveLetter 列...

using (var partitionSearcher = new ManagementObjectSearcher(
    @"\localhost\ROOT\Microsoft\Windows\Storage",
    $"SELECT DiskNumber FROM MSFT_Partition WHERE DriveLetter='{upperCaseDiskLetter}'"))

请注意,这不会为 VHD 驱动器填充。