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)