Autor Beitrag
FD-83
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 49



BeitragVerfasst: Mi 02.11.05 15:41 
Ich möchte den Benutzernamen herausfinden unter dem die einzelnen Prozesse laufen. Das ganze mit einem eingeschränkten Benutzeraccount. Leider kann ich mit OpenProcess(PROCESS_QUERY_INFORMATION,... nur Prozesse öffnen, die unter dem Namen des aktuellen Benutzers laufen. Task-Manager und Process-Explorer (von SysInternals) zeigen jedoch zu allen Prozessen den Benutzernamen an obwohl sie auch nur unter den eingeschränkten Rechnten laufen...

Hier mal der Code:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
function GetUserAndDomainFromPID(ProcessId: DWORD; var User, Domain: string): Boolean;
var
  hProcess,hToken: Cardinal;
  szData: Cardinal;
  szDomain, szUser: Cardinal;
  Data: PSIDAndAttributes;
  snu: SID_NAME_USE;
  bSuccess: Boolean;
begin
  Result := False;
  bSuccess := False;

  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);

  if hProcess = 0 then
    ShowMessage(Format('OpenProcess - Fehler %d: %s',[GetLastError,SysErrorMessage(GetLastError)]))
  else
    begin

      if OpenProcessToken(hProcess, TOKEN_QUERY, hToken) then
        begin
          bSuccess := GetTokenInformation(hToken, TokenUser, nil0, szData);
          Data := AllocMem(szData);
          bSuccess := GetTokenInformation(hToken, TokenUser, Data, szData, szData);
          CloseHandle(hToken);
        end;

      if bSuccess then
        begin
          szUser := 0;
          szDomain := 0;

          LookupAccountSid(nil, Data^.Sid, nil, szUser, nil, szDomain, snu);
          if (szUser <> 0and (szDomain <> 0then
            begin
              SetLength(User, szUser);
              SetLength(Domain, szDomain);

              if LookupAccountSid(nil, Data^.Sid, PChar(User), szUser, PChar(Domain), szDomain, snu) then
                begin
                  Result := True;
                  User := StrPas(PChar(User));
                  Domain := StrPas(PChar(Domain));
                end;
            end;
        end;

      if Assigned(Data) then
        FreeMem(Data);

      CloseHandle(hProcess);
    end;
end;


Das Problem ist, dass OpenProcess bei Prozessen die unter anderem Benutzernamen laufen. "Zugriff verweigert" zurückgibt.

Wie kriege ich Zugriff auf die anderen Prozesse bzw. wie machen Task-Manager und Co. das?

Gruß
Frederik

Moderiert von user profile iconAXMD: Code- durch Delphi-Tags ersetzt