sto preparando un modulo di Delphi, che imposta un gancio in un thread per registrare una macro:SetWindowsHookEx per WH_JOURNALRECORD fallisce sotto Vista/Windows 7
FHandleRec := SetWindowsHookEx(WH_JOURNALRECORD, FRecordProc, HInstance, 0);
FHandlePlay := SetWindowsHookEx(WH_JOURNALPLAYBACK, FPlayProc, HInstance, 0);
che funziona bene su WinXP, ma su Vista/Windows 7 fallisce con ERROR_ACCESS_DENIED
. Ho trovato in Google (this) riferimento (that). La citazione:
Un processo di privilegi inferiore non può: ... Utilizzare ganci di giornale per monitorare un processo di privilegio più elevato .
provato senza successo: applicazione
- Esegui come amministratore. Probabilmente il thread è stato avviato con privilegi inferiori al thread principale (anche se non sono sicuro al 100% )
- Impersonare il thread con il contesto di sicurezza dell'amministratore non aiuta neanche.
L'esempio di codice:
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
e ImpersonateLoggedOnUser
eseguire senza errori.
Altre possibilità da provare:
- Accendere UAC OFF in modo permanente. Questo aiuta, ma non posso forzare gli utenti del modulo a farlo.
- Un cliente del modulo firma un'applicazione e la inserisce in una posizione attendibile . Non provato, ma questo complica radicalmente l'utilizzo del modulo per gli utenti.
- Inserire il modulo in un'applicazione firmata e distribuire EXE. Che interromperà alcune funzionalità di base.
Potrebbe per favore mostrare il codice che sta impostando il gancio sotto Visa/Windows 7 o suggerire la soluzione di lavoro?
È necessario incorporare un manifest per chiedere all'utente il permesso di elevazione. Sospetto che cada nella categoria "radicalmente complicata". –