C# "недопустимый класс" в простом запросе WMI

Я хотел бы найти некоторый результат после этого запроса, но в начале цикла foreach возникает ошибка "недопустимый класс".

string wmiQuery = string.Format("SELECT * FROM Win32_Process");
var searcher = new ManagementObjectSearcher(wmiQuery);
var wmiResults = searcher.Get();

foreach (ManagementObject retObject in wmiResults)
 {
   Console.WriteLine("[{0}]tName: {1}", retObject["ProcessID"], retObject["Name"]);
 }

Я использую окно 7 64, и мне интересно, существует ли Win32_Process. Я также использую WMI code creator скачать его с http://www.microsoft.com/downloads/en/details.aspx?familyid=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en но я не нахожу никакого процесса Win32.

У кого-то есть идея ?

3 ответов


Я решаю свою проблему. Похоже, что мой WMI был поврежден. После тестирования WMI с этим шагом:

  1. Нажмите кнопку Пуск, нажмите кнопку Выполнить, введите wmimgmt.MSC, а затем нажмите кнопку ОК.
  2. щелкните правой кнопкой мыши элемент управления WMI (локальный) и выберите команду свойства.

Я видел, что Win32_Process был недопустимым классом Я следую этому шагу для восстановления моего WMI, и он работает

1) в меню Пуск введите "cmd"

2) Введите "net stop winmgmt" и нажмите Enter

3) Откройте проводник Windows и найдите путь к папке C:\ windows\system32\WBEM\ и переименуйте папку репозитория во что-то другое, например RepositoryOLD (щелкните правой кнопкой мыши и выберите "переименовать папку").

4) перезагрузите компьютер

5) в меню Пуск введите "cmd"

6) введите "net stop winmgmt" и нажмите enter

7) введите "winmgmt / resetRepository" и перезагрузите компьютер.


как предложил dominus, используйте класс Process:

...
Process[] processes = Process.GetProcesses();

foreach (Process process in processes)
    Console.WriteLine(process.ProcessName);
...

на мой взгляд, исключение недостаточно указывает на проблему. Код ниже работает. Если, например, опустить "\cimv2" в области, возникает исключение. Если вы, например, ошибочно выбрали из "Win32_Processes", также возникает исключение. Поэтому, по крайней мере, убедитесь, что область верна и запрос верен.

ManagementScope scope = new ManagementScope(@"\localhost\root\cimv2");
ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Process");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);
foreach (ManagementBaseObject eachObject in searcher.Get())
{
    Console.WriteLine("Value: {0}", eachObject);
}