You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:03:12