Einzelnen Beitrag anzeigen

Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Was ist der Unterschied zwischen Admin und SYSTEM

  Alt 25. Mai 2007, 22:47
Hallo,

ich versuche mich gerade daran die Usernamen von den Processen auszulesen. Ich habe dazu auch in der DP diese Funktion gefunden : (diese hier ist schon leicht verändert durch meine Versuche)
Delphi-Quellcode:
type
  PTOKEN_USER = ^TOKEN_USER;
  _TOKEN_USER = record
    User: TSidAndAttributes;
  end;
  TOKEN_USER = _TOKEN_USER;

function GetUserAndDomainFromPID(ProcessId: DWORD): string;
var
  hToken: THandle;
  cbBuf: Cardinal;
  ptiUser: PTOKEN_USER;
  snu: SID_NAME_USE;
  ProcessHandle: THandle;
  UserSize, DomainSize: DWORD;
  bSuccess: Boolean;
  User: String;
  Domain: String;
begin
  Result := '';
  ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION, False, ProcessId);
  if ProcessHandle <> 0 then begin
    if (EnableProcessPrivilege(True, 'SeSecurityPrivilege')) and (EnableProcessPrivilege(True, 'SeDebugPrivilege')) then
    begin
      try
        if OpenProcessToken(ProcessHandle, TOKEN_QUERY, hToken) then
        begin
          try
            ptiUser := nil;
            bSuccess := GetTokenInformation(hToken, TokenUser, nil, 0, cbBuf);
            while not bSuccess and (GetLastError = ERROR_INSUFFICIENT_BUFFER) do
            begin
              ReallocMem(ptiUser, cbBuf);
              bSuccess := GetTokenInformation(
                hToken, TokenUser, ptiUser, cbBuf, cbBuf
              );
            end;
            if bSuccess then begin
              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
                  User := StrPas(PChar(User));
                  Domain := StrPas(PChar(Domain));
                  Result := User;
                end;
              end;
            end;
          finally
            if assigned(ptiUser) then
              FreeMem(ptiUser);
            CloseHandle(hToken);
          end;
        end;
      finally
        CloseHandle(ProcessHandle);
      end;
    end;
  end;
end;
Es funktioniert auch fast alles. Wird diese Funktion unter Administrator-Rechten ausgeführt, dann werden die Usernamen Lokaler Dienst und Netzwerkdienst nicht angezeigt. Führe ich diese Funktion unter SYSTEM-Rechten aus, werden die beiden Usernamen angezeigt. Was ist jetzt der Unterschied ? Was muss ich an der Funktion ändern, dass bei den Administrator-Rechten genau das gleiche rauskommt wie bei den System-Rechten ?
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat