Я готовлю модуль Delphi, который устанавливает ловушку в потоке для записи макроса:
FHandleRec := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);
FHandlePlay := SetWindowsHookEx(WH_JOURNALPLAYBACK, FPlayProc, HInstance, 0);
Это прекрасно работает в WinXP, но в Vista / Windows 7 не работает с ERROR_ACCESS_DENIED
.
Я нашел в Google ( это ) ссылаясь (, что ). Цитата:
Процесс с более низким уровнем привилегий не может:… использовать журнальные ловушки для мониторинга
процесс с более высокими привилегиями.
Попытка без успеха:
- Запустить приложение от имени администратора. Возможно, поток запущен
с более низкими привилегиями, чем основной поток (хотя я не на 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 или предложить рабочее решение?