我已经成功地编写了一个脚本,用于获取任何进程的内存消耗 (TProcessMemoryCounters)。但是,我需要运行我的程序提升的(以admin的身份运行),以便为某些系统或提升的进程获取这些信息(否则OpenProcess返回ERROR_ACCESS_DENIED)。像过程资源管理器这样的程序不需要提升模式。
获取进程内存信息的脚本:
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;通过下面的脚本,我获得了所有进程的内存信息,但我的程序仍然需要提升:
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:如何使我的脚本在没有提升模式的情况下获得所有进程(包括系统)的内存信息?
发布于 2020-03-14 23:28:33
要使用GetProcessMemoryInfo(),还必须指定PROCESS_VM_READ访问权限,如文档所述
流程 这个过程的句柄。句柄必须具有
PROCESS_QUERY_INFORMATION或PROCESS_QUERY_LIMITED_INFORMATION访问权限(),并具有(再共享的)访问权限()。有关更多信息,请参见进程安全性和访问权限。 Windows 2003和Windows:重新分配句柄必须具有PROCESS_QUERY_INFORMATION、和相关联的访问权限。
如果手柄能够被成功打开,您也会泄漏它。
试一试:
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;https://stackoverflow.com/questions/60686168
复制相似问题