Как программно редактировать файл 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