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 ?