Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Владелец процесса, ошибка при определении 
:(
    Опции темы
Danger
Дата 25.4.2010, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



Привет всем,

Мне нужно определить владельцев всех процессов, имеющихся в системе. 
Получаю список процессов системы при помощи 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.
PM WWW ICQ Jabber   Вверх
Riply
Дата 28.4.2010, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

Репутация: 21
Всего: 32



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


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

Это сообщение отредактировал(а) Riply - 28.4.2010, 10:46
PM MAIL   Вверх
Danger
Дата 28.4.2010, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 20.9.2006

Репутация: нет
Всего: нет



Уже сделал через WTSEnumerateProcesses() (собственно, меня интересовали только терминальные процессы).
Обсуждение на на форуме "Делфимастера", может, кому-то пригодится: http://www.delphimaster.ru/cgi-bin/forum.p...2196394&n=5
PM WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0694 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.