c#
  • wmi
  • 2016-03-07 34 views 0 likes 
    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; 
        } 
    } 
    

    回答

    0

    我仍然不知道什麼是錯的associators查詢,但好像我忽略了一個很簡單的解決方案 - MSFT_Partition也有一個DriveLetter列...

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

    注意雖然這不會爲VHD驅動器填充。

    相關問題