Einzelnen Beitrag anzeigen

Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

Re: Prüfen, ob ein Prozess ein SYSTEM Prozess ist

  Alt 28. Aug 2008, 16:27
So gehts mit den SYSTEM Prozessen schonmal, das hab ich getestet:

Delphi-Quellcode:
function IsSystemProcess: Boolean;

type
  PTOKEN_USER = ^TOKEN_USER;
  _TOKEN_USER = record
    User: TSidAndAttributes;
  end;
  TOKEN_USER = _TOKEN_USER;

const
  SECURITY_NT_AUTHORITY = 5;
  SECURITY_LOCAL_SYSTEM_RID = $00000012;

var
  hToken: THandle;
  cbBuf: Cardinal;
  ptiUser: PTOKEN_USER;
  bSuccess: Boolean;
  SystemSid: TSIDIdentifierAuthority;
  pSystemSid: PSID;
begin
  Result := false;
  
  if OpenProcessToken(GetCurrentProcess, 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
        SystemSid.Value[0] := 0;
        SystemSid.Value[1] := 0;
        SystemSid.Value[2] := 0;
        SystemSid.Value[3] := 0;
        SystemSid.Value[4] := 0;
        SystemSid.Value[5] := SECURITY_NT_AUTHORITY;
        pSystemSID := nil;
        AllocateAndInitializeSID(SystemSid, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0,
          0, 0, 0, 0, 0, pSystemSid);
        Result := EqualSid(PSID(ptiUser^.User.Sid), pSystemSid);
      end;
    finally
      if Assigned(ptiUser) then
      begin
        FreeMem(ptiUser);
      end;
      CloseHandle(hToken);
    end;
  end;
end;
Bin aber nicht sicher, ob NETZWERKDIENST und LOKALER DIENST Prozesse da mit eingeschlossen werden. Habe eine AppInit DLL mit dem Code erstellt, welche pro Prozess eine Datei mit der PID und Ja oder Nein dropt, da Systemprozesse ja z.b. auf einem anderen Desktop agieren und somit keine Nachrichten ausgeben können Bei den NETZWERKDIENST und LOKALER DIENST Prozessen wird allerdings nichts auf die Platte geschrieben von daher kann ich das nicht testen. Gibts da noch ne zweite SID auf die ich prüfen müsste?

Gruß Zacherl
  Mit Zitat antworten Zitat