Как я могу программно отредактировать файл hosts в Windows 7 / Server 2008? - PullRequest
8 голосов
/ 07 июля 2010

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

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

К сожалению, это не сработало для меня.При запуске приложения отсутствует запрос на повышение прав, и при вызове File.AppendText для файла hosts по-прежнему возникает исключение System.UnauthorizedAccessException: «Доступ к пути C: \ Windows \ System32 \ drivers \ etc \ hosts»отказано. "

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>

Есть идеи?

Ответы [ 3 ]

3 голосов
/ 08 июля 2010

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

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

2 голосов
/ 07 июля 2010

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

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

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

1 голос
/ 08 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...