![]() |
Prüfen, ob ein Prozess ein SYSTEM Prozess ist
Hey,
ich würde gerne prüfen, ob der eigene Prozess ein SYSTEM Prozess, ein Prozess des LOKALEN DIENSTES oder ein Prozess des NETZWERKDIENSTES ist. Dachte mir das in etwa so:
Delphi-Quellcode:
Gibt allerdings immer false zurück. Mach ich was falsch?
function IsSystemProcess: Boolean;
type PTOKEN_USER = ^TOKEN_USER; _TOKEN_USER = record User: TSidAndAttributes; end; TOKEN_USER = _TOKEN_USER; const 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 AllocateAndInitializeSID(SystemSid, 1, SECURITY_LOCAL_SYSTEM_RID, 0, 0, 0, 0, 0, 0, 0, pSystemSid); Result := EqualSid(ptiUser.User.Sid, pSystemSid); end; finally if Assigned(ptiUser) then begin FreeMem(ptiUser); end; CloseHandle(hToken); end; end; end; Gruß Zacherl |
Re: Prüfen, ob ein Prozess ein SYSTEM Prozess ist
So gehts mit den SYSTEM Prozessen schonmal, das hab ich getestet:
Delphi-Quellcode:
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 :mrgreen: 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?
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; Gruß Zacherl |
Re: Prüfen, ob ein Prozess ein SYSTEM Prozess ist
Du musst schon den relativen Sicherheitsbezeichner (RID) anpassen:
Du verwendest für SYSTEM: SECURITY_LOCAL_SYSTEM_RID hier gibts die anderen: ![]() PS. Weißt du, dass diese ganzen Strukturen (PTOKEN_USER) bereits durch die JEDI API units (JwaWinNT) definiert sind? Die JWSCL bietet zudem noch eine leichtere Lösung von diese Art von Problem. |
Re: Prüfen, ob ein Prozess ein SYSTEM Prozess ist
Ah cool danke dir, die JWSCL sehe ich mir gleich mal an. Mit den angepassen RIDs klapt es jetzt allerdings auch :)
|
Re: Prüfen, ob ein Prozess ein SYSTEM Prozess ist
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz