11

我想在这个查询之后找到一些结果,但是在 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 代码创建器从http://www.microsoft.com/downloads/en/details.aspx?familyid=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en下载它, 但我没有找到任何 Win32_Process。

有人有想法吗?

4

4 回答 4

17

我解决了我的问题。看来我的 WMI 已损坏。使用此步骤测试 WMI 后:

  1. 单击开始,单击运行,键入 wmimgmt.msc,然后单击确定。
  2. 右键单击 WMI 控件(本地),然后单击属性。

我看到 Win32_Process 是一个无效的类我按照这个步骤来修复我的 WMI,它可以工作

1)在开始菜单中输入“cmd”

2) 输入“net stop winmgmt”并回车

3) 打开 Windows 资源管理器并找到 C:\ windows\system32\WBEM\ 文件夹的路径,并将 Repository 文件夹重命名为 RepositoryOLD 之类的其他名称(右键单击并选择“重命名文件夹”)。

4)重启电脑

5)在开始菜单中输入“cmd”

6) 输入“net stop winmgmt”并回车

7) 键入“winmgmt /resetRepository”并重新启动计算机。

于 2011-08-03T17:15:07.787 回答
2

正如 dominus 所建议的,使用 Process 类:

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

foreach (Process process in processes)
    Console.WriteLine(process.ProcessName);
...
于 2011-08-02T21:42:25.283 回答
0

在我看来,这个例外并没有充分说明问题。下面的代码有效。例如,如果您在范围内省略“\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);
}
于 2018-05-03T11:16:10.233 回答
0

只是补充一下,因为这是在谷歌搜索中弹出的第一件事,并且在这里遇到问题C# wmi query exception invalid class using ManagmentObjectSearcher

并非所有 WMI 提供程序都有 32 位和 64 位版本。如果在 64 位机器上运行 32 位应用程序,您可能会得到无效的类。我知道在这种特殊情况下情况并非如此,因为 Win32_Process 具有 32 位和 64 位提供程序,但认为它可能对一些到达这里的人有用。

于 2020-09-05T09:10:57.353 回答