C# 如何在Windows 7/Server 2008中以编程方式编辑主机文件?

C# 如何在Windows 7/Server 2008中以编程方式编辑主机文件?,c#,wpf,security,elevated-privileges,hosts-file,C#,Wpf,Security,Elevated Privileges,Hosts File,我正在编写一个小的WPF实用程序来管理hosts文件中的条目,以供开发人员使用。正如您可能知道的,主机文件受较新的OSs(Win 7/2008/Vista)保护 我已经在我的应用程序中添加了一个清单,将requestedExecutionLevel设置为“requireAdministrator”,如(使用“简易方式”)和相关问题中所述 不幸的是,这对我不起作用。启动应用程序时没有提升提示,为主机文件调用File.AppendText仍会引发System.UnauthorizedAccessEx

我正在编写一个小的WPF实用程序来管理hosts文件中的条目,以供开发人员使用。正如您可能知道的,主机文件受较新的OSs(Win 7/2008/Vista)保护

我已经在我的应用程序中添加了一个清单,将requestedExecutionLevel设置为“requireAdministrator”,如(使用“简易方式”)和相关问题中所述

不幸的是,这对我不起作用。启动应用程序时没有提升提示,为主机文件调用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>


有什么想法吗?

我不确定这是否会有什么不同,但您的清单片段与我对它的理解略有不同(尽管可能是不同的版本):



博客帖子(so
Process.StartInfo.Verb=“runas”
)。

我想在这里暗中试探一下,这是一个身份验证码签名问题。我没有听到你提到任何关于签署申请书的事。据我所知,与Vista不同,在Windows 2008/7中,运行提升的应用程序的唯一方法是使用签名的应用程序清单来标识应用程序所需的权限级别。如果您需要帮助签署,这里有一篇关于如何签署您的应用程序的文章:

摘自我之前的评论,变成了一个答案:


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

因此,如果您不升级,访问受保护的注册表项时会出现异常。不过,我没有使用足够的清单来记住所有步骤,所以我不知道为什么您尝试的方法对您无效。是的,预期会出现异常。。。提升应该可以解决这个问题,但是没有提示表明提升没有发生。我正在寻找一个简单的Hostschanger程序,但是我还没有找到yet@jasondavis请随意在此处抓取我的应用程序:更新链接:不幸的是,您的清单片段也不起作用。我曾想过在需要更改主机文件时使用runas动词启动一个新流程,但这将严重影响应用程序对启用UAC的用户的可用性(即:这将非常烦人)。开始时一个UAC提示会更好。无意冒犯,但加载程序是一种黑客行为,我宁愿避免它,但感谢您的输入。所以,这正是清单中显示我正在工作的应用程序的方式,并且提升正在为它工作。这里的区别可能是文件名是“app.manifest”,项目选项“manifest”(在“应用程序”选项卡上)指向它。我确实将项目属性设置为manifest文件。我将尝试将其重命名为app.manifest。。。尽管这看起来很有希望。那么你在应用程序启动时得到提示了吗?是WPF吗?我的应用程序是无窗口的(仅限trayicon和WPF用户控制),这可能是一个因素吗?重命名为app.manifest成功了-哇。如果你想把它作为一个答案,我会相应地标记它。谢谢你的提示。@bszom:因为你只是回复一条评论,你必须在评论中添加@username(或至少部分用户名),以确保他能看到。因此,如果您将@Merlyn添加到您的评论中,我想他会得到通知。另外,假设您已经遵循了此工作流,但将在此处提供参考或检查表:在重命名为app.manifest后,VS通知必须以管理员身份运行以进行调试(如预期;请参阅我发布的第一个链接)。该应用程序现在具有对主机文件的写入权限。换句话说:提升现在可以正常工作,即使是未签名的应用程序。我认为签名的优点是提升时不需要用户干预,但这只是一个假设。谢谢你的信息!
<?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>