如何获取SYSTEM权限进程的所有者?WinAPI方案遇阻求助
解决方案
核心问题
管理员权限启动的程序默认不会自动激活SeDebugPrivilege权限,但IDE调试模式下,调试器会自动为进程开启该权限,这就是调试时能访问SYSTEM进程、正常运行却失败的原因。
具体解决步骤
- 先手动启用SeDebugPrivilege权限
在调用OpenProcess之前,先给当前进程开启调试权限,Delphi代码示例:function EnableDebugPrivilege: Boolean; var hToken: THandle; TokenPriv: TTokenPrivileges; ReturnLength: DWORD; begin Result := False; // 打开当前进程的令牌 if OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then try // 获取SeDebugPrivilege的LUID值 if LookupPrivilegeValue(nil, 'SeDebugPrivilege', TokenPriv.Privileges[0].Luid) then begin TokenPriv.PrivilegeCount := 1; TokenPriv.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; // 调整令牌权限,启用Debug权限 Result := AdjustTokenPrivileges(hToken, False, TokenPriv, SizeOf(TTokenPrivileges), nil, ReturnLength); end; finally CloseHandle(hToken); end; end; - 调用OpenProcess时用正确的权限参数
Win10下推荐使用PROCESS_QUERY_LIMITED_INFORMATION(比PROCESS_QUERY_INFORMATION更安全),示例:hProcess := OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, False, 目标PID); - 按原有流程获取进程所有者
权限开启后,继续用OpenProcessToken、GetTokenInformation、LookupAccountSid的原有逻辑即可。
额外说明
- 启用
SeDebugPrivilege后也无法访问所有受保护的系统进程,但大部分普通SYSTEM进程都能正常读取所有者信息。 - 权限不需要手动关闭,进程退出时系统会自动回收相关权限。
内容的提问来源于stack exchange,提问作者casiosmu
相关产品推荐
相关产品推荐

