很多程序能够在XP下正常运行,在Vista普及的时候遇到了各种问题,因为从Vista开始多了一个UAC(User Account Control,用户帐户控制
)不少程序因此而出现各种莫名其妙的错误。后来,人们知道要用管理员身份启动程序。但是仍然有很多用户对这一点不会使,软件开发商总不可能认为每个用户都会去“Run as Administrator”吧。
《Windows核心编程》曾经提及,很多软件开发者喜欢偷懒,在调用需要指明权限的API的时候往往写入XXX_ALL_ACCESS,比如RegOpenKeyEx传入KEY_ALL_ACCESS,结果这些程序来到Vista、Win7,对于那些不是很懂电脑的人来说,软件就显得“不好使”了。
其实,给应用程序的嵌入一段特殊的资源,就可以要求以管理员身份运行,当当前用户不是管理员时,会要求输入管理员密码。
以VC6为例。
打开你的VC6工程,找到“资源视图”,然后在视图中的树的根结点上点鼠标右键,选择菜单“插入”。
在弹出的“插入资源”对话框中选择“Custom”,在新对话框(“New Custom Resource”)输入框中输入24。因为manifest的类型是24,点击“OK”按钮。
在资源视图的树上面选择24下方的条目“DDR_DEFAULT1”上点右键,选择“Properties”,将ID修改为1。
双击刚才修改的“1”资源,然后在右方的编辑器窗口中输入下面的代码:
<?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="test.exe.manifest"
type="win32"
/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
之后,重新编译就可以了。权限的声明在requestedExecutionLevel节点中。该元素的level 属性可具有以下三个值之一:
asInvoker, highestAvailable和requireAdministrator。
不需要管理权限的可执行文件(比如Notepad.exe邓)指定 asInvoker 值。
某些可执行文件预期管理员始终希望具有最大访问权限,因此他们使用 highestAvailable 值。
requireAdministrator 始终会导致提升请求,任何没有管理权限就无法操作的可执行文件需要使用该值。
原文:http://www.programlife.net/windows-vista-7-program-need-uac.html