【问题标题】:C# WMI MSFT_Disk syntaxC# WMI MSFT_Disk 语法
【发布时间】:2022-09-25 09:47:15
【问题描述】:

这种形式的 ManagementObject(使用 \".DeviceID=\")分配有效:

        // get number of logical drives on given physical disk
        int n = 0;
        var id = \"\\\\\\\\.\\\\PHYSICALDRIVE0\";
        var disk = new ManagementObject(\"Win32_DiskDrive.DeviceID=\" + \"\'\" + id + \"\'\");
        foreach (ManagementObject dp in disk.GetRelated(\"Win32_DiskPartition\"))
        {
            foreach (ManagementObject ld in dp.GetRelated(\"Win32_LogicalDisk\")) ++n;
        }

这种形式的 ManagementObject(使用 \".Number=\")分配失败:

        // get number of logical drives on given physical disk
        int n = 0;
        var id = \"0\";
        ManagementObject disk = new ManagementObject(\"root\\\\Microsoft\\\\Windows\\\\Storage:MSFT_Disk.Number=\" + \"\'\" + id + \"\'\");
        foreach (ManagementObject dp in disk.GetRelated(\"MSFT_Partition\"))
        {
            foreach (ManagementObject ld in dp.GetRelated(\"MSFT_Volume\")) ++n;
        }

例外是“无效的对象路径”。我花了令人尴尬的时间试图弄清楚我做错了什么......并且不知道。

此处搜索的特定项目不是相关问题。使用这两个语句的正确语法是我想要理解的......

工作案例的路径是:\"root\\CIMV2\",失败案例的路径是:\"root\\Microsoft\\Windows\\Storage\"。

失败的语句是: \"foreach (ManagementObject dp in disk.GetRelated(\"MSFT_Partition\"))\"

  • 也许在将对象路径传递给ManagementObject 之前将其存储为字符串,这样您就可以调试并确保路径正确。
  • 另请提供错误上下文。哪条线抛出错误?
  • 只是一个猜测,也许数字不需要引号,ID 会。
  • 工作案例的路径是:\"root\\CIMV2\",失败案例的路径是:\"root\\Microsoft\\Windows\\Storage\"。失败的语句是:\"foreach (ManagementObject dp in disk.GetRelated(\"MSFT_Partition\"))\"
  • 在为特定实例构造 ManagementObject 时,路径必须使用关键属性.在MSFT_Disk class 中,Number 不是关键属性,但ObjectId 是,因此请尝试使用它来引用它。 Win32_DiskDrive.DeviceID 有效,因为这是一个关键属性。

标签: c# .net wmi system.management


【解决方案1】:

@user9938:感谢您的回复以及对MSFT_xxx 项目的关注。我正在寻找与Win32_xxx 方法类似的语法解决方案。

经过大量的试验和错误,使用MSFT_Disk 时,似乎根本不支持在ManagementObject 声明语句中直接分配特定磁盘的方法。

这两个语句中的任何一个都可以正常工作:

var disk = new ManagementObject("Win32_DiskDrive=
var disk = new ManagementObject("Win32_DiskDrive.DeviceID=

使用MSFT_Disk 时似乎没有任何类似的声明。

因此,最简单的代码解决方案是:

        var phy = "0";    // ... or any valid disk index
        int num = 0;
        var disk = new ManagementObject("Win32_DiskDrive='\\\\.\\PHYSICALDRIVE" + phy + "'");
        foreach (ManagementObject dp in disk.GetRelated("Win32_DiskPartition"))
        {
            foreach (ManagementObject ld in dp.GetRelated("Win32_LogicalDisk")) ++num;
        }

【讨论】:

    【解决方案2】:

    有多种方法可以检索信息。请尝试以下操作:

    private int GetNumberOfLogicalDrives(int number)
    {
        int numLogicalDrives = 0;
        using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(new ManagementScope(@"root\Microsoft\Windows\Storage"), new SelectQuery($"SELECT * FROM MSFT_Disk WHERE Number = {number}")))
        {
            using (ManagementObjectCollection logicalDrives = searcher.Get())
            {
                if (logicalDrives != null && logicalDrives.Count > 0)
                {
                    foreach (ManagementObject mObj in logicalDrives)
                    {
                        //re-initialize
                        numLogicalDrives = 0;
    
                        if (mObj == null)
                            continue;
    
                        foreach (ManagementObject mObjDP in mObj.GetRelated("MSFT_Partition"))
                        {
                            if (mObjDP == null)
                                continue;
    
                            foreach (ManagementObject mObjLD in mObjDP.GetRelated("MSFT_Volume"))
                            {
                                if (mObjLD == null)
                                    continue;
    
                                //skip if there isn't a drive letter
                                if (String.IsNullOrEmpty(mObjLD["DriveLetter"]?.ToString().Trim()))
                                    continue;
    
                                numLogicalDrives++; //increment
                            }
                        }
    
                        Debug.WriteLine($"number: {number}; numLogicalDrives: {numLogicalDrives}");
                    }
                }
            }
        }
    
        return numLogicalDrives;
    }
    

    用法:

    int numLogicalDrives = GetNumberOfLogicalDrives(0);
    

    资源:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多