Как программно редактировать файл hosts в Windows 7 / Server 2008?

Я пишу небольшую утилиту WPF для управления записями в файле hosts для целей dev. Как вы можете знать, файл hosts защищен более новой OSs (Win 7/2008/Vista).

Я добавил манифест в свое приложение, чтобы установить requestedExecutionLevel в "requireAdministrator", как подробно здесь (используя "простой способ") и в соответствующем вопросе здесь.

к сожалению, это не сработало для меня. Нет элевации когда я запускаю приложение и вызываю файл.AppendText для файла hosts по-прежнему вызывает систему.UnauthorizedAccessException быть брошенным: "доступ к пути "C:WindowsSystem32driversetchosts-отказано."

HostsChanger.исполняемый.манифест:

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

какие идеи?

3 ответов


перефразированная из моего предыдущего комментария, превратился в ответ:

ответ ho1 дал содержит приложение.манифест, который точно такой же, как приложение, над которым я работаю на работе, и elevation работает для него. Разница здесь в том, что имя файла - " app.манифест", и опция проекта "Манифест" (на вкладке Приложения) указывает на него.


Я не уверен, что это будет иметь значение, но ваш фрагмент манифеста немного отличается от моего понимания того, как это должно быть (хотя это могут быть разные версии):

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

в противном случае работа вокруг может быть иметь отдельное приложение "Loader", с которого пользователь начинает, и который только запускает ваш реальный инструмент WPF с помощью Verb runas как указано в этой сообщение в блоге (так Process.StartInfo.Verb = "runas";).


Я собираюсь принять удар в темноте здесь и говорят, что это проблема подписи authenticode. Я не слышал, чтобы вы упоминали о подписании вашего заявления. Насколько я понимаю, в отличие от Vista, в Windows 2008/7 единственный способ запустить приложение с повышенными правами - это иметь подписанный манифест приложения, который определяет уровень привилегий, необходимый приложению. Если вам нужна помощь в подписании, вот статья о том, как подписать приложение: http://msdn.microsoft.com/en-us/library/bb756995.aspx