当前位置: 首页 > news >正文

QT中为程序加入超级管理员权限

QT中为程序加入超级管理员权限

  • Chapter1 QT中为程序加入超级管理员权限
    • 1. mingw编译器
    • 2. MSVC编译器
    • 3. CMAKE
  • Chapter2 如何给QT程序添加管理员权限(UAC)的几种方法
    • 1、Qt Creator中
      • 方案一:(仅适用于使用msvc编译器)
      • 方案二:(适用于mingw32编译器)
    • 2、vs中
  • Chapter3 Qt 程序添加管理员权限的几种方法
    • 二、使用添加管理员权限的小工具
  • Chapter4 QT编译出来的exe以管理员权限启动
    • 1、编译QT时遇到问题:
    • 2、解决方法
  • Chapter5 给Qt程序添加管理员权限总结(一定有你没见过的方式)
    • 一、使用MSVC编译器
    • 二、使用MinGW编译器
    • 三、使用代码实现以管理员权限运行程序
    • 四、对第三章内容的补充


Chapter1 QT中为程序加入超级管理员权限

原文链接:https://blog.csdn.net/u013441358/article/details/127452147

QT的一些文件操作,注册表的操作等,有些操作会无效,主要是因为没有对C盘的相关权限。通过为程序加入超级管理员权限可以解决此问题。

1. mingw编译器

在pro工程文件中加入:

RC_FILE=main.rc

main.rc是Qt项目的资源文件,其内容示例如下:

IDI_ICON1               ICON     DISCARDABLE     "./res/logo.ico"
1 24 uac.manifest

第一行是为程序添加图标,第二行是增加超级管理员权限。

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' uiAccess='false' /> 
</requestedPrivileges> 
</security> 
</trustInfo> 
</assembly>

2. MSVC编译器

在QT工程文件中加入QMAKE_LFLAGS的增加配置:

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

3. CMAKE

放在add_executable的后面:

set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS"/MANIFESTUAC:\"level='requireAdministrator' uiAccess='false'\"/SUBSYSTEM:WINDOWS")

已经获得windows管理员权限的应用程序图标上会出现一个盾牌,例如:

Chapter2 如何给QT程序添加管理员权限(UAC)的几种方法

原文链接:https://blog.csdn.net/A3872215/article/details/98039295

1、Qt Creator中

方案一:(仅适用于使用msvc编译器)

在PRO文件中添加一行指令即可,

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

MANIFESTUAC内容如下:

<?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> 

方案二:(适用于mingw32编译器)

先创建一个 .manifest 文件,如:app.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>  

然后在exe所在的目录中执行mt指令(mt指令在VS自带的“开发人员命令提示”工具中)

1 mt.exe -manifest "app.manifest" -outputresource:"app.exe";#1

注意:exe和manifest文件要在同一目录中。

以上就是让Qt程序以管理员权限运行的两种方法。

2、vs中

方案一:在你的工程右键属性,找到linker–>manifest file.之后设置UAC execution level为:requireAdmistrator.

Chapter3 Qt 程序添加管理员权限的几种方法

原文链接:https://blog.csdn.net/weixin_39568531/article/details/104825816

二、使用添加管理员权限的小工具

/// permission.bat

start cmd /k " mt.exe -manifest "RunningPermission" -outputresource:"iphelper.exe";#1 &&taskkill /f /t /im cmd.exe"

在这里插入图片描述

Chapter4 QT编译出来的exe以管理员权限启动

原文链接:https://blog.csdn.net/weixin_44618297/article/details/125975286

1、编译QT时遇到问题:

2、解决方法

MinGW下加权限
这种方法需要先创建.manifest文件,如app.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>

然后再创建一个.rc文件,如app.rc,这两个文件都需要放在Pro文件同级目录下,rc文件内容如下:

CREATEPROCESS_MANIFEST_RESOURCE_ID  RT_MANIFEST	"app.exe.manifest"

最后在Pro文件中再附加如下代码:

RC_FILE = app.rc

重新编译运行即可解决。

Chapter5 给Qt程序添加管理员权限总结(一定有你没见过的方式)

原文链接:https://blog.csdn.net/zyhse/article/details/108166181

当我们写了一个Qt程序,程序会在C盘某些目录下创建文件时,会发现代码没有问题,但是就是创建失败。而当我们对程序右键,以管理员权限运行时,又可以正常创建文件。

此时,说明我们的程序默认不具备管理员权限,故而无法对某些目录进行写入。

根据我们的编译器不同,有如下2种情况。

一、使用MSVC编译器

在pro文件中,添加如下一行:

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

重新编译之后,程序会带个盾牌标志。

但是会有个后遗症,会发现我们在debug下,无法进行调试了,会弹出"The CDB process terminated"的错误:

这是因为我们的QtCreator没有以管理员权限运行,却对管理员权限的程序进行调试,所以报错,具体为什么,我也不知道。

当重新以管理员权限运行QtCreator,并进行调试,就不会报错了。

然鹅,每次启动QtCreator都以管理员权限太麻烦,换作不清楚的人,启动这个工程,一定是一脸懵逼。

所以我们稍微修改下pro文件,让程序仅仅在release模式下,才以管理员权限运行。

CONFIG(release, debug|release){
QMAKE_LFLAGS += /MANIFESTUAC:\"level=\'requireAdministrator\' uiAccess=\'false\'\"
}

这样,debug就不受影响了。

二、使用MinGW编译器

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' uiAccess='false' /></requestedPrivileges></security></trustInfo>
</assembly>

2、创建资源文件res.rc
加入如下内容:

1 24 uac.manifest

3、修改pro文件
.pro文件加入如下内容:

RC_FILE += res.rc

如果有其他ico等资源文件可以一起加入到res.rc文件中。

重新编译之后,程序会带个盾牌标志。

也会有在第一章中提到的无法debug后遗症。

所以我们稍微修改下pro文件,让程序仅仅在release模式下,才以管理员权限运行。

CONFIG(release, debug|release){
RC_FILE += res.rc
}

这样,debug就不受影响了。

三、使用代码实现以管理员权限运行程序

以上2种方式,比较常见。而且编译完之后,exe会带盾牌标志。

下面介绍一种,编译完不带盾牌,但是依然以管理员权限运行程序的方式。

我们首先创建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

UAC类中只有一个方法runAsAdmin(),实现以管理员权限启动一个新实例程序。

当执行到ShellExecuteA()函数时,会请求以管理员权限启动一个新实例程序,如下:

点击“是”,则表示允许启动,此时ShellExecuteA()返回值大于32;

点击“否”,则表示禁止启动,此时ShellExecuteA()返回值小于32。

我们在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();
}

我们双击执行生成的exe时,首先就会请求以管理员运行一个新实例;

若允许了,那么当前程序就退出;

若不允许,则当前程序继续执行。

这样,实现了启动时选择权限,而后保留只有一个对应权限程序运行的效果,与上述2种方式,双击运行效果一致。

不同点: 由于使用启动一个外部进程的方式来实现,故生成的exe不会带盾牌标志。

后遗症: 也有一个问题,就是进行debug时,允许管理员权限运行,那么启动了新实例,而当前程序退出,所以是无法进行调试的。

只能选择禁止管理员权限运行,才能对当前程序进行调试。

小贴士:

我们发现很多大厂出品的软件,也具有管理员权限,但是人家exe是不带盾牌标志的。或许用户看到盾牌,会觉得这货不是个善类。。。所以还是尽量伪装一下,我们就是普通软件,真的人畜无害!!! (>‿◠)

这种方式就看大家的需要吧。

四、对第三章内容的补充

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

在DiskMark.cpp文件中,存在如下原版代码,我的代码在此基础上,进行了一点修改,方便调用。

BOOL RunAsRestart()
{int count;
#ifdef _UNICODETCHAR** cmd = ::CommandLineToArgvW(::GetCommandLine(), &count);
#elseTCHAR** cmd = ::__argv;count = ::__argc;
#endifif (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;}}// ......
}

感兴趣,可以自己去看看。

相关文章:

  • C++习题精选(4)—— 栈
  • Mybatis05-一对多和多对一处理
  • 最大二叉树-力扣
  • 从零实现ChatGPT:第四章在无标签数据上预训练
  • 手写节流防抖函数
  • 多个线程多个锁:如何确保线程安全和避免竞争条件
  • Python pandas openpyxl excel合并单元格,设置边框,背景色
  • 在 Linux 系统上安装 Android NDK
  • 呼叫中心系统的国产化替代方案
  • 【Flutter】 TextField限制长度时, 第三方手写输入法、ios原始拼音输入法输入被吞问题
  • swift微调牧歌数据电商多模态大语言模型
  • 【Spring6】1-12章源码级深入详解 IoC
  • 网络安全(补充)
  • 外卖抢单神器
  • 重学java 66.IO流 转换流
  • avalon2.2的VM生成过程
  • java 多线程基础, 我觉得还是有必要看看的
  • Making An Indicator With Pure CSS
  • React 快速上手 - 07 前端路由 react-router
  • React+TypeScript入门
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • SQLServer之创建数据库快照
  • Travix是如何部署应用程序到Kubernetes上的
  • 程序员该如何有效的找工作?
  • 分布式任务队列Celery
  • 精彩代码 vue.js
  • 问题之ssh中Host key verification failed的解决
  • Hibernate主键生成策略及选择
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​如何在iOS手机上查看应用日志
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (翻译)terry crowley: 写给程序员
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (四)鸿鹄云架构一服务注册中心
  • (一一四)第九章编程练习
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .Net 4.0并行库实用性演练
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .Net Core缓存组件(MemoryCache)源码解析
  • .NET Core中的去虚
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET开发不可不知、不可不用的辅助类(一)
  • .net开发时的诡异问题,button的onclick事件无效
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .so文件(linux系统)
  • ::before和::after 常见的用法
  • @EnableWebSecurity 注解的用途及适用场景
  • @private @protected @public
  • []指针
  • [20170705]diff比较执行结果的内容.txt