枚举Delphi中的运行进程

如何使用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;

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...