枚举Delphi中的运行进程
发布时间:2020-12-15 04:12:19 所属栏目:大数据 来源:网络整理
导读:如何使用Delphi在我的机器上获取正在运行的进程列表(包含PID,所有者等的详细信息)? 编辑:所提出的解决方案都没有给我拥有该进程的用户,只有PID,ExeName等信息…… 解决方法 一种方法是在 Windows NT上使用 Tool Help library(参见TlHelp32单元)或 EnumProc
如何使用Delphi在我的机器上获取正在运行的进程列表(包含PID,所有者等的详细信息)?
编辑:所提出的解决方案都没有给我拥有该进程的用户,只有PID,ExeName等信息…… 解决方法
一种方法是在
Windows NT上使用
Tool Help library(参见TlHelp32单元)或
EnumProcesses(参见PsAPI单元).有关示例,请查看
JCL中的JclSysInfo.RunningProcessesList.
以下是如何获取进程用户名的快速示例: type PTokenUser = ^TTokenUser; TTokenUser = packed record User: SID_AND_ATTRIBUTES; end; function GetProcessUserName(ProcessID: Cardinal; out DomainName,UserName: string): Boolean; var ProcessHandle,ProcessToken: THandle; InfoSize,UserNameSize,DomainNameSize: Cardinal; User: PTokenUser; Use: SID_NAME_USE; _DomainName,_UserName: array[0..255] of Char; begin Result := False; DomainName := ''; UserName := ''; ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,ProcessID); if ProcessHandle = 0 then Exit; try if not OpenProcessToken(ProcessHandle,TOKEN_QUERY,ProcessToken) then Exit; try GetTokenInformation(ProcessToken,TokenUser,nil,InfoSize); User := AllocMem(InfoSize * 2); try if GetTokenInformation(ProcessToken,User,InfoSize * 2,InfoSize) then begin DomainNameSize := SizeOf(_DomainName); UserNameSize := SizeOf(_UserName); Result := LookupAccountSid(nil,User^.User.Sid,_UserName,_DomainName,DomainNameSize,Use); if Result then begin SetString(DomainName,StrLen(_DomainName)); SetString(UserName,StrLen(_UserName)); end; end; finally FreeMem(User); end; finally CloseHandle(ProcessToken); end; finally CloseHandle(ProcessHandle); end; end; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |