Come faccio a livello di codice modificare il file hosts di Windows 7 / Server 2008?
-
02-10-2019 - |
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?
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