1、UAC简介
从Windows Vista系统开始,微软为了提高系统安全引入了UAC(User Account Control,用户帐户控制)技术,它要求用户在执行可能会影响计算机运行的操作或执行更改影响其他用户的设置的操作之前,提供权限或管理员密码。通过在这些操作启动前对其进行验证,UAC 可以帮助防止恶意软件和间谍软件在未经许可的情况下在计算机上进行安装或对计算机进行更改。UAC可在控制面板->用户->用户账号设置进行设置,默认设置如下图:
开启后,当打开需要管理员权限运行的程序时就会弹出提示框询问用户:
2、让vs2005开发的程序获取管理员权限
vs2005开发的程序默认是不会触发UAC的,也就是说它打开时只有普通用户权限,除非用户右键程序使用管理员权限打开。那么怎么让程序双击打开时就获取管理员权限呢,如果是vs2008以上版本,那么通过项目属性->连接器->清单文件->UAC执行级别,设置为requireAdministrator即可。但是vs2005并没有这个设置,我们可以通过添加manifest来实现。
首先新建一个.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>
</assembly>
然后在项目属性设置里添加.manifest文件即可:
添加完之后,编译的程序打开即可弹出UAC权限框获取管理员权限。
3、可设置的权限级别
manifest里的level可以设置三种级别:
- asInvoker: 程序以当前用户权限允许
- highestAvailable: 以当前用户可以获得的最高权限运行
- requireAdministrator: 以系统管理员权限运行
highestAvailable 和 requireAdministrator 这两个选项都可以提示用户获取系统管理员权限,它们的区别是:
- 如果我们不是以管理员帐号登录,level设置为requireAdministrator,那么应用程序仍然会弹窗提示用户获取管理员权限,用户拒绝则会运行失败,无法启动
- 而如果我们不是以管理员帐号登录,level设置为highestAvailable,则应用程序不会弹窗提示用户获取管理员权限,而是直接可以运行,但是是以当前帐号的权限运行而不是系统管理员权限运行
如果我们希望程序必须以管理员权限运行,那么建议采用 requireAdministrator 来配置