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进程...我想要遍历不到该怎么实现?

解决方案 »

  1.   

    告诉你两个API
    先OpenProcessToken
    然后……GetTokenInformation   
    用这两个函数可以取得用户名,
    然后就可以判断本进程是不是你要显示的用户进程了
      

  2.   

    你可以用楼上的方法,以前看过一些示例代码
    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;