WMI VBScript против C # - PullRequest
       14

WMI VBScript против C #

2 голосов
/ 25 июня 2010

Я пытаюсь получить информацию об установленном программном обеспечении на локальных компьютерах (один из них - 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"] : "/");
}

Второй фрагмент кода (C #) не работает. Это не дает мне никакой ошибки, оно просто возвращает ноль. Дело в том, что код C # работает безупречно, когда я использую какой-то другой класс WMI, например, Win32_ComputerSystem. Но опять же, он не работает для класса Win32_DiskDrive, а также для этого конкретного случая и т. Д.

В заключение, в C # WMI работает только для некоторых классов, а в VBScript они все работают. Итак, мне интересно, почему это?

Спасибо за ответы.

Ответы [ 2 ]

7 голосов
/ 25 июня 2010

Это некоторый код, который я сгенерировал, используя генератор кода WMI от Microsoft.Кажется, вы получите данные, которые вам нужны.

Вы можете скачать генератор здесь

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);
            }
        }
    }
}
0 голосов
/ 25 июня 2010

Другой код 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());                    
}

Надеюсь, что это кому-нибудь поможет.

...