Я пытаюсь получить информацию об установленном программном обеспечении на локальных компьютерах (один из них - 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 все они работают. Итак, мне интересно, почему?
Спасибо за ответы.
Ничего себе. Работает. Большое спасибо. Я предполагаю, что мне не хватает пространства имен root \\ CIMV2. – Dejan
Рад это услышать. – dhillis
Спасибо за ссылку на генератор кода WMI. Это стало очень полезным инструментом для меня. :) – Dejan