如何在C#中通过进程ID利用ManagementObject查找64位进程
在C#中用ManagementObject获取64位进程的解决方案
首先要明确:Win32_Process WMI类本身是支持查询64位进程的,问题通常出在32位程序在64位系统上运行时的默认WMI架构限制上。下面分场景给你具体的实现方案:
1. 64位程序直接查询(无需额外配置)
如果你的C#项目是按x64架构编译(或者AnyCPU模式下关闭了「Prefer 32-bit」选项),在64位Windows系统上运行时,直接用你原来的查询语句就能获取包括64位在内的所有进程:
int parentPid = // 你的父进程ID using (var searcher = new ManagementObjectSearcher($"select ProcessId from Win32_Process where ParentProcessId={parentPid}")) { foreach (ManagementBaseObject m in searcher.Get()) { int childPid = Convert.ToInt32(m["ProcessId"]); // 这里拿到的childPid可能是32位或64位进程,取决于实际运行的进程 } }
2. 32位程序查询64位进程(需要配置WMI架构)
如果你的程序是32位编译的,在64位系统上默认只能看到32位进程。要获取64位进程,需要在ManagementScope中指定查询架构为64位:
int parentPid = // 你的父进程ID // 创建WMI范围并配置64位架构 var scope = new ManagementScope(@"\\.\root\cimv2"); scope.Options = new ConnectionOptions(); // 关键配置:强制使用64位WMI提供程序 scope.Options.Context.Add("__ProviderArchitecture", 64); scope.Options.Context.Add("__RequiredArchitecture", true); scope.Connect(); // 执行查询 var query = new ObjectQuery($"select ProcessId from Win32_Process where ParentProcessId={parentPid}"); using (var searcher = new ManagementObjectSearcher(scope, query)) { foreach (ManagementBaseObject m in searcher.Get()) { int childPid = Convert.ToInt32(m["ProcessId"]); // 现在可以拿到64位的子进程ID了 } }
3. 验证进程是否为64位
如果你需要精准筛选出64位进程,可以查询Win32_Process的AddressWidth属性——该属性返回32表示32位进程,64表示64位进程:
var query = new ObjectQuery($"select ProcessId, AddressWidth from Win32_Process where ParentProcessId={parentPid}"); // (如果是32位程序,记得先配置WMI架构) using (var searcher = new ManagementObjectSearcher(scope, query)) { foreach (ManagementBaseObject m in searcher.Get()) { int pid = Convert.ToInt32(m["ProcessId"]); int addressWidth = Convert.ToInt32(m["AddressWidth"]); bool is64BitProcess = addressWidth == 64; if (is64BitProcess) { Console.WriteLine($"找到64位子进程ID:{pid}"); // 这里可以添加终止进程的逻辑 } } }
注意事项
- 操作进程(尤其是终止进程)需要管理员权限,建议右键以管理员身份运行你的程序。
- 如果在32位系统上运行,无论程序架构如何,都只能查询到32位进程,因为32位系统不支持64位进程。
内容的提问来源于stack exchange,提问作者we know
相关产品推荐
相关产品推荐

