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

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

Я добавил в свое приложение манифест, чтобы установить значение requiredExecutionLevel в «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>

Любые идеи?


person bszom    schedule 07.07.2010    source источник
comment
Итак, исключение при доступе к защищенным ключам реестра вполне ожидаемо, если вы не повышаете права. Я не использовал достаточно манифестов, чтобы запомнить все шаги, поэтому я не знаю, почему то, что вы пробовали, у вас не работает.   -  person Merlyn Morgan-Graham    schedule 07.07.2010
comment
Да, ожидается исключение ... и повышение уровня должно решить его, но отсутствие подсказки указывает на то, что повышения не происходит.   -  person bszom    schedule 07.07.2010
comment
Я ищу простую программу Hostschanger, но пока не нашел   -  person JasonDavis    schedule 09.09.2012
comment
@jasondavis Не стесняйтесь скачать мое приложение здесь: bloing.net/hostschanger   -  person bszom    schedule 16.12.2012
comment
Обновленная ссылка: github.com/maltem-za/HostsChanger   -  person bszom    schedule 07.02.2021


Ответы (3)


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

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

person Merlyn Morgan-Graham    schedule 08.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";).

person Hans Olsson    schedule 07.07.2010
comment
К сожалению, ваш фрагмент манифеста тоже не сработал. Я думал запускать новый процесс с помощью команды runas всякий раз, когда требуется изменение файла hosts, но это серьезно повлияет на удобство использования приложения для пользователя с включенным UAC (то есть: это будет прямо раздражать). Лучше было бы одно приглашение UAC при запуске. Без обид, но приложение-загрузчик - это взлом, и я бы предпочел его избегать, но спасибо за вклад. - person bszom; 07.07.2010
comment
Итак, это ТОЧНО, как манифест ищет приложение, над которым я работаю на работе, и повышение прав работает для него. Разница здесь может заключаться в том, что имя файла - app.manifest, а параметр проекта Manifest (на вкладке Application) указывает на него. - person Merlyn Morgan-Graham; 08.07.2010
comment
У меня есть свойства моего проекта, установленные в файле манифеста. Я попробую переименовать его в app.manifest ... хотя это кажется обнадеживающим. Итак, вы получаете подсказку при запуске приложения? Это WPF? В моем приложении нет окон (только для панели управления Trayicon и WPF), может ли это быть фактором? - person bszom; 08.07.2010
comment
Переименование в app.manifest помогло - вау. Если вы хотите опубликовать это как ответ, я отмечу это соответствующим образом. Спасибо за совет. - person bszom; 08.07.2010
comment
@bszom: Поскольку вы просто отвечаете на комментарий, вам нужно добавить @username (или хотя бы часть имени пользователя) в свой комментарий, чтобы он его увидел. Так что, если вы добавите @Merlyn в свой комментарий, я думаю, он получит уведомление. - person Hans Olsson; 08.07.2010
comment
@ ho1 - Спасибо за внимание :) Да, я не видел этого, пока вы не @. - person Merlyn Morgan-Graham; 08.07.2010

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

person Sai    schedule 08.07.2010
comment
Также предполагаем, что вы уже выполнили этот рабочий процесс, но собираетесь предоставить здесь для справки или контрольного списка: msdn.microsoft.com/en-us/library/bb756973.aspx - person Sai; 08.07.2010
comment
После переименования в app.manifest VS уведомляет, что он должен быть запущен от имени администратора для отладки (как и ожидалось; см. 1-ю ссылку, которую я опубликовал). Теперь у приложения есть доступ на запись к файлу hosts. Другими словами: повышение теперь работает правильно, даже с неподписанным приложением. Я думаю, что преимущество подписи в том, что для повышения уровня не требуется вмешательства пользователя, но это всего лишь предположение. Спасибо за информацию! - person bszom; 09.07.2010