在vista以后的windows版本中,有些时候需要提升编译后生成程序的权限,即希望让生成的程序以管理员身份运行。虽然在一般情况下,可以使用鼠标右键选择的方式来强行以管理员身份运行,但它并没有屏蔽普通运行方式,而且普通人通常也不会使用右键选择以管理员身份运行,所以必须在生成程序时就限定程序只能以管理员方式来运行。以下以C++builder为例来说明一下具体方法。
先简单说一下,在vista以后的windows版本中,微软引入了UAC机制,它的目的是防止程序对操作系统本身进行恶意篡改。要让程序以管理员身份运行,就需要在程序中引入UAC标注,也即让程序显示“UAC盾牌”。这在C++builder中,是通过读取程序在Resource里的MANIFEST资源来决定的,为此,C++builder必须在资源里面嵌入MANIFEST信息。
1.打开记事本,写入下面的内容,并保存成一个名为uac.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"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
上述中的requireAdministrator就表示程序需要管理员才能运行。
2.再打开记事本,写入下面的内容,并保存成一个名为uac.rc的文件。
1 24 uac.manifest
3.确保上面两个文件在同一目录下,打开命令行窗口,进入到该目录下,运行brcc32 uac.rc -fouac.res,回车后会看到该目录下多出了一个资源文件uac.res。
4.以右键选择管理员身份运行C++builder(这点很重要),新建一个VCL Form Application的工程文件,先保存并运行一下。然后把上面生成的uac.res文件拷贝到该工程目录下。点击菜单Project->Add to Project(或按shift+F11),定位到工程目录并选择uac.res文件(注意扩展名过滤)并点击打开,这时应该在项目管理器中可以看到该文件被加入到了工程中。最后打开工程的cpp文件(默认为Project1.cpp),在第二行#pragma hdrstop之前加入一句#pragma resource "uac.res",接着保存并编译运行整个工程(可直接按F9),这时生成的程序就带有“UAC盾牌”了!找到生成的可执行程序,会看到程序的图标被加上了一个“盾牌”,表示它必须以管理员身份运行。
5.如果需要让生成的程序脱离开发环境独立行动,可点击菜单Project->Options(或按Shift+Ctrl+F11),先找到Linking选项卡,把Dynamic RTL前面的勾去掉;再找到Packages选项卡,把Build runtime packes前的勾也去掉,保存工程并编译,生成的可执行文件就可以在其它未装C++builder的电脑上以管理员身份运行了!
6.如果上面的程序在编译中提示“Unable to create process”,是因为C++builder没有以管理员身份运行!上述过程适用于C++builder2007及以前的版本,若是以后的版本就简单一些了,做完前面的1~3步后,第4步可点击菜单Project->Options,选择Application选项卡,在runtime themes一项中改为use custom manifest就行了。
按以上操作后,会发现编译后的程序外观样式会变为传统XP的样式,不太好看。怎么改回来呢?
其实,在程序编译时会有一条警告信息产生,如下:“[ILINK32 Warning] Warning: Duplicate resource: Type 24 (user-defined), ID 1; File D:\DOCUMENTS\VFS150.TMP resource kept; file D:\DOCUMENTS\UAC.RES resource discarded.”,说明有资源冲突产生。在C++builder2007中,加入了对vista及以后版本外观样式的支持,使程序的界面更好看了。点击菜单Project->Options,选择Application选项卡,可看到有一项名为Enable Runtime themes的选项,默认是钩选上的,即使用新的Windows外观样式。把勾去掉后再编译程序,会发现程序界面回到了传统的XP样式。所以,程序在加入UAC后,其资源会与该项发生冲突,因此程序界面才会回到传统的XP样式!如何解决呢?下面给出一种较为简单的方法:
1、去除Enable Runtime themes选项,即不钩选。
2、把前面的uac.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"/>
</requestedPrivileges>
</security>
</trustInfo>
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="CompanyName.ProductName.YourApplication"
type="win32"/>
<description>
Your application description here.
</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
processorArchitecture="X86"
publicKeyToken="6595b64144ccf1df"
language="*"
/>
</dependentAssembly>
</dependency>
</assembly>
3、其余重复前面的步骤。
再重新编译程序后,会发现警告信息没有了,程序界面也保持了新的样式,而不会再回到XP样式了。
原文地址:https://www.cnblogs.com/fxzq/p/12262294.html