2010-07-07 93 views
7

我正在写一点WPF实用程序来管理主机文件中的条目以用于开发目的。正如你可能知道hosts文件受到较新的操作系统(Win 7/2008/Vista)的保护。如何以编程方式编辑Windows 7/Server 2008中的hosts文件?

我已经向我的应用程序添加了一个清单,将requestedExecutionLevel设置为“requireAdministrator”,详细信息请参见here(使用“简单方法”)和相关问题here

不幸的是,这并没有为我工作。启动应用程序时没有提示提示,并且为hosts文件调用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> 

任何想法?

+0

因此,如果您不升级,访问受保护注册表项的异常是完全可以预料的。尽管我没有使用清单来记住所有的步骤,但我不知道为什么你所尝试的并不适合你。 – 2010-07-07 09:29:31

+0

是的,预计会发生异常...和高程应该可以解决这个问题,但缺少提示表明高程不会发生。 – bszom 2010-07-07 10:01:23

+0

我正在寻找一个简单的主机交换器程序,但我还没有找到一个 – JasonDavis 2012-09-09 17:26:00

回答

3

意译,变成了一个答案:

答案HO1了包含app.manifest是完全一样的作为我正在工作的应用程序,并且提升正在为此工作。这里的区别是文件名是“app.manifest”,项目选项“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”应用程序,该应用程序仅使用Verbrunas开始您的真实WPF工具,详见this博客文章(如此Process.StartInfo.Verb = "runas";)。

+0

不幸的是你的清单片段也无法正常工作。我曾经想过,只要需要更改主机文件,就会启动一个新的流程,但这会严重影响启用UAC的用户的应用程序的可用性(例如:这将彻底恼人)。一开始UAC提示会更好。没有冒犯,但装载机应用程序是一个黑客,我宁愿避免它,但感谢您的意见。 – bszom 2010-07-07 10:05:55

+1

所以,这就是清单如何查找我在工作中工作的应用程序,并且提升正在为此工作。这里的区别可能是文件名是“app.manifest”,项目选项“Manifest”(在应用程序选项卡上)指向它。 – 2010-07-07 20:35:54

+0

我确实将我的项目属性设置为清单文件。我会尝试将它重命名为app.manifest ...虽然这看起来很有希望。所以你在开始申请时得到提示?它是WPF?我的应用程序没有窗口(仅限trayicon和WPF用户控制),这可能是一个因素吗? – bszom 2010-07-07 22:46:41

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 2010-07-08 14:28:51

+0

好了重命名为app.manifest之后,VS通知它必须以管理员身份运行才能进行调试(如预期;请参阅我发布的第一个链接)。该应用程序现在具有对主机文件的写入访问权限。换句话说:即使使用未签名的应用程序,高程现在也能正常工作。我认为签署的好处是不需要用户干预来提升,但这只是一个假设。谢谢(你的)信息! – bszom 2010-07-09 09:19:37