4

我需要动态确定 WMI 类的哪个属性是 C# 中的主键。

我可以使用CIM StudioWMI Delphi Code Creator手动定位此信息,但我需要找到一个类的所有属性名称和标志,即 / 是键 / 键......我已经知道如何找到的属性名称一类。

相关答案中涵盖了密钥的手动识别,我希望作者(我正在查看 RRUZ)能够向我介绍他们如何找到密钥(或其他任何可能知道的人)。

非常感谢。

4

2 回答 2

6

要获取 WMI 类的键字段,您必须遍历qualifiersWMI 类的属性,然后搜索被调用的限定符key,最后检查该限定符的值是否为true

试试这个样本

using System;
using System.Collections.Generic;
using System.Management;
using System.Text;

namespace GetWMI_Info
{
    class Program
    {

        static string GetKeyField(string WmiCLass)
        {
            string key = null; 
            ManagementClass manClass = new ManagementClass(WmiCLass);
            manClass.Options.UseAmendedQualifiers = true;
            foreach (PropertyData Property in manClass.Properties)
                foreach (QualifierData Qualifier in Property.Qualifiers)
                    if (Qualifier.Name.Equals("key") && ((System.Boolean)Qualifier.Value))                        
                        return Property.Name;
            return key;                                                    
        }

        static void Main(string[] args)
        {
            try
            {
                Console.WriteLine(String.Format("The Key field of the WMI class {0} is {1}", "Win32_DiskPartition", GetKeyField("Win32_DiskPartition")));
                Console.WriteLine(String.Format("The Key field of the WMI class {0} is {1}", "Win32_Process", GetKeyField("Win32_Process")));
            }
            catch (Exception e)
            {
                Console.WriteLine(String.Format("Exception {0} Trace {1}", e.Message, e.StackTrace));
            }
            Console.WriteLine("Press Enter to exit");
            Console.Read();
        }
    }
}
于 2013-06-17T16:03:34.463 回答
2

对于那些感兴趣的人,我通过以下方式扩展了 RRUZ 的答案:

  • 允许对远程机器运行查询,并且
  • 添加对具有多个主键的类的支持(如Win32_DeviceBus的情况)。

    static void Main(string[] args)
    {
        foreach (var key in GetPrimaryKeys(@"root\cimv2\win32_devicebus"))
        {
            Console.WriteLine(key);
        }
    }
    
    static List<string> GetPrimaryKeys(string classPath, string computer = ".")
    {
        var keys = new List<string>();
        var scope = new ManagementScope(string.Format(@"\\{0}\{1}", computer, System.IO.Path.GetDirectoryName(classPath)));
        var path = new ManagementPath(System.IO.Path.GetFileName(classPath));
        var options = new ObjectGetOptions(null, TimeSpan.MaxValue, true);
        using (var mc = new ManagementClass(scope, path, options))
        {
            foreach (var property in mc.Properties)
            {
                foreach (var qualifier in property.Qualifiers)
                {
                    if (qualifier.Name.Equals("key") && ((System.Boolean)qualifier.Value))
                    {
                        keys.Add(property.Name);
                        break;
                    }
                }
            }
        }
        return keys;
    }
    
于 2013-06-18T01:51:52.560 回答