VC如何将自身进程提升至管理员权限

时间:2021-08-15 14:16:37

方法1、代码实现

    http://zhidao.baidu.com/question/260744247.html

方法2、编译选项设置

       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;
}

方法2、编译选项设置

/MANIFESTUAC(将 UAC 信息嵌入到清单中)

Visual Studio 2010
 
 
其他版本
VC如何将自身进程提升至管理员权限
 
 

指定是否将用户帐户控制 (UAC) 信息嵌入到程序清单中。

复制
/MANIFESTUAC
/MANIFESTUAC:NO
/MANIFESTUAC:fragment
/MANIFESTUAC:level=_level
/MANIFESTUAC:uiAccess=_uiAccess
VC如何将自身进程提升至管理员权限参数

fragment

一个字符串,它包含 level 和 uiAccess 值。 有关更多信息,请参见本主题中后面的“备注”部分。

_level

asInvoker、highestAvailable 或 requireAdministrator 之一。 默认为 asInvoker。 有关更多信息,请参见本主题中后面的“备注”部分。

_uiAccess

如果您希望应用程序绕过用户界面保护级别并将输入引导到桌面上的更高权限窗口(如屏幕键盘),则为 true;否则为 false。 默认为false。 仅针对用户界面辅助功能应用程序设置为 true。

VC如何将自身进程提升至管理员权限备注

如果您在命令行上指定多个 /MANIFESTUAC 选项,则最后输入的选项优先级最高。

/MANIFESTUAC:level 的选项包括:

  • asInvoker:应用程序将使用与启动它的进程相同的权限运行。 可通过选择“以管理员身份运行”将应用程序提升为更高权限。

  • highestAvailable:应用程序将使用可能的最高权限级别运行。 如果启动该应用程序的用户为管理员组的一个成员,则此选项与 requireAdministrator 相同。 如果可用的最高权限级别高于打开进程的级别,则系统将提示提供凭据。

  • requireAdministrator:应用程序将使用管理员权限运行。 启动该应用程序的用户必须是管理员组的一个成员。 如果打开进程未使用管理权限运行,则系统将提示提供凭据。

您可以通过使用 /MANIFESTUAC:fragment 选项在一个步骤中指定 level 和 uiAccess 值。 代码片段的格式必须是:

复制
"level=[ asInvoker | highestAvailable | requireAdministrator ] uiAccess=[ true | false ]"

在 Visual Studio 开发环境中设置此链接器选项

  1. 打开该项目的“属性页”对话框。 有关详细信息,请参见如何:打开项目属性页

  2. 展开“配置属性”节点。

  3. 展开“链接器”节点。

  4. 选择“清单文件”属性页。

  5. 修改“启用用户帐户控制(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文件也行。

VC如何将自身进程提升至管理员权限
VC如何将自身进程提升至管理员权限程序清单文件
<?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>
VC如何将自身进程提升至管理员权限

下面具体讲讲在MinGW或者VS2005 SP1的情况下该怎么做。

VS2005下简单,只需要在项目的资源里加这个uac.manifest文件即可。

我在VS2005的“添加资源”一项里没有找到“添加程序清单”,索性我选择了添加xml文件,并保存为uac.manifest,把以上内容复制到文件中,

再编译,就生成了启动时会提示UAC提权的提示框。(这种要求UAC提权的程序不能直接用F5调试运行,在VC里如果要直接看效果可以按Ctrl + F5 直接运行)。