2010-07-07 20 views
7

Ich schreibe ein kleines WPF-Dienstprogramm, um Einträge in der Hosts-Datei für Dev-Zwecke zu verwalten. Wie Sie vielleicht wissen, ist die hosts-Datei durch die neueren Betriebssysteme (Win 7/2008/Vista) geschützt.Wie kann ich die Hosts-Datei in Windows 7/Server 2008 programmgesteuert bearbeiten?

Ich habe ein Manifest zu meiner Anwendung hinzugefügt, um die requestedExecutionLevel auf "requireAdministrator" zu setzen, wie detailliert here (mit "der einfache Weg") und in der verwandten Frage here.

Leider hat das nicht für mich funktioniert. Wenn ich die App starte, wird keine Erhöhung angezeigt, und der Aufruf von File.AppendText für die hosts-Datei verursacht weiterhin das Auslösen einer System.UnauthorizedAccessException: "Zugriff auf den Pfad" C: \ Windows \ System32 \ drivers \ etc \ hosts " abgelehnt. "

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> 

Irgendwelche Ideen?

+0

So wird die Ausnahme beim Zugriff auf geschützte Registrierungsschlüssel vollständig erwartet, wenn Sie nicht erhöhen. Ich habe Manifeste nicht genug benutzt, um mich an alle Schritte zu erinnern, aber ich weiß nicht, warum das, was du versucht hast, nicht für dich funktioniert. –

+0

Ja, die Exception wird erwartet ... und die Elevation sollte es lösen, aber das Fehlen einer Eingabeaufforderung zeigt an, dass keine Elevation auftritt. – bszom

+0

Ich bin auf der Suche nach einem einfachen Hostchanger-Programm, aber ich habe noch keinen gefunden – JasonDavis

Antwort

3

Umschrieben aus meinem früheren Kommentar, verwandelte sich in eine Antwort:

Die Antwort ho1 gab einen app.manifest enthält, die genau das gleiche als die App arbeite ich bei der Arbeit, und Elevation arbeitet dafür. Der Unterschied ist, dass der Dateiname "app.manifest" ist und die Projektoption "Manifest" (auf der Registerkarte "Application") darauf zeigt.

2

Ich bin mir nicht sicher, ob es einen Unterschied machen, wird aber Manifest-Schnipsel ist etwas anders aus meinem Verständnis davon, wie es sein soll (obwohl die verschiedenen Versionen sein könnte):

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

Ansonsten ein Umgehung könnte eine separate "Loader" -App sein, mit der der Benutzer startet und die nur Ihr echtes WPF-Tool mit der Verbrunas startet, wie in this Blogpost (so Process.StartInfo.Verb = "runas";) beschrieben.

+0

Leider funktioniert Ihr Manifest-Snippet auch nicht. Ich hatte mir überlegt, einen neuen Prozess mit dem runas-Verb zu starten, wenn eine Änderung an der hosts-Datei erforderlich ist - aber dies würde die Benutzerfreundlichkeit der App für Benutzer mit aktivierter UAC erheblich beeinträchtigen (zB: es wäre geradezu ärgerlich). Eine UAC-Eingabeaufforderung beim Start wäre besser. Nichts für ungut, aber eine Loader-App ist ein Hack und ich würde es lieber vermeiden, aber danke für die Eingabe. – bszom

+1

Also, das ist GENAU, wie das Manifest nach App sucht, an der ich arbeite, und Elevation arbeitet dafür. Der Unterschied liegt darin, dass der Dateiname "app.manifest" lautet und die Projektoption "Manifest" (auf der Registerkarte "Anwendung") darauf zeigt. –

+0

Ich habe meine Projekteigenschaften auf die Manifestdatei festgelegt. Ich werde versuchen, es in app.manifest umzubenennen ... obwohl das hoffnungsvoll scheint.So erhalten Sie die Aufforderung beim Start der Anwendung? Ist es WPF? Meine App ist fensterlos (nur Trayicon und WPF-Benutzersteuerung), könnte das ein Faktor sein? – bszom

1

Ich werde hier im Dunkeln einen Stich machen und sagen, dass es ein Signature-Problem authenticode ist. Ich habe nicht gehört, dass Sie etwas über die Unterzeichnung Ihrer Bewerbung erwähnt haben. Soweit ich weiß, besteht im Gegensatz zu Vista in Windows 2008/7 die einzige Möglichkeit, eine Anwendung mit erhöhten Rechten auszuführen, ein signiertes Anwendungsmanifest zu haben, das die Berechtigungsebene identifiziert, die die Anwendung benötigt. Wenn Sie Hilfe bei der Anmeldung benötigen, ist hier ein Artikel, wie Sie Ihre Anwendung anmelden: http://msdn.microsoft.com/en-us/library/bb756995.aspx

+0

Auch vorausgesetzt, Sie haben bereits diesen Workflow gefolgt, aber hier für Referenz oder Checkliste zur Verfügung stellen: http://msdn.microsoft.com/en-us/library/bb756973.aspx – Sai

+0

Nun nach dem Umbenennen zu app.manifest, benachrichtigt VS dass es als Administrator ausgeführt werden muss, um zu debuggen (wie erwartet; siehe den 1. Link, den ich gepostet habe). Die App hat nun Schreibzugriff auf die hosts-Datei. Mit anderen Worten: Die Höhe funktioniert jetzt auch mit einer unsignierten App korrekt. Ich denke, der Vorteil des Signierens ist, dass kein Benutzereingriff erforderlich ist, um zu erhöhen, aber das ist nur eine Annahme. Danke für die Information! – bszom