【问题标题】:How can I programmatically edit the hosts file in Windows 7/Server 2008?如何以编程方式编辑 Windows 7/Server 2008 中的主机文件?
【发布时间】:2011-03-12 17:23:35
【问题描述】:

我正在编写一个小的 WPF 实用程序来管理主机文件中的条目以用于开发目的。您可能知道主机文件受较新的操作系统(Win 7/2008/Vista)保护。

我已在我的应用程序中添加了一个清单,以将 requestedExecutionLevel 设置为“requireAdministrator”,详见here(使用“简单方法”)和相关问题here

不幸的是,这对我不起作用。启动应用程序时没有提升提示,并且为主机文件调用 File.AppendText 仍然会导致抛出 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>

有什么想法吗?

【问题讨论】:

  • 因此,如果您不提升权限,则完全可以预期访问受保护的注册表项时的异常。不过,我没有使用足够多的清单来记住所有步骤,所以我不知道为什么您尝试的方法对您不起作用。
  • 是的,预计会出现异常......并且提升应该可以解决它,但缺少提示表示没有发生提升。
  • 我正在寻找一个简单的 Hostschanger 程序,但我还没有找到
  • @jasondavis 随意在这里获取我的应用程序:bloing.net/hostschanger

标签: c# wpf security elevated-privileges hosts-file


【解决方案1】:

我不确定它是否会有所不同,但您的清单 sn-p 与我对它的理解略有不同(尽管可能是不同的版本):

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

否则,解决方法可能是拥有一个单独的“加载器”应用程序,用户可以使用该应用程序启动该应用程序,并且仅使用 Verb runas 启动您真正的 WPF 工具,详见 this 博客文章(所以 @ 987654325@)。

【讨论】:

  • 不幸的是,您的清单 sn-p 也不起作用。我曾想过在需要更改主机文件时使用 runas 动词启动一个新进程 - 但这会严重影响启用 UAC 的用户的应用程序的可用性(即:它会非常烦人)。开始时有一个 UAC 提示会更好。没有冒犯,但加载器应用程序是一个黑客,我宁愿避免它,但感谢输入。
  • 所以,这正是清单在我正在工作的应用程序中的外观,并且提升正在为它工作。这里的区别可能是文件名是“app.manifest”,而项目选项“Manifest”(在Application选项卡上)指向它。
  • 我确实将我的项目属性设置为清单文件。我会尝试将其重命名为 app.manifest ......尽管这似乎很有希望。所以你在应用程序启动时得到提示?是WPF吗?我的应用是无窗口的(仅托盘图标和 WPF 用户控件),这可能是一个因素吗?
  • 重命名为 app.manifest 成功了——哇。如果您想将其发布为答案,我会相应地标记它。感谢您的提示。
  • @bszom:由于您只是回复评论,因此您必须在评论中添加@username(或至少部分用户名)以确保他会看到它。因此,如果您将@Merlyn 添加到您的评论中,我认为他会收到通知。
【解决方案2】:

我将在这里暗中尝试,并说这是一个验证码签名问题。我没有听到你提到任何关于签署你的申请的事情。据我了解,与 Vista 不同,在 Windows 2008/7 中,运行提升的应用程序的唯一方法是拥有一个签名的应用程序清单,该清单标识应用程序所需的特权级别。如果您需要签名方面的帮助,这里有一篇关于如何为您的应用签名的文章:http://msdn.microsoft.com/en-us/library/bb756995.aspx

【讨论】:

  • 还假设您已经遵循此工作流程但将在此处提供参考或清单:msdn.microsoft.com/en-us/library/bb756973.aspx
  • 在重命名为 app.manifest 之后,VS 通知它必须以管理员身份运行才能进行调试(如预期的那样;请参阅我发布的第一个链接)。该应用程序现在具有对主机文件的写入权限。换句话说:提升现在可以正常工作,即使是未签名的应用程序。我认为签名的好处是不需要用户干预来提升,但这只是一个假设。感谢您的信息!
【解决方案3】:

从我之前的评论中转述,变成了答案:

ho1 给出的答案包含一个 app.manifest,它与我在工作中正在开发的应用程序完全相同,并且提升正在为它工作。这里的区别是文件名是“app.manifest”,而项目选项“Manifest”(在Application选项卡上)指向它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多