Pregunta

Estoy escribiendo una pequeña utilidad WPF para gestionar entradas en el archivo hosts con fines dev. Como se puede saber el archivo de hosts está protegido por el nuevo SO (Win 7/2008 / Vista).

He añadido un manifiesto a mi solicitud para establecer el requestedExecutionLevel a "requireAdministrator", como se detalla aquí (usando "el camino más fácil") y en la cuestión relacionada aquí .

Desafortunadamente esto no ha funcionado para mí. No hay una elevación rápida cuando comienzo de la aplicación, y llamando File.AppendText para los anfitriones archivo todavía provoca una System.UnauthorizedAccessException a ser lanzado: "El acceso a la ruta 'C: \ Windows \ System32 \ drivers \ etc \ hosts' es negado ".

HostsChanger.exe.manifest:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="HostsChanger" type="win32"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
        <requestedPrivileges>
            <requestedExecutionLevel level="requireAdministrator"/>
        </requestedPrivileges>
    </security>
</trustInfo>
</assembly>

¿Alguna idea?

¿Fue útil?

Solución

Parafraseado de mi comentario anterior, se convirtió en una respuesta:

El HO1 respuesta dio contiene un app.manifest que es exactamente la misma que la aplicación que estoy trabajando en el trabajo, y la elevación está trabajando para ello. La diferencia aquí es que el nombre del archivo es "app.manifest", y la opción de proyecto "Manifiesto" (en la pestaña de aplicaciones) está apuntando a la misma.

Otros consejos

No estoy seguro si va a hacer ninguna diferencia, pero el fragmento de manifiesto es ligeramente diferente de mi comprensión de cómo debe ser (aunque eso podría haber diferentes versiones):

<?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="HostsChanger" />
   <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>

De lo contrario, un trabajo alrededor podría ser la de tener una aplicación separada "Cargador" que el usuario comienza con y que sólo comienza su verdadera herramienta WPF utilizando el Verb runas como se detalla en esta entrada del blog (por lo Process.StartInfo.Verb = "runas";).

Me voy a tomar una puñalada en la oscuridad aquí y decir que se trata de un problema de firma authenticode. No he oído que usted menciona nada acerca de la firma de su aplicación. Por lo que va mi entendimiento, a diferencia de Vista, en Windows 2008/7 la única manera de ejecutar una aplicación elevada es tener un manifiesto de aplicación firmado que identifica el nivel de privilegio que las necesidades de la aplicación. Si necesitas ayuda para acceder, aquí está un artículo sobre cómo firmar su aplicación: http: //msdn.microsoft.com/en-us/library/bb756995.aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top