Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Владелец процесса


Автор: Danger 25.4.2010, 14:35
Привет всем,

Мне нужно определить владельцев всех процессов, имеющихся в системе. 
Получаю список процессов системы при помощи 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.

Автор: Riply 28.4.2010, 10:45
Цитата(Danger @  25.4.2010,  14:35 Найти цитируемый пост)
PROCESS_QUERY_INFORMATION + PROCESS_VM_READ


Нет среды под рукой дабы проверить, что дело в этом: "+" это не тоже самое, что "or"

Автор: Danger 28.4.2010, 12:14
Уже сделал через WTSEnumerateProcesses() (собственно, меня интересовали только терминальные процессы).
Обсуждение на на форуме "Делфимастера", может, кому-то пригодится: http://www.delphimaster.ru/cgi-bin/forum.pl?id=1272196394&n=5

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)