2010-07-07 2 views
7

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

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

К сожалению, это не сработало для меня. Когда я запускаю приложение, нет приглашения на повышение, а вызов файла 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> 

Любые идеи?

+0

Таким образом, исключение при доступе к защищенным разделам реестра полностью ожидается, если вы не поднимаете. Я не использовал манифесты достаточно, чтобы помнить все шаги, хотя, поэтому я не знаю, почему то, что вы пробовали, не работает на вас. –

+0

Да, исключение ожидается ... и возвышение должно решить его, но отсутствие подсказки указывает на то, что высота не происходит. – bszom

+0

Im ищет простую программу Hostschanger, но я еще не нашел ее – JasonDavis

ответ

3

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

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

2

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

<?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 с помощью Verbrunas, как описано в блоге this (так Process.StartInfo.Verb = "runas";).

+0

К сожалению, ваш манифестный сниппет тоже не работал. Я думал начать новый процесс с глаголом runas всякий раз, когда требуется изменение файла hosts, но это сильно повлияет на удобство использования приложения для пользователя с включенным UAC (то есть: это будет совершенно раздражать). Одно приглашение UAC при запуске было бы лучше. Не обижайтесь, но приложение-загрузчик - это взлом, и я бы предпочел его избежать, но спасибо за вход. – bszom

+1

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

+0

У меня есть свойства проекта, установленные в файле манифеста. Я попробую переименовать его в app.manifest ... хотя это кажется обнадеживающим.Итак, вы получаете подсказку при запуске приложения? Это WPF? Мое приложение без окон (только для трейнинга и пользовательского контроля WPF), может ли это быть фактором? – bszom

1

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

+0

Предполагая, что вы уже следовали этому документообороту, но предоставили здесь справочный или контрольный список: http://msdn.microsoft.com/en-us/library/bb756973.aspx – Sai

+0

Ну после переименования в app.manifest VS уведомляет что он должен запускаться как администратор для отладки (как и ожидалось, см. 1-ю ссылку, которую я опубликовал). Теперь приложение имеет доступ на запись к файлу hosts. Другими словами: возвышение теперь работает правильно, даже с неподписанным приложением. Я думаю, что преимущество подписания заключается в том, что для повышения не требуется никакого вмешательства пользователя, но это всего лишь предположение. Спасибо за информацию! – bszom