FsnapShotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);
ListLoop:=Process32First(FsnapShotHandle,FProcessEntry32);
i:=0;
while ListLoop do
begin
seleProcessName:=FProcessEntry32.szExeFile;
seleProcessid:=FProcessEntry32.th32ProcessID; if seleProcessName='test.exe' then
begin
cbbNameList.Items.Add(IntToStr(i+1));
selePid[i]:=seleProcessid;
i:=i+1;
end;
ListLoop:=Process32Next(FsnapShotHandle,FProcessEntry32);
end;
CloseHandle(FsnapShotHandle);
这是这样来遍历进程的...XP系统下,XP支持多用户操作
如果我在A用户里打开了test.exe程序
再切换到B用户里再打开test.exe程序这样在B用户里却能遍历的到A用户里的test.exe进程...我想要遍历不到该怎么实现?
FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);
ListLoop:=Process32First(FsnapShotHandle,FProcessEntry32);
i:=0;
while ListLoop do
begin
seleProcessName:=FProcessEntry32.szExeFile;
seleProcessid:=FProcessEntry32.th32ProcessID; if seleProcessName='test.exe' then
begin
cbbNameList.Items.Add(IntToStr(i+1));
selePid[i]:=seleProcessid;
i:=i+1;
end;
ListLoop:=Process32Next(FsnapShotHandle,FProcessEntry32);
end;
CloseHandle(FsnapShotHandle);
这是这样来遍历进程的...XP系统下,XP支持多用户操作
如果我在A用户里打开了test.exe程序
再切换到B用户里再打开test.exe程序这样在B用户里却能遍历的到A用户里的test.exe进程...我想要遍历不到该怎么实现?
先OpenProcessToken
然后……GetTokenInformation
用这两个函数可以取得用户名,
然后就可以判断本进程是不是你要显示的用户进程了
uses
TlHelp32; type
PTOKEN_USER = ^TOKEN_USER;
_TOKEN_USER = record
User: TSidAndAttributes;
end;
TOKEN_USER = _TOKEN_USER; function GetUserAndDomainFromPID(ProcessId: DWORD;
var User, Domain: string): Boolean;
var
hToken: THandle;
cbBuf: Cardinal;
ptiUser: PTOKEN_USER;
snu: SID_NAME_USE;
ProcessHandle: THandle;
UserSize, DomainSize: DWORD;
bSuccess: Boolean;
begin
Result := False;
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);
if ProcessHandle <> 0 then
begin
// EnableProcessPrivilege(ProcessHandle, 'SeSecurityPrivilege', True);
if OpenProcessToken(ProcessHandle, TOKEN_QUERY, hToken) then
begin
bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf);
ptiUser := nil;
while (not bSuccess) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do
begin
ReallocMem(ptiUser, cbBuf);
bSuccess := GetTokenInformation(hToken, TokenUser, ptiUser, cbBuf, cbBuf);
end;
CloseHandle(hToken); if not bSuccess then
begin
Exit;
end; UserSize := 0;
DomainSize := 0;
LookupAccountSid(nil, ptiUser.User.Sid, nil, UserSize, nil, DomainSize, snu);
if (UserSize <> 0) and (DomainSize <> 0) then
begin
SetLength(User, UserSize);
SetLength(Domain, DomainSize);
if LookupAccountSid(nil, ptiUser.User.Sid, PChar(User), UserSize,
PChar(Domain), DomainSize, snu) then
begin
Result := True;
User := StrPas(PChar(User));
Domain := StrPas(PChar(Domain));
end;
end; if bSuccess then
begin
FreeMem(ptiUser);
end;
end;
CloseHandle(ProcessHandle);
end;
end; procedure TForm1.Button1Click(Sender: TObject);
var
hProcSnap: THandle;
pe32: TProcessEntry32;
Domain, User: string;
s: string;
begin hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPALL, 0);
if hProcSnap = INVALID_HANDLE_VALUE then Exit; pe32.dwSize := SizeOf(ProcessEntry32); if Process32First(hProcSnap, pe32) = True then
while Process32Next(hProcSnap, pe32) = True do
begin if GetUserAndDomainFromPID(pe32.th32ProcessID, User, Domain) then
begin
s := Format('%s User: %s ; Domain: %s',[StrPas(pe32.szExeFile), User, Domain]);
Listbox1.Items.Add(s);
end else
Listbox1.Items.Add(StrPas(pe32.szExeFile));
end;
CloseHandle(hProcSnap);
end;