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 с этим шагом:
- Нажмите кнопку Пуск, нажмите кнопку Выполнить, введите wmimgmt.MSC, а затем нажмите кнопку ОК.
- щелкните правой кнопкой мыши элемент управления 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);
}