0
我想獲得有關基於驅動器盤符的磁盤的一些詳細信息,並且無法獲取給定卷的分區信息。獲取給定的MSFT_Volume的MSFT_Partition
這就是我想:
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
也許我接近它錯了嗎?我想一個卷可能存在於多個分區上?但仍然 - 我應該得到的「關聯者」查詢返回一些結果,除非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;
}
}