QtCreator生成的exe添加管理员权限

Qtcreator生成的exe默认是不支持管理员权限的,就是生成的exe图标右下角有一个盾牌的标志,有2种方式可以实现,亲测通过。

一、如果你使用的是MSVC编译器,则在pro文件中,添加如下一行:

QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\"

可以分别配置debug和release模式下是否启用。

二、如果你使用的是MinGW编译器

首先:新建 xxx.exe.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' uiAccess='false' />
      </requestedPrivileges>
    </security>
  </trustInfo>
</assembly>

然后就是:

第一种方式:

a)将xxx.exe.manifest放入到exe所在目录。
b)打开vs自带的开发工具,然后切换到exe所在目录,并输入,注意后面有一个;#,不过好像不要也可以

mt.exe -manifest "xxx.exe.manifest" -outputresource:"你的exe";#1

第二种方式:

a)创建资源文件比如 myapp.rc,如果有资源文件可以忽略。

 b)在上述资源文件中添加一行(备注:数字1和24之间有空格)

1 24 xxx.exe.manifest

c)在pro文件中添加 RC_FILE = myapp.rc,一般通过向导添加的的话,这个就自动有了。

三、使用代码实现

上面2种方式生成的exe右下角带有盾牌图标,用代码生成的,可以不带,启动时仍然拥有管理员权限。

下列参考了:https://blog.csdn.net/zyhse/article/details/108166181

创建UAC.h,如下:

#ifndef UAC_H
#define UAC_H

#include <ShlObj_core.h>
#include <QCoreApplication>

// for IsUserAnAdmin()
#pragma comment (lib, "Shell32.lib")

class UAC
{
public:
    // 以管理员权限启动一个新实例
    // true-启动了新实例
    // false-未启动新实例
    static bool runAsAdmin()
    {
        if (IsUserAnAdmin())
        {
            return false; // 当前程序正以管理员权限运行
        }

        QStringList args = QCoreApplication::arguments(); // 获取命令行参数
        if (args.count() < 2 || args[1] != "runas") // 不带参数或参数不为"runas"时,即直接运行
        {
            // 获取应用程序可执行文件的路径
            QString filePath = QCoreApplication::applicationFilePath();

            // 以管理员权限,执行exe程序
            HINSTANCE ins = ShellExecuteA(nullptr, "runas", filePath.toStdString().c_str(),
                                          "runas", nullptr, SW_SHOWNORMAL);
            if (ins > (HINSTANCE)32)
            {
                return true; // 程序新实例启动成功
            }
        }
        return false;
    }
};

#endif // UAC_H

在main.cpp中调用UAC类,如下:

#include <QCoreApplication>
#include "UAC.h"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 以管理员权限启动一个新实例
    if (UAC::runAsAdmin())
    {
        return 0; // 启动成功,当前程序退出
    } // 未启动,当前程序继续

    return a.exec();
}

使用代码实现以管理员权限运行程序,思路是源自磁盘测试开源软件CrystalDiskMark,其github地址:https://github.com/hiyohiyo/CrystalDiskMark

在DiskMark.cpp文件中,存在如下原版代码,做了部分修改

BOOL RunAsRestart()
{
	int count;
#ifdef _UNICODE
	TCHAR** cmd = ::CommandLineToArgvW(::GetCommandLine(), &count);
#else
	TCHAR** cmd = ::__argv;
	count = ::__argc;
#endif

	if (count < 2 || _tcscmp(cmd[1], _T("runas")) != 0)
	{
		TCHAR path[MAX_PATH];
		::GetModuleFileName(NULL, path, MAX_PATH);
		if (::ShellExecute(NULL, _T("runas"), path, _T("runas"), NULL, SW_SHOWNORMAL)
	> (HINSTANCE)32)
		{
			return TRUE;
		}
	}
	return FALSE;
}

BOOL CDiskMarkApp::InitInstance()
{
    // ......

	if (! IsUserAnAdmin())
	{
		if (RunAsRestart())
		{
			return FALSE;
		}
	}

    // ......
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值