2010-06-24 5 views
2

로컬 컴퓨터 (하나는 Windows 7 및 기타 XP SP3)에 설치된 소프트웨어에 대한 정보를 얻으려고하고 있으며 VBScript로 할 수 있지만 C#에서는 할 수 없습니다. 여기 WMI VBScript vs C#

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 번호)가 작동되지

여기 VBScript 코드이다. 그것은 나에게 어떤 오류도주지 않는다. 단지 null을 반환한다. 문제는 Win32_ComputerSystem과 같은 다른 WMI 클래스를 사용할 때 C# 코드가 완벽하게 작동한다는 것입니다. 그러나 다시 Win32_DiskDrive 클래스,이 특별한 경우 등에서는 작동하지 않습니다.

결론적으로 C#에서는 WMI가 일부 클래스에서만 작동하며 VBScript에서는 모두 작동합니다. 왜 그런지 궁금합니다.

답변 해 주셔서 감사합니다.

답변

6

이것은 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); 
      } 
     } 
    } 
} 
+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());      
} 

희망을.