我正在准备一个 Delphi 模块,它在线程中设置一个钩子来记录宏:
FHandleRec := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);
FHandlePlay := SetWindowsHookEx(WH_JOURNALPLAYBACK, FPlayProc, HInstance, 0);
这在 WinXP 上运行良好,但在 Vista/Windows 7 上以ERROR_ACCESS_DENIED
. 我在谷歌(this)中找到了(that)。报价单:
较低权限的进程不能: … 使用日志挂钩来监控较高权限的进程。
试过没有成功:
- 以管理员身份运行应用程序。可能线程的启动权限低于主线程(尽管我不是 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 下设置挂钩的代码或建议可行的解决方案?