Привет всем,
Мне нужно определить владельцев всех процессов, имеющихся в системе. Получаю список процессов системы при помощи EnumProcesses() (из PsAPI), затем пробую получить информацию о каждом конкретном процессе при помощи такой функции:
| Код | function GetProcessParams( dwProcessID: DWord; var strOwner: string; var timeCreate: PFileTime ): Boolean; var hProcess, hToken: THandle; ptiUser: PTOKEN_USER; peUse: SID_NAME_USE; dwLength: DWord; dwLen1, dwLen2: DWord; timeExit, timeKernel, timeUser: FILETIME;
begin Result:= false;
hProcess:= OpenProcess( PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, false, dwProcessId ); if ( hProcess > 0 ) then begin
// retrieving process owner if ( OpenProcessToken( hProcess, TOKEN_QUERY, hToken ) ) then begin
GetTokenInformation( hToken, TokenUser, nil, 0, dwLength ); if ( ( GetLastError = ERROR_INSUFFICIENT_BUFFER ) and ( dwLength > 0 ) ) then begin
GetMem( ptiUser, dwLength ); try if ( GetTokenInformation( hToken, TokenUser, ptiUser, dwLength, dwLength ) ) then if IsValidSid( ptiUser^.User.Sid ) then begin ZeroMemory( @strUsername, MAX_PATH ); ZeroMemory( @strDomain, MAX_PATH ); dwLen1:= MAX_PATH - 1; dwLen2:= MAX_PATH - 1;
if ( LookupAccountSid( nil, ptiUser^.User.Sid, strUsername, dwLen1, strDomain, dwLen2, peUse ) ) then begin; strOwner:= Copy( strDomain, 0, lstrlen( strDomain ) ) + '\' + Copy( strUsername, 0, lstrlen( strUsername ) ); Result:= true; end;
end; // 'if IsValidSid( ptiUser^.User.Sid ) then' finally FreeMem( ptiUser ); end;
end; // 'if ( ( GetLastError = ERROR_INSUFFICIENT_BUFFER ) and ( dwLength > 0 ) ) then'
CloseHandle( hToken ); end // 'if ( OpenProcessToken( hProcess, TOKEN_READ, hToken ) ) then' else Writeln('OpenProcessToken() failed - ', GetLastError); // TODO
// retrieving process times if ( not GetProcessTimes( hProcess, timeCreate^, timeExit, timeKernel, timeUser ) ) then // if fails, always set result to false begin Result:= false; Writeln('GetProcessTimes() failed'); end; // TODO
CloseHandle( hProcess ); end // 'if ( hProcess > 0 ) then' else Writeln('OpenProcess() failed'); // TODO if not ( Result ) then Writeln('FAILED'); // TODO
end;
|
Проблема в том, что при вызове OpenProcessToken() выдает ошибку "0x05 (Access Denied)" для процессов, владельцем которых не является запускающий программу пользователь. Подскажите, как побороть?
Хотя программу запускаю из-под администратора. Привилегии SE_DEBUG_NAME даны (без них отваливается на OpenProcess() ). Системы Windows 2003 и WIndows 7 Home. |