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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

36、matlab矩阵特征值、特征向量和奇异值

1、名词说明 1)特征值 特征值&#xff08;Eigenvalues&#xff09;是矩阵的一个重要概念&#xff0c;在线性代数中起着非常重要的作用。给定一个nn的方阵A&#xff0c;如果存在一个非零向量v&#xff0c;使得矩阵A作用于向量v后&#xff0c;得到的结果与向量v成比例&#xff…

计算机组成原理(五)

一、链式查询方式 接口的优先级固定不变 在链式查询的情况下&#xff0c;设备的优先级通常与其在链中的位置有关。具体来说&#xff0c;越靠近查询链的起始位置的设备通常具有较高的优先级&#xff0c;而越靠近链的末尾位置的设备优先级较低。 优点&#xff1a; 简单实现&am…

解决:AttributeError: module ‘tensorflow‘ has no attribute ‘***‘

问题产生的原因是当前Python使用的Tensorflow库为2.0最新版本&#xff0c;而源代码使用的是1.0版本&#xff0c;在不降低版本的情况下运行代码需要做些调整&#xff1a; 找到报错的地方&#xff0c;在报错的attribute前面加上compat.v1. 举例说明&#xff1a; 源码&#xff…

图像处理基于阈值的分割

基于阈值的图像分割是一种简单而常用的分割方法&#xff0c;它将图像中的像素根据其灰度值与预先设定的阈值进行比较&#xff0c;大于或小于阈值的像素被归入不同的区域。以下是基于阈值的图像分割的基本步骤&#xff1a; 灰度化&#xff1a;将彩色图像转换为灰度图像&#xff…

postman教程-20-Newman安装入门

上一小节我们学习了Postman mock测试的方法&#xff0c;本小节我们讲解一下Postman Newman的安装方法。 Newman是Postman团队开发的一个命令行工具&#xff0c;它允许用户通过命令行接口&#xff08;CLI&#xff09;运行Postman集合&#xff08;Collections&#xff09;和环境…

两种AI 图像生成技术:MidJourney 和 Stable Diffusion

目录 1、MidJourney1.1 MidJourney基本特点1.2 MidJourney的玩法教程 2、Stable Diffusion2.1 Stable Diffusion基本特点&#xff1a;2.2 Stable Diffusion生成展示 3、两种技术的区别4、AI 绘画与它们的联系5、总结 MidJourney 和 Stable Diffusion 是当前两种流行的 AI 图像生…

20.1 JSON-JSON接口以及在Go语言中使用JSON

1. 简介 JSON即JavaScript对象表示法(JavaScript Object Notation)&#xff0c;是一种用于存储和交换数据的格式&#xff0c;是一种可供人类阅读和理解的纯文本格式。 JSON既可以键值对的形式&#xff0c;也可以数组的形式&#xff0c;表示数据。 JSON最初是JavaScript的一个…

简单脉冲动画效果实现

简单脉冲动画效果实现 效果展示 CSS 知识点 CSS 变量的灵活使用CSS 动画使用 页面整体结构实现 <div class"pulse"><span style"--i: 1"></span><span style"--i: 2"></span><span style"--i: 3"…

代码随想录训练营Day 56|力扣300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

1.最长递增子序列 视频讲解&#xff1a;动态规划之子序列问题&#xff0c;元素不连续&#xff01;| LeetCode&#xff1a;300.最长递增子序列_哔哩哔哩_bilibili 代码随想录 代码&#xff1a; class Solution { public:int lengthOfLIS(vector<int>& nums) {vector…

快递一键查询,只需快递单号,轻松掌握全程物流信息,让您的包裹追踪无忧!

在快节奏的现代生活中&#xff0c;快递已经成为我们生活中不可或缺的一部分。无论是网购的宝贝、亲朋好友寄来的礼物&#xff0c;还是工作中的紧急文件&#xff0c;快递都承载着我们的期待和需要。然而&#xff0c;面对众多的快递公司和复杂的查询流程&#xff0c;如何快速、准…

深度解读ChatGPT:原理、应用与未来探索

本文将深入剖析ChatGPT&#xff0c;包括其工作原理、技术栈、训练方法、应用场景、优势与挑战&#xff0c;以及未来发展方向。通过详尽的分析和案例&#xff0c;帮助读者全面理解这一先进语言模型。 文章目录 引言2. ChatGPT概述2.1 什么是ChatGPT2.2 ChatGPT的应用场景3. 技术…

Docker:安装 Orion-Visor 服务器运维的技术指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 Orion-Visor 是一种用于管理和监控容器的工具。它提供了一个直观的界面&#xff0c;用于查看容器的状态、资源使用情况以及日志等信息。在这篇技术博客中&#xff0c;我们将介绍如何…

南通logo的标志设计详解!教你打造独特品牌标识!

在品牌设计中&#xff0c;南通logo的标志设计是至关重的环。一个特而吸引力的标志能够让品牌在市场中脱颖而出&#xff0c;并传达品牌的价值和特点。 那么&#xff0c;该如何进行南通logo的标志设计呢?在本文中&#xff0c;将详细讲南通logo的标志设计过程和要点&#xff0c;…

微信小程序双层/多层 wx:for 循环嵌套,关于内外层的 index 和 item ;data-index 传递两个参数

微信小程序用 wx:for 循环可以快速将后端 js 的数组快速显示到前端&#xff1b; 那假如数组中嵌套数组&#xff1b;就存在内外层两层及以上的多层嵌套循环了。 那么如果两层的嵌套式循环 index 究竟是属于哪一层呢&#xff1f;item 又属于哪一个呢&#xff1f; <view><…

“新E代弯道王”MAZDA EZ-6亮相2024重庆国际车展

6月7日-6月16日&#xff0c;第二十六届重庆国际车展隆重开幕&#xff0c;合资品牌首款基于纯电平台的新能源轿车MAZDA EZ-6&#xff08;以下称EZ-6&#xff09;领衔长安马自达全系车型亮相N8馆T01展台。车展期间&#xff0c;重庆及周边地区的马自达用户、粉丝、车友可前往长安马…

【Kafka专栏 03】Kafka是如何保证幂等性?

作者名称&#xff1a;夏之以寒 作者简介&#xff1a;专注于Java和大数据领域&#xff0c;致力于探索技术的边界&#xff0c;分享前沿的实践和洞见 文章专栏&#xff1a;夏之以寒-kafka专栏 专栏介绍&#xff1a;本专栏旨在以浅显易懂的方式介绍Kafka的基本概念、核心组件和使用…

代码签名证书怎么申请?有什么条件?

代码签名证书是由证书颁发机构(CA)颁发的数字证书&#xff0c;用于验证组织/软件作者的身份并确保软件/应用程序/程序的完整性。它们包含组织的数字签名、组织名称和时间戳&#xff08;如果需要&#xff09;。 软件开发人员利用代码签名证书将其数字签名放在应用程序、可执行文…

从ibd文件恢复MySQL数据

从ibd文件恢复MySQL数据 1.背景2.操作步骤2.1 备份源数据库的ibd文件2.2 准备数据库建表语句2.3 重新安装新数据库2.4 新数据库恢复数据具体步骤 3.常见错误3.1 权限问题3.2 报错不存在CFG文件3.3 通过ibd文件恢复数据后自增主键问题报冲突 1.背景 前段时间&#xff0c;我的云…

弱智吧”,人类抵御AI的最后防线

“写遗嘱的时候错过了deadline怎么办&#xff1f;” “怀念过去是不是在时间的长河里刻舟求剑&#xff1f;” “英语听力考试总是听到两个人在广播里唠嗑&#xff0c;怎么把那两个干扰我做题的人赶走&#xff1f;” 以上这些饱含哲学但好像又莫名其妙的问题&#xff0c;出自…

【简单学习一下卷积神经网络】-基于肆十二的高考例子

前言一、白话卷积神经网络总结 前言 【参考】 主要是P2⇨手把手教你用tensorflow2训练自己的数据集 -------2024/5/4 一、白话卷积神经网络 高考前需要大量的做题训练---->相当于数据集。 做题过程中【于标准答案进行比对】产生的错题⇨loss&#xff08;误差&#xff09; 回…