我需要动态确定 WMI 类的哪个属性是 C# 中的主键。
我可以使用CIM Studio或WMI Delphi Code Creator手动定位此信息,但我需要找到一个类的所有属性名称和标志,即 / 是键 / 键......我已经知道如何找到的属性名称一类。
相关答案中涵盖了密钥的手动识别,我希望作者(我正在查看 RRUZ)能够向我介绍他们如何找到密钥(或其他任何可能知道的人)。
非常感谢。
我需要动态确定 WMI 类的哪个属性是 C# 中的主键。
我可以使用CIM Studio或WMI Delphi Code Creator手动定位此信息,但我需要找到一个类的所有属性名称和标志,即 / 是键 / 键......我已经知道如何找到的属性名称一类。
相关答案中涵盖了密钥的手动识别,我希望作者(我正在查看 RRUZ)能够向我介绍他们如何找到密钥(或其他任何可能知道的人)。
非常感谢。
要获取 WMI 类的键字段,您必须遍历qualifiers
WMI 类的属性,然后搜索被调用的限定符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();
}
}
}
对于那些感兴趣的人,我通过以下方式扩展了 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;
}