Delphi   发布时间:2022-04-11  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了枚举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中的运行进程全部内容,希望文章能够帮你解决枚举Delphi中的运行进程所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: