WMI VBScript 与 C#

Posted

技术标签:

【中文标题】WMI VBScript 与 C#【英文标题】:WMI VBScript vs C# 【发布时间】:2010-06-24 22:07:07 【问题描述】:

我正在尝试获取有关本地计算机上已安装软件的信息(一个是 Windows 7 和其他 XP SP3),我可以使用 VBScript 来完成,但不能使用 C#。

这是 VBScript 代码:

strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
    & "impersonationLevel=impersonate!\\" _
    & strComputer & "\root\cimv2")
Set colSoftware = objWMIService.ExecQuery _
    ("Select * from Win32_Product")

For Each objSoftware in colSoftware
    Wscript.Echo "Name: " & objSoftware.Name
    Wscript.Echo "Version: " & objSoftware.Version
Next

这里是 C# 代码:

string queryProd = "SELECT * FROM Win32_Product";                
ObjectQuery oQuery = new ObjectQuery(queryProd);
ManagementObjectSearcher searcherProd = new ManagementObjectSearcher(oQuery);
ManagementObjectCollection resultCollection = searcherProd.Get();

foreach (ManagementObject prodVar in resultCollection)

    Console.WriteLine("Product Name: 0, Version: 1.",
        (prodVar["Name"] == null) ? prodVar["Name"] : "/",
        (prodVar["Version"] == null) ? prodVar["Version"] : "/");

第二个代码 sn-p (C#) 不起作用。它没有给我任何错误,它只是返回null。问题是当我使用其他一些 WMI 类(例如 Win32_ComputerSystem)时,C# 代码可以完美运行。但同样,它不适用于 Win32_DiskDrive 类,也不适用于这种特殊情况等。

总之,在 C# 中,WMI 仅适用于某些类,而在 VBScript 中它们都适用。 所以,我想知道为什么会这样?

感谢您的回答。

【问题讨论】:

【参考方案1】:

这是我使用 Microsoft 的 WMI 代码生成器生成的一些代码。它似乎得到了你想要的数据。

您可以下载生成器here

using System;
using System.Management;
using System.Windows.Forms;

namespace WMISample

    public class MyWMIQuery
    
        public static void Main()
        
            try
            
                ManagementObjectSearcher searcher = 
                    new ManagementObjectSearcher("root\\CIMV2", 
                    "SELECT * FROM Win32_Product"); 

                foreach (ManagementObject queryObj in searcher.Get())
                
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Win32_Product instance");
                    Console.WriteLine("-----------------------------------");
                    Console.WriteLine("Name: 0", queryObj["Name"]);
                    Console.WriteLine("Version: 0", queryObj["Version"]);
                
            
            catch (ManagementException e)
            
                MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
            
        
    

【讨论】:

哇。它正在工作。十分感谢。我的猜测是我缺少“root\\CIMV2”命名空间。 感谢 WMI 代码生成器的链接。它对我来说只是一个非常有用的工具。 :) 当然。当我尝试获取 WMI 数据时,我发现该工具非常有用。玩得开心。【参考方案2】:

另一个适用于我的 C# 代码如下:

ManagementClass mgmt = new ManagementClass("Win32_Product");
ManagementObjectCollection objCol = mgmt.GetInstances();
foreach (ManagementObject obj in objCol)

    Console.WriteLine("Product Name: 0, Version: 1.",
        obj.Properties["Name"].Value.ToString(),
        obj.Properties["Version"].Value.ToString());                    

希望对大家有所帮助。

【讨论】:

以上是关于WMI VBScript 与 C#的主要内容,如果未能解决你的问题,请参考以下文章

vbscript 使用StdRegProv类通过VBScript调用WMI注册表,但未指定体系结构

vbscript 使用没有指定体系结构的StdRegProv类通过VBScript进行WMI注册表调用(GetStringValue)

vbscript WMI:RemoteShutdown

vbscript WMI - 获取事件日志tra截止日期

vbscript WMI:确定计算机上何时安装了操作系统

VBScript:如何检查 SWbemObjectSet 的有效性?