2009-02-18 13 views
37

Estoy escribiendo una utilidad de modificación que modifica algunas teclas en HKEY_CLASSES_ROOT.No se permite el acceso al registro solicitado

Todo funciona bien en Windows XP, y así sucesivamente. Pero obtengo el error Requested registry access is not allowed en Windows 7. Vista y 2008, supongo.

¿Cómo debo modificar mi código para agregar compatibilidad con UAC?

Respuesta

45

app.manifest debería ser así:

<?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

¿Dónde se encuentra esta aplicación.manifestada? –

+3

@Gunner: Ponlo en la raíz de un proyecto, como App.config. (Archivo -> Agregar nuevo elemento -> Archivo de manifiesto de la aplicación) – abatishchev

+0

@abatishchev: El contenido xml anterior es genérico y debería ser suficiente para cualquier aplicación, ¿no? –

15

No puede escribir en las colmenas HKCR (o HKLM) en Vista y las versiones más nuevas de Windows a menos que tenga privilegios administrativos. Por lo tanto, deberá iniciar sesión como administrador antes de ejecutar su utilidad, proporcionarle un manifiesto que indique que requiere el nivel de administrador (lo que solicitará al usuario la información de inicio de sesión del administrador) o dejar de cambiar las cosas en lugares que no -Los administradores no deberían estar jugando. :-)

+0

gracias por palabra clave 'manifiesto' :) – abatishchev

+2

de nada. :-) Lo siento, no pude publicar el manifiesto adecuado, pero no tenía uno en esta máquina y pensé que si alguien tenía que buscar uno, podría ser usted.

4

Como una solución temporal, los usuarios pueden hacer clic derecho la utilidad y seleccione "Ejecutar como administrador".

17

Si usted no necesita privs de administración para la aplicación completa, o sólo para algunos cambios poco frecuentes que puede hacer los cambios en un nuevo proceso y lanzarlo usando:

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

el que se ejecutará el proceso de como administrador para hacer lo que necesite con el registro, pero regrese a su aplicación con los privilegios normales. De esta forma, no solicita al usuario un diálogo de UAC cada vez que se inicia.

+0

¿Quiere decir que se necesita implementar una bifurcación, donde una parte del código lanza la misma aplicación con un parámetro para que se ejecute otra parte del código? – abatishchev

+0

Podría ser la misma aplicación con parámetros o podría ser una aplicación independiente pequeña sin ventanas que escriba lo que necesita. – Davy8

Cuestiones relacionadas