2009-02-18 14 views
37

Sto scrivendo un'utilità di modifica che modifica alcuni tasti sotto HKEY_CLASSES_ROOT.L'accesso al registro richiesto non è consentito

Tutto funziona correttamente in Windows XP e così via. Ma sto ricevendo l'errore Requested registry access is not allowed sotto Windows 7. Vista e 2008 credo anche io.

Come devo modificare il mio codice per aggiungere il supporto UAC?

risposta

45

app.manifest dovrebbe essere simile a questo:

<?xml version="1.0" encoding="utf-8"?> 
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <assemblyIdentity version="1.0.0.0" name="MyApplication.app" /> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2"> 
     <security> 
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3"> 
      <requestedExecutionLevel level="requireAdministrator" uiAccess="false" /> 
     </requestedPrivileges> 
     </security> 
    </trustInfo> 
</asmv1:assembly> 
+0

Dove si trova questa app.manifest? –

+3

@Gunner: inseriscilo nella radice di un progetto, come App.config. (File -> Aggiungi nuovo elemento -> File manifest dell'applicazione) – abatishchev

+0

@abatishchev: Il contenuto xml sopra è generico e dovrebbe essere sufficiente per qualsiasi applicazione, giusto? –

15

Non è possibile scrivere sugli hive HKCR (o HKLM) in Vista e nelle versioni più recenti di Windows se non si dispone dei privilegi di amministratore. Pertanto, prima di eseguire l'utilità, è necessario che tu abbia effettuato l'accesso come amministratore prima di eseguirlo, fornendogli un manifest che dice che richiede il livello di amministratore (che richiederà all'utente di accedere alle informazioni di accesso dell'amministratore), o di smettere di modificare le cose in luoghi non -Gli amministratori non dovrebbero giocare. :-)

+0

grazie per parola chiave 'manifesti' :) – abatishchev

+2

siete i benvenuti. :-) Scusate non potevo pubblicare il manifest corretto, ma non ne avevo uno su questa macchina e ho pensato che se qualcuno dovesse cercarne uno, potrebbe essere anche tu.

4

Come una soluzione temporanea, gli utenti possono fare clic destro l'utilità e selezionare "Esegui come amministratore".

17

Se non avete bisogno di privs di amministrazione per l'intera applicazione, o solo per alcune modifiche frequenti si possono fare le modifiche in un nuovo processo e lanciarlo con:

Process.StartInfo.UseShellExecute = true; 
Process.StartInfo.Verb = "runas"; 

cui verrà eseguito il processo come amministratore per fare tutto ciò che è necessario con il registro, ma tornare alla tua app con i normali privilegi. In questo modo non richiede all'utente una finestra di dialogo UAC ad ogni avvio.

+0

Vuoi dire che è necessario implementare un fork, in cui una parte di codice lancia la stessa applicazione con parametro in modo da eseguire un'altra parte di codice? – abatishchev

+0

Potrebbe essere la stessa app con parametri o potrebbe essere una piccola app separata senza finestre che scrive ciò di cui ha bisogno. – Davy8

Problemi correlati