修改Manifest文件控制应用程序运行权限

    在Win7环境下,当使用普通用户账号运行某些应用程序(程序图标显示有盾牌)的时候,系统会弹出对话框要求输入管理员账号和密码,否则无法运行,也就是说这类应用程序只允许管理员运行,普通用户则完全无法运行。但同一应用程序在Win XP环境下却能基本运行,只是部分功能因没有管理员权限而无法使用。为安全起见,公司电脑一般都不会赋予用户账号管理员权限,这样一来很多程序都会无法在Win7下运行,会造成相当的不便。

    这是由于Windows的UAC(用户账户控制)安全机制导致的。Windows从Vsita开始引入该机制,当应用程序需要进行一些操作系统层面或者影响其他用户操作的设置,比如更改控制面板设置、删除系统文件、修改注册表等,操作系统便会弹出对话框,提示用户输入管理员账号密码,获得许可后方能继续。

    UAC的这种临时提升用户权限的设计大大提高了Windows的安全性,应用程序的一些操作必须要获取到管理员用户的许可方能运行,这样可以防止恶意软件和间谍软件在未经许可的情况下在计算机上运行安装或者对计算机进行更改。

    凡是图标显示有盾牌的可执行文件都需要管理员权限才能完全正常的运行,但也有可能该应用程序只是部分功能需要管理员权限而已,很多情况下我们只需使用应用程序的一般功能,所以我们需要强制可执行文件以普通用户权限运行。默认情况下可执行文件EXE是以当前用户权限运行的,那么操作系统是如何知道应用程序需要使用管理员权限运行而弹出对话框提示用户呢?

    操作系统是通过读取manifest清单文件来获取EXE文件运行所需的权限,Manifest清单文件是一个后缀为.manifest的XML文件,保存了有关应用程序的配置元数据。该Manifest可以作为一个文件存储在应用程序相同的目录下,也可以作为一种资源嵌入在可执行文件内部。


所以我们可以通过修改manifest文件来控制应用程序的运行权限,以下为外置和内置两种清单文件的修改方法:


  • 外置同名manifest文件

以软件“一号店在线客服”为例,软件安装后,修改程序目录(C:\Program Files (x86)\yhd)的文件夹权限,编辑Users用户组,添加“修改和写入”权限,在“高级”菜单中,勾选“更改权限”→“使用可从此对象继承的权限替代所有子对象项目”。然后以普通用户账号登陆系统,运行主程序(im-desktop.exe),系统弹出UAC对话框。这时候无论按是或否均无法运行程序。

修改Manifest文件控制应用程序运行权限_第1张图片


用记事本编辑跟程序位于同一目录的im-desktop.exe.manifest文件:

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level='requireAdministrator' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*' />
    </dependentAssembly>
  </dependency>
</assembly>

配置中有一个 requestedExecutionLevel 项,这个项用于配置当前应用请求的执行权限级别。这个项有3个值可供选择,如下表所示:


作用
asInvoker 应用程序就是以当前的权限运行。
highestAvailable

应用程序以当前用户可以获得的最高权限运行

requireAdministrator 应用程序仅以系统管理员权限运行。


所以我们只需要将requestedExecutionLevel项目设置为asInvoker或者highestAvailable,程序就能以当前用户账号正常运行了。


    其中,highestAvailable和 requireAdministrator 这两个选项都可以提示用户获取系统管理员权限。两个选项的区别在哪里呢?他们的区别在于,如果我们不是以管理员帐号登录,而应用程序设置为requireAdministrator,那么应用程序就直接运行失败,无法启动,也就是强制程序以管理员账号运行。而如果设置为 highestAvailable,则应用程序可以运行成功,只是以当前帐号的最高权限运行而不是系统管理员权限运行。另外,直接将该manifest文件删除也可以强制操作系统以当前用户运行。



  • 可执行文件内置manifest文件

以软件“美图秀秀”为例,安装软件后,使用普通账号运行程序同样会弹出UAC对话框,从而导致运行失败。其manifest清单文件内置在EXE文件里,无法直接编辑。

  1. 首先下载并安装可执行文件编辑软件Resource Hacker(http://www.angusj.com/resourcehacker/)。

  2. 接着用管理员账号运行ResourceHacker软件(鼠标右键主程序以管理员身份运行),然后点击File→Open,选择美图秀秀的主程序Xiuxiu.exe,点击左侧的资源列表中的Manifest→1:1033。

    这时候就看到了内置在EXE文件中的清单文件内容了,该文件内容和需要修改的内容都跟之前外置的清单文件一样,只要将requestedExecutionLevel项目修改为asInvoker或者highestAvailable即可。


    修改Manifest文件控制应用程序运行权限_第2张图片


  3. 修改后点击工具栏中的Compile Script,接着点击Save,程序会自动备份原文件为 XiuXiu_original.exe。

    注销并重新登陆一下当前的普通用户,运行xiuxiu.exe,程序就可以顺利运行了。

   

    现在越来越多应用程序运行时需要提升权限到管理员级别,这样可以提高软件的使用体验。但是企业办公电脑由于安全性和管理的需要,一般不允许赋予普通用户本机管理员的权限,这样一来会很多软件都无法使用。通过关闭UAC功能或者修改manifest清单文件都可以令普通用户能基本运行这类应用程序,不过,关闭UAC后,即与XP环境软件的运行机制类似,只能通过鼠标右键选择“运行为”来提升运行权限,而且基于安全性的考虑,不建议关闭UAC功能。需要注意的是,修改清单文件后不能保证软件可以百分百正常运行,修改后有时需要注销再登陆当前用户或者重启系统才会生效,还有,清单文件修改前要注意对EXE文件和manifest文件原文件做好备份。


原文为博主所著,并刊登于《网络安全和信息化》杂志2016.05期。


你可能感兴趣的:(权限,Manifest,应用程序,uac,清单)