estoy preparando un módulo de Delphi, que establece un enlace en un hilo para grabar una macro:SetWindowsHookEx para WH_JOURNALRECORD falla en Vista/Windows 7
FHandleRec := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);
FHandlePlay := SetWindowsHookEx(WH_JOURNALPLAYBACK, FPlayProc, HInstance, 0);
Eso funciona bien en WinXP, pero en Vista/Windows 7 falla con ERROR_ACCESS_DENIED
. He encontrado en Google (this) refiriéndose (that). La cita:
Un proceso de privilegios más bajo no puede: ... Usar ganchos de diario para supervisar un proceso de privilegios superior .
juzgado sin éxito: aplicación
- Ejecutar como administrador. Probablemente el hilo se inició con privilegios inferiores que el hilo principal (aunque no soy 100% seguro)
- Suplantar el hilo con el contexto de seguridad del administrador tampoco ayuda.
El ejemplo de código:
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
y ImpersonateLoggedOnUser
ejecutar sin errores.
Otras posibilidades para probar:
- activarlo de forma permanente. Esto ayuda, pero no puedo obligar a los usuarios del módulo a hacer eso.
- Un cliente de módulo firma una aplicación y la pone en una ubicación de confianza . No lo intenté, pero eso complica radicalmente el uso del módulo para los usuarios.
- Coloque el módulo en alguna aplicación firmada y distribuya EXE. Eso romperá algunas funciones básicas.
¿Podría mostrar el código que está configurando el gancho en Visa/Windows 7 o sugerir la solución de trabajo?
Deberá incrustar un manifiesto para pedir permiso de elevación al usuario. Sospecho que cae en la categoría "se complica radicalmente". –