Domanda

Sto scrivendo una piccola utility WPF per gestire le voci del file hosts per scopi dev. Come sapete il file hosts è protetto dalla più recente sistemi operativi (Windows 7/2008 / Vista).

Ho una manifesto per la mia applicazione per impostare il requestedExecutionLevel a "requireAdministrator", come dettagliato qui (usando "la via più facile") e nella relativa domanda qui .

Purtroppo questo non ha funzionato per me. Non v'è alcuna elevazione pronta quando inizio l'applicazione, e chiamando File.AppendText per file host ancora provoca una System.UnauthorizedAccessException da buttare: "L'accesso al percorso 'C: \ Windows \ System32 \ drivers \ etc \ hosts' è negato ".

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>

Tutte le idee?

È stato utile?

Soluzione

Parafrasato dal mio commento precedente, trasformato in una risposta:

Il HO1 risposta ha dato contiene un app.manifest che è esattamente lo stesso che l'applicazione su cui sto lavorando sul posto di lavoro, e l'elevazione sta lavorando per questo. La differenza qui è che il nome del file è "app.manifest", e l'opzione progetto "Manifesto" (nella scheda Application) punta ad esso.

Altri suggerimenti

Non sono sicuro se si farà alcuna differenza, ma il vostro frammento di manifestare è leggermente diversa dalla mia comprensione di come dovrebbe essere (ma che potrebbe essere versioni differenti):

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

In caso contrario, un lavoro in giro potrebbe essere quello di avere un'applicazione separata "Loader" che l'utente inizia con e che inizia solo il vostro vero e proprio strumento di WPF utilizzando il Verb runas come dettagliato nel questo post del blog (così Process.StartInfo.Verb = "runas";).

Ho intenzione di fare un salto nel buio qui e dire che si tratta di un problema di firma authenticode. Non ho sentito si parla nulla di firmare l'applicazione. Per quanto riguarda la mia comprensione va, a differenza di Vista, Windows 2008/7 l'unico modo per eseguire un'applicazione elevato è quello di avere un manifesto dell'applicazione firmato che identifica il livello di privilegio che le esigenze applicative. Se hai bisogno di aiuto firma, ecco un articolo su come firmare l'applicazione: http: //msdn.microsoft.com/en-us/library/bb756995.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top