首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果程序未被提升,OpenProcess()返回ERROR_ACCESS_DENIED

如果程序未被提升,OpenProcess()返回ERROR_ACCESS_DENIED
EN

Stack Overflow用户
提问于 2020-03-14 18:45:21
回答 1查看 341关注 0票数 0

我已经成功地编写了一个脚本,用于获取任何进程的内存消耗 (TProcessMemoryCounters)。但是,我需要运行我的程序提升的(以admin的身份运行),以便为某些系统或提升的进程获取这些信息(否则OpenProcess返回ERROR_ACCESS_DENIED)。像过程资源管理器这样的程序不需要提升模式。

获取进程内存信息的脚本:

代码语言:javascript
运行
复制
  function GetProcessMemory(ProcID: Cardinal): Cardinal;
  var
    MemCounters: TProcessMemoryCounters;
    HProc: THandle;
  begin
    Result:= 0;
    HProc:= OpenProcess(
      PROCESS_QUERY_LIMITED_INFORMATION //or SYNCHRONIZE
      , False, ProcID);
    //HProc: 5 = ERROR_ACCESS_DENIED

    if GetProcessMemoryInfo(HProc, @MemCounters, SizeOf(TProcessMemoryCounters)) then
      Result :=
        MemCounters.WorkingSetSize;
  end;

通过下面的脚本,我获得了所有进程的内存信息,但我的程序仍然需要提升:

代码语言:javascript
运行
复制
  function EnableDebugPriv(): Boolean;
  const
    SE_DEBUG_NAME = 'SeDebugPrivilege';
  var
    HToken: NativeUInt;
    LUID: Int64;
    Tkp: TTokenPrivileges;
    AA: Cardinal;
  begin
    OpenProcessToken(GetCurrentProcess,
      TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,
      HToken
    );

    LookupPrivilegeValue(nil, SE_DEBUG_NAME, LUID);

    Tkp.PrivilegeCount:= 1;
    Tkp.Privileges[0].Luid:= LUID;
    Tkp.Privileges[0].Attributes:= SE_PRIVILEGE_ENABLED;

    AdjustTokenPrivileges(HToken, False, Tkp, SizeOf(Tkp), nil, AA);

    CloseHandle(HToken);
  end;

Q:如何使我的脚本在没有提升模式的情况下获得所有进程(包括系统)的内存信息?

EN

回答 1

Stack Overflow用户

发布于 2020-03-14 23:28:33

要使用GetProcessMemoryInfo(),还必须指定PROCESS_VM_READ访问权限,如文档所述

流程 这个过程的句柄。句柄必须具有PROCESS_QUERY_INFORMATIONPROCESS_QUERY_LIMITED_INFORMATION访问权限(),并具有(再共享的)访问权限()。有关更多信息,请参见进程安全性和访问权限。 Windows 2003和Windows:重新分配句柄必须具有PROCESS_QUERY_INFORMATION相关联的访问权限。

如果手柄能够被成功打开,您也会泄漏它。

试一试:

代码语言:javascript
运行
复制
function GetProcessMemory(ProcID: DWORD): DWORD;
var
  MemCounters: TProcessMemoryCounters;
  HProc: THandle;
begin
  Result := 0;
  HProc := OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION or PROCESS_VM_READ, False, ProcID);
  if HProc <> 0 then
  begin
    if GetProcessMemoryInfo(HProc, @MemCounters, SizeOf(TProcessMemoryCounters)) then
      Result := MemCounters.WorkingSetSize;
    CloseHandle(HProc);
  end;
end;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60686168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档