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
, Я нашел в гугле (это) ссылаясь (это). Цитата:
Процесс с более низким уровнем привилегий не может:… Использовать перехватчики журнала для мониторинга процесса с более высоким уровнем привилегий.
Пробовал без успеха:
Запустите приложение от имени администратора. Возможно, поток запускается с более низкими привилегиями, чем основной поток (хотя я не уверен на 100%)Олицетворение потока с контекстом безопасности администратора также не помогает.Пример кода:
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
выполнить без ошибок.
Другие возможности попробовать:
Выключите UAC постоянно. Это помогает, но я не могу заставить пользователей модуля делать это.Клиент модуля подписывает заявку и помещает ее в надежное место. Не пробовал, но это радикально усложняет использование модуля для пользователей.Поместите модуль в какое-нибудь подписанное приложение и раздайте EXE. Это сломает некоторые основные функции.Не могли бы вы показать код, который устанавливает ловушку под Visa / Windows 7 или предложить рабочее решение?