2010-06-24 3 views
2

Я пытаюсь получить информацию об установленном программном обеспечении на локальных компьютерах (один из них - Windows 7 и другой XP SP3), и я могу сделать это с помощью VBScript, но не с C#.WMI VBScript vs 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#) не работает. Это не дает мне никакой ошибки, она просто возвращает null. Дело в том, что код C# работает безупречно, например, когда я использую какой-либо другой класс WMI, например Win32_ComputerSystem. Но опять же, он не работает для класса Win32_DiskDrive, также в этом конкретном случае и т. Д.

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

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

ответ

6

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

Вы можете скачать генератор 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); 
      } 
     } 
    } 
} 
+0

Ничего себе. Работает. Большое спасибо. Я предполагаю, что мне не хватает пространства имен root \\ CIMV2. – Dejan

+0

Рад это услышать. – dhillis

+0

Спасибо за ссылку на генератор кода WMI. Это стало очень полезным инструментом для меня. :) – Dejan

0

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

Надеется, что это поможет кому-то.

Смежные вопросы