百度小程序可以根据网站的要求做,东方资产营销网站,wordpress 安装乱码,中国万维网官网域名注册网站QT中为程序加入超级管理员权限 Chapter1 QT中为程序加入超级管理员权限1. mingw编译器2. MSVC编译器3. CMAKE Chapter2 如何给QT程序添加管理员权限(UAC)的几种方法1、Qt Creator中方案一#xff1a;#xff08;仅适用于使用msvc编译器#xff09;方案二#xff1a;#x… 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_FILEmain.rcmain.rc是Qt项目的资源文件其内容示例如下
IDI_ICON1 ICON DISCARDABLE ./res/logo.ico
1 24 uac.manifest第一行是为程序添加图标第二行是增加超级管理员权限。
uac.manifest文件的内容示例如下
?xml version1.0 encodingUTF-8 standaloneyes?
assembly xmlnsurn:schemas-microsoft-com:asm.v1 manifestVersion1.0
trustInfo xmlnsurn:schemas-microsoft-com:asm.v3
security
requestedPrivileges
requestedExecutionLevel levelrequireAdministrator uiAccessfalse /
/requestedPrivileges
/security
/trustInfo
/assembly2. MSVC编译器
在QT工程文件中加入QMAKE_LFLAGS的增加配置
QMAKE_LFLAGS /MANIFESTUAC:\level\requireAdministrator\ uiAccess\false\\3. CMAKE
放在add_executable的后面
set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS/MANIFESTUAC:\levelrequireAdministrator uiAccessfalse\/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 version1.0 encodingUTF-8 standaloneyes?
assembly xmlnsurn:schemas-microsoft-com:asm.v1 manifestVersion1.0
trustInfo xmlnsurn:schemas-microsoft-com:asm.v3
security
requestedPrivileges
requestedExecutionLevel levelrequireAdministrator uiAccessfalse /
/requestedPrivileges
/security
/trustInfo
/assembly 方案二适用于mingw32编译器
先创建一个 .manifest 文件如app.manifest文件内容如下 ?xml version1.0 encodingUTF-8 standaloneyes? assembly xmlnsurn:schemas-microsoft-com:asm.v1 manifestVersion1.0 trustInfo xmlnsurn:schemas-microsoft-com:asm.v3 security requestedPrivileges requestedExecutionLevel levelrequireAdministrator uiAccessfalse / /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.exeChapter4 QT编译出来的exe以管理员权限启动
原文链接https://blog.csdn.net/weixin_44618297/article/details/125975286
1、编译QT时遇到问题
2、解决方法
MinGW下加权限 这种方法需要先创建.manifest文件如app.exe.manifest,文件内容如下
?xml version1.0 encodingUTF-8 standaloneyes?
assembly xmlnsurn:schemas-microsoft-com:asm.v1 manifestVersion1.0trustInfo xmlnsurn:schemas-microsoft-com:asm.v3securityrequestedPrivilegesrequestedExecutionLevel levelrequireAdministrator uiAccessfalse //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 version1.0 encodingUTF-8 standaloneyes?
assembly xmlnsurn:schemas-microsoft-com:asm.v1 manifestVersion1.0trustInfo xmlnsurn:schemas-microsoft-com:asm.v3securityrequestedPrivilegesrequestedExecutionLevel levelrequireAdministrator uiAccessfalse //requestedPrivileges/security/trustInfo
/assembly2、创建资源文件res.rc 加入如下内容
1 24 uac.manifest3、修改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.hint 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;}}// ......
}感兴趣可以自己去看看。