方法1、代码实现
http://zhidao.baidu.com/question/260744247.html
http://msdn.microsoft.com/zh-cn/library/bb384691.aspx
方法3、在资源文件中添加一个自己的manifest文件
方法1、代码实现
3.67 icePub_runByAdmin
l 函数原型:
int WINAPI icePub_runByAdmin(char *strAppPathName,char *strSuParam)
输入:strAppPathName 带路径应用程序文件名;为空则默认本身应用程序
strSuParam 以管理员权限启动程序的命令行参数;为空则默认为"su "
输出:
l VC连接Lib方式声明
__declspec(dllexport)
int WINAPI icePub_runByAdmin(char *strAppPathName,char *strSuParam);
l 动态调用例程
VC sample 代码:
int runByAdmin(void)
{
int retCode=-1;
typedef int (WINAPI ICEPUB_RUNBYADMIN)(char *strAppPathName,char *strSuParam);
ICEPUB_RUNBYADMIN *icePub_runByAdmin = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
icePub_runByAdmin = (ICEPUB_RUNBYADMIN *)GetProcAddress(hDLLDrv, "icePub_runByAdmin");
if(icePub_runByAdmin)
retCode=icePub_runByAdmin("","");
if(hDLLDrv)
FreeLibrary(hDLLDrv);
if(retCode == 0)
exit(0);
if(retCode == -1)
AfxMessageBox("以管理员启动失败,请手动启动");
return retCode;
}
/MANIFESTUAC(将 UAC 信息嵌入到清单中)
指定是否将用户帐户控制 (UAC) 信息嵌入到程序清单中。
如果您在命令行上指定多个 /MANIFESTUAC 选项,则最后输入的选项优先级最高。
/MANIFESTUAC:level 的选项包括:
-
asInvoker:应用程序将使用与启动它的进程相同的权限运行。 可通过选择“以管理员身份运行”将应用程序提升为更高权限。
-
highestAvailable:应用程序将使用可能的最高权限级别运行。 如果启动该应用程序的用户为管理员组的一个成员,则此选项与 requireAdministrator 相同。 如果可用的最高权限级别高于打开进程的级别,则系统将提示提供凭据。
-
requireAdministrator:应用程序将使用管理员权限运行。 启动该应用程序的用户必须是管理员组的一个成员。 如果打开进程未使用管理权限运行,则系统将提示提供凭据。
您可以通过使用 /MANIFESTUAC:fragment 选项在一个步骤中指定 level 和 uiAccess 值。 代码片段的格式必须是:
在 Visual Studio 开发环境中设置此链接器选项
-
打开该项目的“属性页”对话框。 有关详细信息,请参见如何:打开项目属性页。
-
展开“配置属性”节点。
-
展开“链接器”节点。
-
选择“清单文件”属性页。
-
修改“启用用户帐户控制(UAC)”、“UAC 执行级别”和“UAC 绕过 UI 保护”属性。
以编程方式设置此链接器选项
方法3、
在MinGW或VS 2005 SP1环境下创建一个要求UAC权限的程序。
之前在给U盘挂自制操作系统的那篇教程里,我给写了一个pdev程序用来输出windows下,系统各磁盘的主引导记录。
不过那个程序用起来每次都要记得用管理员权限启动程序,这多少增加了不便。(特别是对带UAC功能的win7\vista来说)。
如果能让程序启动时自动要求提权,那当然更符合windows程序的一般习惯。
我查到了一篇这种做法的教程:
http://www.zu14.cn/2010/05/14/delphi-win32-program-on-windows7-vista-uac-administrator-rights/
也就是需要用到以下这个xml文件(保存成uac.manifest文件,不过还可以保存成任意的.manifest文件也行。
<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>
下面具体讲讲在MinGW或者VS2005 SP1的情况下该怎么做。
VS2005下简单,只需要在项目的资源里加这个uac.manifest文件即可。
我在VS2005的“添加资源”一项里没有找到“添加程序清单”,索性我选择了添加xml文件,并保存为uac.manifest,把以上内容复制到文件中,
再编译,就生成了启动时会提示UAC提权的提示框。(这种要求UAC提权的程序不能直接用F5调试运行,在VC里如果要直接看效果可以按Ctrl + F5 直接运行)。