c # «Недопустимый класс» в простом запросе WMI - PullRequest
9 голосов
/ 03 августа 2011

Я хотел бы найти какой-то результат после этого запроса, но в начале цикла 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_Process.

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

Ответы [ 3 ]

13 голосов
/ 03 августа 2011

Я решаю свою проблему. Кажется, что мой 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" и перезагрузите компьютер.

2 голосов
/ 03 августа 2011

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

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

foreach (Process process in processes)
    Console.WriteLine(process.ProcessName);
...
0 голосов
/ 03 мая 2018

На мой взгляд, исключение не в достаточной мере излагает проблему.Код ниже работает.Например, если вы пропустите в области действия \ 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);
}
...