自己本来想写这么个东西。在自己写的程序中能打开另一个程序,而这个打开的程序是直接以管理员身份运行的而不需要弹出什么“是否要以管理员身份运行的对话框”。
那么我们首先来看一下UAC机制。
下面这些是摘引过来的:
保护Win7安全不得不说的UAC,众所周知,UAC是User Account Control的缩写,其中文翻译为用户帐户控制,是微软在Windows Vista和Win7中引用的新技术,主要功能是进行一些会影响系统安全的操作时,会自动触发UAC,用户确认后才能执行
大部分的恶意软件、木马病毒、广告插件在进入计算机时都会有如:将文件复制到Windows或Program Files等目录、安装驱动、安装ActiveX等操作,而这些操作都会触发UAC。面对这些不安全的因素,用户该如何解决UAC带来的问题?本文详细介绍了UAC触动的详细功能,并可以在UAC提示时来禁止这些程序的运行。
能够触发UAC的操作包括:修改Windows Update配置; 增加或删除用户帐户; 改变用户的帐户类型; 改变UAC设置;安装ActiveX; 安装或卸载程序; 安装设备驱动程序; 修改和设置家长控制; 增加或修改注册表; 将文件移动或复制到Program Files或是Windows目录; 访问其他用户目录UAC很烦是的,微软自从Windows Vista开始加入了UAC,这也成了人们对VISTA不满的诟病之一,因为Vista不像Win7一样可以对 UAC进行级别设置(其实Windows7的UAC也很烦),当时的电脑的普遍配置也很低,所以人们对这个动不动就弹出来,同时还会锁定屏幕的家伙很厌恶。
UAC在Win 7中的完善就是因为UAC太烦了,所以微软在Win 7中,加入了UAC的等级设置功能,分别对应4个级别:
默认级别(2级):
在默认级别下,只有在应用程序试图改变计算机设置时才会提示用户,而用户主动对Windows进行更改设置则不会提示。同时,在该模式下将启用安全桌面,以防绕过UAC更改系统设置。可以看出,默认级别可以既不干扰用户的正常操作,又可以有效防范恶意程序在用户不知情的情况下修改系统设置。一般的用户都可以采用该级别设置。
比默认级别稍低的级别(1级):
与默认级别稍有不同的是该级别将不启用安全桌面,也就是说有可能产生绕过UAC更改系统设置的情况。不过一般情况下,如果使用户启动某些程序而需要对系统进行修改,可以直接运行,不会产生安全问题。但如果用户没有运行任何程序却弹出提示窗口,则有可能是恶意程序在试图修改系统设置,此时应果断选择阻止。该级别适用于有一定系统经验的用户。
最低的级别(0级):
最低的级别则是关闭UAC功能(必须重新启动后才能生效)。在该级别下,如果是以管理员登录,则所有操作都将直接运行而不会有任何通知,包括病毒或木马对系统进行的修改。在此级别下,病毒或木马可以任意连接访问网络中的其他电脑、甚至与互联网上的电脑进行通信或数据传输。可见如果完全关闭UAC并以管理员身份登录,将严重降低系统安全性。此外,如果是以标准用户登录,那么安装、升级软件或对系统进行修改和设置,将直接被拒绝而不弹出任何提示,用户只有获得管理员权限才能进行。可见完全关闭UAC并以标准用户登录,各种操作和设置也非常不方便,因此建议不要选择该级别。
*别(3级):
在高级级别下,“始终通知”(即完全开启),在该级别下,用户安装应用程序、对软件进行升级、应用程序在任何情况下对操作系统进行更改、更改 Windows设置等情况,都会弹出提示窗口(并启用安全桌面),请求用户确认。由此可见该级别是最安全的级别,但同时也是最“麻烦”的级别,适用于多人共用一台电脑的情况下,限制其他标准用户,禁止其随意更改系统设置。
但是UAC很有用UAC虽然经常安装软件的人很烦,但UAC的作用却不容小觑。不得不承认微软对于操作系统的理念是很超前的,所以经常会搞出一些虽然很棒却很尴尬的东西,就好像当年的VISTA,在人们开始接受Windows 7的今天,再回头去看Vista,才越来越意识到VISTA其实是一个很不错的操作系统,只 不过是生不逢时。
我们在这里可以更改UAC设置:
如果是以管理员权限运行的,那么把它改成最低级别之后,所有的UAC都不会弹出来了。这样就达到了我们要的效果。
其实是可以在注册表里面修改这个设置的。这里等下再说。
首先来说说如何让自己的图标多出个盾牌。也就是说我们双击程序运行的时候启动UAC机制。
其实是很简单的。。。。
第一步:
我们随手写个helloworld,生成了一个a.exe文件。
然后在对应目录下面创建一个可执行文件名.exe.manifest 如果我这里既是a.exe.manifest
<?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="VistaLogoDemo" type="win32"/>
<description>Description of your application</description>
<!-- Identify the application security requirements. -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
现在我们导入我们写好的资源文件:
添加资源导入manifest文件命名为RT_MANIFEST,将其ID改为1
第三步:
编译运行一下,可能会出错,错误如下:
error c1010001: Values of attribute "level" not equal in different manifest snippets. E:\VC2010SP1Samples\C++\MFC\D2D\MFCGdiInteropSample\Debug\MFCGdiInteropSample.exe.intermediate.manifest
双击错误,这里出来一个vs自动生成的.manifest文件
把对应的requestExecutionLevel 更改。在这个例子里我们改成
requireAdministrator,再次编译运行 。
如果你不是以管理员权限打开的,可能vs会要求你重新启动来编译运行:如下图:
假设我生成的是Release版本,现在查看下对应文件夹下面的图标,就多了一个盾牌了。双击运行,就会弹出UAC机制了。
接下来说说用注册表更改UAC的等级:
键值项:
HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Policies/System
相关键值设置:
UAC高
ConsentPromptBehaviorAdmin = 2
EnableLUA = 1
PromptOnSecureDesktop = 1
UAC中
ConsentPromptBehaviorAdmin = 5
EnableLUA = 1
PromptOnSecureDesktop = 1
UAC低
ConsentPromptBehaviorAdmin = 5
EnableLUA = 1
PromptOnSecureDesktop = 0
UAC关
ConsentPromptBehaviorAdmin = 0
EnableLUA = 0
PromptOnSecureDesktop = 0
注1:相关键说明
ConsentPromptBehaviorAdmin 通知强度级别
EnableLUA 是否开启UAC
PromptOnSecureDesktop 桌面是否变黑
注2:对UAC对级别设置说明
注意必须重新启动才能生效。