解决方法
一种方法是在
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;