我想在此查询后找到一些结果,但在foreach循环的开头,出现错误“invalid class”。
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。
有人有想法吗?
答案 0 :(得分:12)
我解决了我的问题。看来我的WMI已经腐败了。 在使用此步骤测试WMI之后:
我看到Win32_Process是一个无效的类 我按照这一步修复我的WMI,它可以正常工作
1)在开始菜单中输入“cmd”
2)键入“net stop winmgmt”并按Enter键
3)打开Windows资源管理器并找到C:\ windows \ system32 \ WBEM \文件夹的路径,并将Repository文件夹重命名为RepositoryOLD之类的其他内容(右键单击并选择“重命名文件夹”)。
4)重启电脑
5)在开始菜单中输入“cmd”
6)输入“net stop winmgmt”并按Enter键
7)输入“winmgmt / resetRepository”并重新启动计算机。
答案 1 :(得分:2)
正如dominus建议的那样,使用Process类:
...
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
Console.WriteLine(process.ProcessName);
...
答案 2 :(得分: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);
}
答案 3 :(得分:0)
只需添加一下,因为这是Google搜索上弹出的第一件事,{@ 3}}在这里发布了自己
并非所有WMI提供程序都具有32位和64位版本。如果在64位计算机上运行32位应用程序,则可能会得到无效的类。我知道在这种特殊情况下情况并非如此,因为Win32_Process具有32位和64位提供程序,但认为对于到达此处的用户可能有用。