スレッドにフックを設定してマクロを記録する 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 )を参照しているのを見つけました。引用:
権限の低いプロセスは、次のことができません。 … ジャーナル フックを使用して、権限の高いプロセスを監視します。
成功せずに試しました:
- アプリケーションを管理者として実行します。おそらくスレッドはメイン スレッドよりも低い権限で開始されます (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 でフックを設定しているコードを表示するか、有効な解決策を提案していただけますか?