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

    // ......
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单链表复习 (C语言版)

目录 一.顺序表与链表的区别 二.链表概念 三.单链表 1.单链表的开始与初始化 2.单链表的打印 3.单链表的尾插 重难点&#xff1a;单链表实现时的指针详解 4.单链表的头插 5.单链表的尾删 6.单链表的头删 小结&#xff1a; 7.单链表的查找 8.在指定位置前插入数据 …

制作AI问答机器人:从0到1的完整指南

在数字化转型的浪潮中&#xff0c;企业正追求更高效、智能的客户服务解决方案。AI问答机器人以其快速响应、全天候服务和持续学习的能力&#xff0c;成为了提升客户满意度和加速业务发展的关键工具。本文将深入探讨如何制作一个企业级的AI问答机器人&#xff0c;并强调其功能体…

【Linux】(五)—— SSH远程登录和XShell使用

SSH Linux中的SSH&#xff08;Secure Shell&#xff09;是一个强大的网络协议&#xff0c;用于在不安全的网络环境中提供安全的远程登录和资料拷贝等其他网络服务。以下是有关Linux中SSH的关键点和操作指南&#xff1a; SSH的基础概念 安全性&#xff1a;SSH通过对所有传输的…

编程规范-代码检测-格式化-规范化提交

适用于vue项目的编程规范 – 在多人开发时统一编程规范至关重要 1、代码检测 --Eslint Eslint&#xff1a;一个插件化的 javascript 代码检测工具 在 .eslintrc.js 文件中进行配置 // ESLint 配置文件遵循 commonJS 的导出规则&#xff0c;所导出的对象就是 ESLint 的配置对…

【Pytorch】一文向您详细介绍 torch.Tensor() 的常见用法

【Pytorch】一文向您详细介绍 torch.Tensor() 的常见用法 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通…

WebAPI AOP方式 异常方式 FilterAttribute、ActionFilterAttribute

》》 自定义异常处理特性 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web; using System.Web.Http.Filters;namespace WebApplication11 {/// <summary>/// 异常处理特性/// </sum…

Transformer动画讲解:注意力计算Q、K、V

暑期实习基本结束了&#xff0c;校招即将开启。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。提前准备才是完全之策。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c…

九种mfc140u.dll丢失的解决方法,全面解决mfc140u.dll文件丢失

mfc140u.dll是 Microsoft Visual C 2015 Redistributable 的一部分&#xff0c;它与 Microsoft 基础类库&#xff08;MFC&#xff09;的 Unicode 版本有关。当您在运行使用 Visual C 2015 开发的应用程序时&#xff0c;可能会碰到关于mfc140u.dll丢失的错误。下面列出了一些解决…

WPF前端:一个纯Xaml的水平导航栏

效果图&#xff1a; 代码&#xff1a; 1、样式代码&#xff0c;可以写在窗体资源处或者样式资源文件中 <Style x:Key"MenuRadioButtonStyle" TargetType"{x:Type RadioButton}"><Setter Property"FontSize" Value"16" />…

Zabbix实现邮件和钉钉实时告警(使用python脚本)

告警和通知 告警是监控的主要职能,是指将到达某一阈值事件的消息发送给用户,让用户在事件发生的时候即刻知道监控项处于不正常状态,从而让用户来决定是否采取相关措施。 zabbix中,告警是由一系列的流程组成的,⾸首先是触发器到达阈值,接下是Active对事件信息进行处理,其…

谁能赢?阿里的通义 VS 百度的文心

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 国产AI大模型领域&#xff0c;当前有两大阵营&#xff1a; (1)以百度文心一言为代表的闭源大模型。李彦宏曾说过&#xff1a;AI大模型开源意义不大&#xff0c;百度绝不抢开发者饭碗。 (2)以阿里通义AI为代表的开…

个股场外期权个人如何参与买卖?

个股场外期权作为一种金融衍生品&#xff0c;为个人投资者提供了多样化的投资选择和风险管理工具。想要参与个股场外期权的买卖&#xff0c;以下是一些关键步骤和考虑因素。 文章来源/&#xff1a;财智财经 第一步&#xff1a;选择合适的金融机构 首先&#xff0c;个人投资者需…

Android 常用开源库 MMKV 源码分析与理解

文章目录 前言一、MMKV简介1.mmap2.protobuf 二、MMKV 源码详解1.MMKV初始化2.MMKV对象获取3.文件摘要的映射4.loadFromFile 从文件加载数据5.数据写入6.内存重整7.数据读取8.数据删除9.文件回写10.Protobuf 实现1.序列化2.反序列化 12.文件锁1.加锁2.解锁 13.状态同步 总结参考…

17- Redis 中的 quicklist 数据结构

在 Redis 3.0 之前&#xff0c;List 对象的底层数据结构是双向链表或者压缩列表&#xff0c;然后在 Redis 3.2 的时候&#xff0c;List 对象的底层改由 quicklist 数据结构实现。 其实 quicklist 就是【双向链表 压缩列表】组合&#xff0c;因为一个 quicklist 就是一个链表&…

视频修复工具,模糊视频变清晰!

老旧视频画面效果差&#xff0c;视频效果模糊。我们经常找不到一个好的工具来让视频更清晰&#xff0c;并把它变成高清画质。相信很多网友都会有这个需求&#xff0c;尤其是视频剪辑行业的网友&#xff0c;经常会遇到这个问题。今天给大家分享一个可以把模糊视频修复清晰的工具…

【ffmpeg】本地格式转换 mp4转wav||裁剪mp4

个人感受&#xff1a;太爽了&#xff01;&#xff01;&#xff01;&#xff08;可能用惯了转换网站和无良的转换软件&#xff09; ———— 使用FFmpeg把mp4文件转换为WAV文件 - 简书 (jianshu.com) FFMPEG 视频分割和合并 - 简书 (jianshu.com) ———— 示例 ffmpeg -i …

C# MemoryCache 缓存应用

摘要 缓存是一种非常常见的性能优化技术&#xff0c;在开发过程中经常会用到。.NET提供了内置的内存缓存类 MemoryCache&#xff0c;它可以很方便地存储数据并在后续的请求中快速读取&#xff0c;从而提高应用程序的响应速度。 正文 通过使用 Microsoft.Extensions.Caching.Me…

树的重心-java

主要通过深度优先搜索来完成树的重心&#xff0c;其中关于树的重心的定义可以结合文字多加理解。 文章目录 前言☀ 一、树的重心☀ 二、算法思路☀ 1.图用邻接表存储 2.图的遍历 3.算法思路 二、代码如下☀ 1.代码如下&#xff1a; 2.读入数据 3,代码运行结果 总结 前言☀ 主…

【中间件系列】浅析redis是否适合做消息队列

文章目录 一、简单的list消息队列1.命令示例2.伪代码示例3.方案优劣 二、Pub/Sub发布订阅1.消息丢失2.消息堆积 三、相对成熟的Stream1.redis命令介绍2.多消费者组测试3.Stream会持久化吗&#xff1f;4.消息堆积如何解决&#xff1f; 总结 用redis也是比较久了&#xff0c;并且…

AI数据分析:用deepseek根据Excel数据绘制分裂饼形图

工作任务&#xff1a;要绘制下面表格中月活用户占比的分裂饼形图 在deepseek中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个Python脚本编写的任务&#xff0c;具体步骤如下&#xff1a; 读取Excel文件"F:\AI自媒体内容\AI行业数据分析\poetop5…