3

我正在绞尽脑汁思考如何做到这一点。大约 2 个月前,我发现了一个链接,该链接显示了如何从 wmi 调用中获取单个元素。

class Sample
{
    public static int Main(string[] args)
    {
        ManagementObject o =
            new ManagementObject("Win32_Service.Name='Alerter'");

        //or with a full path :

        ManagementObject mObj =
            new ManagementObject(
            "\\\\MyServer\\root\\MyApp:MyClass.Key='abc'");

        return 0;
    }
}

我认为这很棒,因为它返回结果比通过 WMI 进行完整搜索以获得 1 个属性要快得多。我摆弄它并让这段代码与 Win32_ComputerSystem 一起工作,我想我什至让它与 Win32_DiskDrive 和 BaseBoard 一起工作,但我不记得我的头顶,因为我找不到那段特定的代码. 所以现在我正试图让它与 Win32_BIOS 一起工作并继续罢工。我似乎找不到“关键”属性,因此它会返回有效结果。

我尝试了以下路径无济于事。

\\.\root\cimv2:Win32_BIOS.SoftwareElementState=3
\\.\root\cimv2:Win32_BIOS.TargetOperatingSystem=0
\\.\root\cimv2:Win32_BIOS.SoftwareElementState=3,TargetOperatingSystem=0

我在 Win32_BIOS 类中找到的 2 个键是名称和版本。但版本是我需要的。由于我试图在不同的计算机上获取它,因此我不能只是硬编码一个名称,也找不到另一种获取 BIOS 名称的方法。所以我想我有点卡住了。有任何想法吗?

4

2 回答 2

3

您正在查找的 WMI 对象路径由 Name、SoftwareElementID、SoftwareElementState、TargetOperatingSystem 和 Version 属性构成。

看起来像这样

Win32_BIOS.Name="Ver 1.00 BIOS A05 PARTTBL",SoftwareElementID="Ver 1.00 BIOS A05 PARTTBL",SoftwareElementState=3,TargetOperatingSystem=0,Version="DELL   - 6040000"

如果您想知道具体实例的对象路径,您可以使用Wmi delphi code creator之类的工具。

在此处输入图像描述

于 2012-04-25T21:52:28.957 回答
0

我们使用 WMI 来枚举 LAN 中的网络接口信息。这是一组精简的代码,可以满足您的需求。您可以看到替换计算机名称很容易。此外,如果您通过 LAN 查询不同的计算机,则需要在 ConnectionOptions 对象中提供凭据。

String path = @"\\{0}\ROOT\CIMV2";
String BiosVersion = String.Empty;

ConnectionOptions co = new ConnectionOptions();
ManagementScope scope = 
    new ManagementScope(String.Format(path, "."), co);

scope.Connect();

ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_BIOS");
ManagementObjectSearcher search = new ManagementObjectSearcher(scope, query);

ManagementObjectCollection moc = search.Get();

foreach (ManagementObject mo in moc)
{
    BiosVersion = (String)mo["SMBIOSBIOSVersion"];
}
于 2012-04-25T19:06:34.100 回答