在Win7环境下,当使用普通用户帐号运行某些应用程序(程序图标显示有盾牌)的时候,系统会弹出对话框要求输入管理员帐号和密码,不然没法运行,也就是说这类应用程序只容许管理员运行,普通用户则彻底没法运行。但同一应用程序在Win XP环境下却能基本运行,只是部分功能因没有管理员权限而没法使用。为安全起见,公司电脑通常都不会赋予用户帐号管理员权限,这样一来不少程序都会没法在Win7下运行,会形成至关的不便。安全
这是因为Windows的UAC(用户帐户控制)安全机制致使的。Windows从Vsita开始引入该机制,当应用程序须要进行一些操做系统层面或者影响其余用户操做的设置,好比更改控制面板设置、删除系统文件、修改注册表等,操做系统便会弹出对话框,提示用户输入管理员帐号密码,得到许可后方能继续。网络
UAC的这种临时提高用户权限的设计大大提升了Windows的安全性,应用程序的一些操做必需要获取到管理员用户的许可方能运行,这样能够防止恶意软件和间谍软件在未经许可的状况下在计算机上运行安装或者对计算机进行更改。ide
凡是图标显示有盾牌的可执行文件都须要管理员权限才能彻底正常的运行,但也有可能该应用程序只是部分功能须要管理员权限而已,不少状况下咱们只需使用应用程序的通常功能,因此咱们须要强制可执行文件以普通用户权限运行。默认状况下可执行文件EXE是以当前用户权限运行的,那么操做系统是如何知道应用程序须要使用管理员权限运行而弹出对话框提示用户呢?工具
操做系统是经过读取manifest清单文件来获取EXE文件运行所需的权限,Manifest清单文件是一个后缀为.manifest的XML文件,保存了有关应用程序的配置元数据。该Manifest能够做为一个文件存储在应用程序相同的目录下,也能够做为一种资源嵌入在可执行文件内部。ui
因此咱们能够经过修改manifest文件来控制应用程序的运行权限,如下为外置和内置两种清单文件的修改方法:spa
外置同名manifest文件操作系统
以软件“一号店在线客服”为例,软件安装后,修改程序目录(C:\Program Files (x86)\yhd)的文件夹权限,编辑Users用户组,添加“修改和写入”权限,在“高级”菜单中,勾选“更改权限”→“使用可今后对象继承的权限替代全部子对象项目”。而后以普通用户帐号登录系统,运行主程序(im-desktop.exe),系统弹出UAC对话框。这时候不管按是或否均没法运行程序。设计
用记事本编辑跟程序位于同一目录的im-desktop.exe.manifest文件:xml
<?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文件里,没法直接编辑。
首先下载并安装可执行文件编辑软件Resource Hacker(http://www.angusj.com/resourcehacker/)。
接着用管理员帐号运行ResourceHacker软件(鼠标右键主程序以管理员身份运行),而后点击File→Open,选择美图秀秀的主程序Xiuxiu.exe,点击左侧的资源列表中的Manifest→1:1033。
这时候就看到了内置在EXE文件中的清单文件内容了,该文件内容和须要修改的内容都跟以前外置的清单文件同样,只要将requestedExecutionLevel项目修改成asInvoker或者highestAvailable便可。
修改后点击工具栏中的Compile Script,接着点击Save,程序会自动备份原文件为 XiuXiu_original.exe。
注销并从新登录一下当前的普通用户,运行xiuxiu.exe,程序就能够顺利运行了。
如今愈来愈多应用程序运行时须要提高权限到管理员级别,这样能够提升软件的使用体验。可是企业办公电脑因为安全性和管理的须要,通常不容许赋予普通用户本机管理员的权限,这样一来会不少软件都没法使用。经过关闭UAC功能或者修改manifest清单文件均可以令普通用户能基本运行这类应用程序,不过,关闭UAC后,即与XP环境软件的运行机制相似,只能经过鼠标右键选择“运行为”来提高运行权限,并且基于安全性的考虑,不建议关闭UAC功能。须要注意的是,修改清单文件后不能保证软件能够百分百正常运行,修改后有时须要注销再登录当前用户或者重启系统才会生效,还有,清单文件修改前要注意对EXE文件和manifest文件原文件作好备份。
原文为博主所著,并刊登于《网络安全和信息化》杂志2016.05期。