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