SetWindowsHookEx для WH_JOURNALRECORD не работает в Vista / Windows 7

Я готовлю модуль Delphi, который устанавливает ловушку в потоке для записи макроса:

FHandleRec  := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);
FHandlePlay := SetWindowsHookEx(WH_JOURNALPLAYBACK, FPlayProc, HInstance, 0);

Это отлично работает в WinXP, но в Vista / Windows 7 не работает с ERROR_ACCESS_DENIED . Я нашел в Google ( this ) со ссылкой ( that ). Цитата:

Процесс с более низкими привилегиями не может:… использовать ловушки журнала для отслеживания процесс с более высокими привилегиями.

Безуспешная попытка:

  1. Запустить приложение от имени администратора. Наверное, тред запущен с более низкими привилегиями, чем основной поток (хотя я не на 100% sure)
  2. Выдача себя за поток в контексте безопасности администратора тоже не помогает.

Пример кода:

if LogonUser(PWideChar(sAdminUser), PWideChar(sDomain), PWideChar(sPwd),
             LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, hToken) then 
begin  
  if not ImpersonateLoggedOnUser(hToken) then
    raise Exception.Create('Error impersonating the user');
end;
FHandleRec := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);

LogonUser и ImpersonateLoggedOnUser выполняются без ошибок.

Другие возможности попробовать:

  1. Выключить UAC навсегда. Это помогает, но я не могу заставить модуль пользователи делают это.
  2. Клиент модуля подписывает приложение и помещает его в доверенный место расположения. Не пробовал, но это кардинально усложняет модуль использование для пользователей.
  3. Поместите модуль в какое-нибудь подписанное приложение и распространите EXE. Тот нарушит некоторые основные функции.

Не могли бы вы показать код, который устанавливает перехватчик в Visa / Windows 7, или предложить рабочее решение?

8
задан da-soft 7 February 2012 в 05:44
поделиться