WMI VBScript与C#

Dej*_*jan 2 c# vbscript wmi

我正在尝试获取有关本地计算机上安装的软件的信息(一个是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
Run Code Online (Sandbox Code Playgroud)

这是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"] : "/");
}
Run Code Online (Sandbox Code Playgroud)

第二个代码段(C#)无法正常工作.它没有给我任何错误,它只返回null.问题在于,当我使用其他WMI类(例如Win32_ComputerSystem)时,C#代码可以完美运行.但同样,它不适用于Win32_DiskDrive类,也适用于此特殊情况等.

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

谢谢你的回答.

dhi*_*lis 7

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

你可以在这里下载发电机

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)