获得给定 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 驱动器填充。
我正在尝试根据驱动器盘符获取有关磁盘的一些详细信息,但在获取给定卷的分区信息时遇到问题。
这就是我正在尝试的:
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 驱动器填充。