【转载】VS与Win7共舞:UAC惹祸 如何进行安装程序检测?

文本Tag: Visual Studio 微软 windows 7

  【IT168 专稿】随着Windows Vista引入UAC(User Access Control)机制,默认情况下,应用程序都运行在普通用户权限下。虽然微软出于良好的愿望而在Vista中引入UAC机制, 但是在Vista操作系统中,只要系统稍作改变,它就会频繁弹出对话框来寻求用户的许可,因此它成为了Vista中最受痛恨的一个功能。 虽然如此,Windows 7还是继承了这一机制并根据用户的反馈做了相应的改进。为了降低计算机系统的风险,UAC机制将执行应用程序的用户权限降低了,这就为那些在UAC机制出现之前所设计的应用程序的执行带来了兼容性的麻烦。这些旧有应用程序通常都假设以管理员权限运行,在Windows 7上,因为UAC的存在,这一假设不成立了,最终导致应用程序无法正常运行。一些应用程序确实是需要管理员权限才可以正常运行的,尤其是安装程序,他们需要向一些需要特殊权限的区域,比如“Program Files”或者是注册表的HKEY_LOCAL_MACHINE写入内容,这种情况它们会遇到访问拒绝的错误,或者是数据被UAC Virtualization重定向到其他位置而无法正确执行。

  为了解决这个问题,“聪明”的雷德蒙程序员们想出了一个办法:安装程序检测。从Windows Vista开始,当然也包括Windows 7,操作系统将采用一些启发式算法来判断应用程序是不是一个安装程序,也就是在执行的时候这个程序是否需要请求管理员权限,如果操作系统判断应用程序是一个安装程序,就会让它在执行的时候向用户请求获取管理员权限以便让应用程序正确的执行。

  操作系统是如何检测的?

  所有在Windows Vista之前开发的没有manifest(包括外部的和内部的)的32位应用程序都会进行这种启发式的安装程序检测。操作系统会假设这些应用程序是旧有的,他们都需要进行安装程序检测以确定这些应用程序是否管理员权限才能正常运行。面对这样的应用程序,操作系统的启发式安装检测通常会通过以下这些途径来判断一个32位应用程序是不是安装程序:

  • 文件名包含关键字:”install”, “setup”和”update”等等。

  • 在版本资源的以下字段内包含关键字:厂商(Vendor)、公司名(CompanyName)、产品名(ProductName)、文件说明(File Description)、初始文件名(Original Filename)、内部文件名(Internal Name)、导出名(Export Name)。

  • 在可执行文件的manifest内包含关键字。

  • 在链接到可执行文件的特定StringTable中包含关键字。

  • 在链接到可执行文件的资源文件数据包含关键属性。

  • 可执行文件包含特定的字节序列。

  如果找到了,操作系统会认为它需要管理员权限才可以正常运行。一个UAC保护盾的图标会覆盖在应用程序图标上,这就表示应用程序在启动的时候会请求管理员权限以便它可以正确执行。

  图1 安装程序检测

内容导航

  Setup一定是安装程序吗?

  虽然这种启发式安装程序检测可以让一个旧有的安装程序能够直接在Windows Vista或者Windows 7上正常运行。但是,它本身也带来很多问题。一方面,一些不需要管理员权限就可以正常运行的应用程序,就因为文件名中含有了“setup”等相关的文字,比如,StockUpdater.exe,就被强行在运作的时候向用户询问请求管理员权限。这不仅给用户带来不便,同时也无形中降低了系统的安全性。甚至用户会因为担心系统受到损害而取消应用程序的运行。另一方面,一些恶意软件也会凭借这种机制的漏洞,将自己伪装成安装程序,从而轻松地,正大光明地获取管理员权限而给系统安全带来隐患。

  与此相反的是,很多自定义的安装程序,并不使用Microsoft Windows Installer(MSI)技术,并且没有按照启发式安装程序检测的规则命名,这样,操作系统就不会认为它是一个安装程序。由于启发式安装程序检测不承认它是安装程序,所以用户在运行这些应用程序的时候,它并不会自动请求管理员权限运行,这就可能导致应用程序在向一些敏感位置写入数据时遇到拒绝访问错误,安装过程半途而废。

  就像电影中的台词,“开好车的就一定是好人吗?”同样的,“姓Setup的就一定是安装程序吗?”

  Manifest指明程序运行权限

  既然微软的启发式安装程序检测这么弱智,那么我们只好自己麻烦一下,简单地为应用程序添加一个Manifest文件,告诉操作系统我们到底是不是安装程序,是否需要请求管理员权限。如果应用程序的源代码无法获得,我们只需要在应用程序的同一目录下为应用程序添加一个外部Manifest文件。这个Manifest文件的名字应该是应用程序文件名加上“.manifest”后缀。例如,StockUpdater.exe的Manifest文件的文件名应该是StockUpdater.exe.manifest。这个Manifest文件应该指明此应用程序在运行的时候是否需要申请管理员权限,或者是否在普通用户权限下就可以正常运行。

  一个典型的外部Manifest文件如下所示:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

<?xmlversion="1.0"encoding="utf-8"?>
<asmv1:assemblymanifestVersion="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">
    <assemblyIdentityversion="1.0.0.0"name="MyApplication.app"/>
    <trustInfoxmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivilegesxmlns="urn:schemas-microsoft-com:asm.v3">
                <!-- UAC Manifest 选项
          <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
          <requestedExecutionLevel  level="requireAdministrator" uiAccess="false"/>
          <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />
         -->

         <requestedExecutionLevellevel="asInvoker"uiAccess="false" />
              </requestedPrivileges>

      </security>
      </trustInfo>
    </asmv1:assembly>

  其中,requestedExecutionLevel属性就表示我们的应用程序正确执行所需要的权限。它有这样几个可选值:

  • asInvoker – 它表示应用程序需要跟创建者相同的权限运行。也就是跟Windows Explorer相同的权限运行,通常就是普通用户权限。这个应用程序不是安装程序并且不会被启发式安装程序检测错误地标记。

  • requireAdministrator – 它表示这个应用程序需要管理员权限才能正常运行。(它可能是一个安装程序。)

  • highestAvailable – 它表示这个应用程序应该以尽可能高的权限运行。如果当前用户是一个管理员用户,那么它就等同于requireAdministrator 。如果当前用户是普通用户,那么它会在运行的时候请求管理员权限。

  当我们为应用程序添加外部Manifest文件后,操作系统会根据Manifest文件中的定义为应用程序制定相应的UAC规则。例如,我们可以通过外部Manifest文件,为一个自定义的安装程序在执行时请求管理员权限。

  图2  自定义安装程序

内容导航

嵌入式Manifest

  如果我们可以获得应用程序的源代码,我们可以在Visual Studio 2010中为应用程序添加嵌入式的Manifest来完成相同的工作。在项目属性中,我们设置“Linker->Manifest File->UAC Execution Level”,就可以指定应用程序执行所需要的权限。

  图3  设置UAC执行权限等级

  同时,我们可以将Manifest文件作为资源嵌入到应用程序中,这样我们就只需要一个单独应用程序就可以完成所有工作了,而无需额外的一个Manifest文件。同样的,在项目属性“Manifest Tool->Input and Output->Embed Manifest”中设置就可以将Manifest文件嵌入到应用程序中。

  图4  嵌入式Manifest

  在默认情况下,Visual Studio 2010所创建的新项目,已经含有了嵌入式的Manifest。

  有了Manifest文件,应用程序就像有了身份证一样,操作系统不会再冤枉好人了。

时间: 2024-11-08 21:32:09

【转载】VS与Win7共舞:UAC惹祸 如何进行安装程序检测?的相关文章

让R与Python共舞

转载:http://ices01.sinaapp.com/?p=129      R(又称R语言)是一款开源的跨平台的数值统计和数值图形化展现 工具.通俗点说,R是用来做统计和画图的.R拥有自己的脚本语言和大量的统计.图形库(得益于开源社区),这让她看起来既美又实用.与其他同类软件(如 SPSS)相比,R的特点是纯命令行的,这倒也好,我们更应该把注意力放在数据本身,而非统计工具的UI.   R虽说有一套自己的语言,还挺完备,但她最专业的还是做统计和画图,而像连接数据库.文本处理.文件操作等这些脏

人与“幽灵”共舞,提升生活质量

细细想来,当前,我们的日常生活.工作的节奏越来越快.我们似乎被越来越多的数据包围着,整天忙于处理事务,心身疲惫.怎么办? 三十多年前,人工智能(AI)的思想进入我国,我开始"追梦".但是,让我万万没有想到的是:近年来,互联网渗透到我们生活的方方面面,使得我们的生活.工作的节奏越来越快,压得人几乎透不过气来,身心极为疲惫.人工智能能否拯救我们? 扪心自问,我们当前所最需要的不是机器人帮助我们做一些具体的事情,而是需要一个"幽灵",无时不刻地伴随着我们,替我们处理海量数

[C#]解决程序Vista/Win7下因UAC导致的读写错误

在微软的操作系统中,vista和win7加入了UAC的功能,UAC(User Account Control,用户帐户控制)是微软为提高系统安全而在Windows Vista中引入的新技术,它要求用户在执行可能会影响计算机运行的操作或执行更改影响其他用户的设置的操作之前,提供权限或管理员‌密码.通过在这些操作启动前对其进行验证,UAC 可以帮助防止恶意软件和间谍软件在未经许可的情况下在计算机上进行安装或对计算机进行更改. 如图中所示,不属于 Windows 的一部分的程序需要您的许可才能启动.它

与调试器共舞 - LLDB 的华尔兹

你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? 1 NSLog(@"%@", whatIsInsideThisThing); 或者跳过一个函数调用来简化程序的行为? 1 NSNumber *n = @7; // 实际应该调用这个函数:Foo(); 或者短路一个逻辑检查? 1 if (1 || theBooleanAtStake) { ... } 或者伪造一个函数实现? 1 2 3 4 5 6 int calculateTheTrickyValue {   return 9;

与熊共舞思维导图及杂谈

关于<与熊共舞>这本书是年前读的,第一天上班翻查看到就想和大家分享一下 早上在公交上阅读了常高伟的一篇文章,引起共鸣.文中说作为领导不该在解决下属的问题中得到成就感和自豪感,应该培养下属解决问题的能力.但在当今这个社会,总是充斥这一种观念:“教会徒弟饿死师傅”.所以在一些公司中别人是不愿意将自己的一些经验方法什么拿出来分享.

与中国最顶尖sharepoint工程师共舞

最近又跳了,来到某家外企.自以为善能称心如意,谁知乃井里之蛙. 给我的最大感触是,做sharepoint一定要做过非常大型的部署开发,没有经过这种淬炼,天天闷声研究,做一些页面功能,对技术提升毫无帮助. 对于精通projectserver的我,一直想精通 sharepoint,终于得到了机会,与国内sharepoint真正的大牛一起共舞. 可以这么讲,这些大牛从来不上 QQ,不进入所谓的技术群,不开博客园,对MVP称号毫无兴趣,所以如果想从我们的博客园,csdn上学习也永远只是学点皮毛. 这个项

[原创译书] JS函数式编程 2.2 与函数共舞

?? Functional Programming in Javascript 主目录第二章 函数式编程基础上一节 函数式编程语言 与函数共舞 有时,优雅的实现是一个函数.不是方法.不是类.不是框架.只是函数. - John Carmack,游戏<毁灭战士>首席程序员 函数式编程全都是关于如何把一个问题分解为一系列函数的.通常,函数会链在一起,互相嵌套, 来回传递,被视作头等公民.如果你使用过诸如jQuery或Node.js这样的框架,你应该用过一些这样的技术, 只不过你没有意识到. 我们从J

走近支付宝移动支付测试,了解思科安卓先进测试技术,与讯飞人共舞。

走近支付宝移动支付测试,了解思科安卓先进测试技术,与讯飞人共舞.还在等什么?!!!赶快加入讯飞测试技术嘉年华(报名地址: http://itest.iflytesting.com/).前20名报名者将有机会获得精美礼品,并且有机会与来自支付宝.思科的嘉宾进行face to face的交流.时不我待,快快打开你的IE.火狐.chrome.先到既是赚到.如果您愿意前来分享您的经验.您的技术,那么我们也欢迎您到这个舞台来一场个人秀(提交主题地址: http://itest.iflytesting.co

【转载】Oracle 11g R2 for Win7旗舰版(64位)- 安装

免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:bluepoint2009      原文地址:http://www.cnblogs.com/bluepoint2009/p/oracle-11g-R2-win7-64bit.html 1.下载Oracle 11g R2 for Windows的版本                                    下载地址:http://www.oracle.com/t