QT中为步伐到场超等管理员权限

立山  金牌会员 | 2024-6-12 06:24:29 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 580|帖子 580|积分 1740


Chapter1 QT中为步伐到场超等管理员权限

原文链接:https://blog.csdn.net/u013441358/article/details/127452147
QT的一些文件操纵,注册表的操纵等,有些操纵会无效,主要是由于没有对C盘的干系权限。通过为步伐到场超等管理员权限可以办理此问题。
1. mingw编译器

在pro工程文件中到场:
  1. RC_FILE=main.rc
复制代码
main.rc是Qt项目的资源文件,其内容示比方下:
  1. IDI_ICON1               ICON     DISCARDABLE     "./res/logo.ico"
  2. 1 24 uac.manifest
复制代码
第一行是为步伐添加图标,第二行是增长超等管理员权限。
uac.manifest文件的内容示比方下:
  1. <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
  2. <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  3. <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  4. <security>
  5. <requestedPrivileges>
  6. <requestedExecutionLevel level='requireAdministrator' uiAccess='false' />
  7. </requestedPrivileges>
  8. </security>
  9. </trustInfo>
  10. </assembly>
复制代码
2. MSVC编译器

在QT工程文件中到场QMAKE_LFLAGS的增长设置:
  1. QMAKE_LFLAGS += /MANIFESTUAC:"level=\'requireAdministrator\' uiAccess=\'false\'"
复制代码
3. CMAKE

放在add_executable的后面:
  1. set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS
  2.     "/MANIFESTUAC:"level='requireAdministrator' uiAccess='false'"
  3.     /SUBSYSTEM:WINDOWS")
复制代码
已经获得windows管理员权限的应用步伐图标上会出现一个盾牌,比方:
Chapter2 怎样给QT步伐添加管理员权限(UAC)的几种方法

原文链接:https://blog.csdn.net/A3872215/article/details/98039295
1、Qt Creator中

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

在PRO文件中添加一行指令即可,
  1. QMAKE_LFLAGS += /MANIFESTUAC:"level=\'requireAdministrator\' uiAccess=\'false\'"
复制代码
MANIFESTUAC内容如下:
  1. <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
  2. <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  3. <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  4. <security>
  5. <requestedPrivileges>
  6. <requestedExecutionLevel level='requireAdministrator' uiAccess='false' />
  7. </requestedPrivileges>
  8. </security>
  9. </trustInfo>
  10. </assembly>
复制代码
方案二:(适用于mingw32编译器)

先创建一个 .manifest 文件,如:app.manifest,文件内容如下:
  1. <?xml version='1.0' encoding='UTF-8' standalone='yes'?>  
  2. <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>  
  3.     <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">  
  4.       <security>  
  5.         <requestedPrivileges>  
  6.           <requestedExecutionLevel level='requireAdministrator' uiAccess='false' />  
  7.         </requestedPrivileges>  
  8.       </security>  
  9.     </trustInfo>  
  10. </assembly>  
复制代码
然后在exe所在的目录中执行mt指令(mt指令在VS自带的“开发职员命令提示”工具中)
  1. 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
  1. 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,文件内容如下:
  1. <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
  2. <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  3.   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  4.     <security>
  5.       <requestedPrivileges>
  6.         <requestedExecutionLevel level='requireAdministrator' uiAccess='false' />
  7.       </requestedPrivileges>
  8.     </security>
  9.   </trustInfo>
  10. </assembly>
复制代码
然后再创建一个.rc文件,如app.rc,这两个文件都需要放在Pro文件同级目录下,rc文件内容如下:
  1. CREATEPROCESS_MANIFEST_RESOURCE_ID  RT_MANIFEST        "app.exe.manifest"
复制代码
最后在Pro文件中再附加如下代码:
  1. RC_FILE = app.rc
复制代码
重新编译运行即可办理。
Chapter5 给Qt步伐添加管理员权限总结(一定有你没见过的方式)

原文链接:https://blog.csdn.net/zyhse/article/details/108166181
当我们写了一个Qt步伐,步伐会在C盘某些目录下创建文件时,会发现代码没有问题,但是就是创建失败。而当我们对步伐右键,以管理员权限运行时,又可以正常创建文件。
此时,说明我们的步伐默认不具备管理员权限,故而无法对某些目录进行写入。
根据我们的编译器不同,有如下2种情况。
一、使用MSVC编译器

在pro文件中,添加如下一行:
  1. QMAKE_LFLAGS += /MANIFESTUAC:"level=\'requireAdministrator\' uiAccess=\'false\'"
复制代码
重新编译之后,步伐会带个盾牌标记。
但是会有个后遗症,会发现我们在debug下,无法进行调试了,会弹出"The CDB process terminated"的错误:
这是由于我们的QtCreator没有以管理员权限运行,却对管理员权限的步伐进行调试,所以报错,具体为什么,我也不知道。
当重新以管理员权限运行QtCreator,并进行调试,就不会报错了。
然鹅,每次启动QtCreator都以管理员权限太贫苦,换作不清晰的人,启动这个工程,一定是一脸懵逼。
所以我们稍微修改下pro文件,让步伐仅仅在release模式下,才以管理员权限运行。
  1. CONFIG(release, debug|release){QMAKE_LFLAGS += /MANIFESTUAC:"level=\'requireAdministrator\' uiAccess=\'false\'"
  2. }
复制代码
这样,debug就不受影响了。
二、使用MinGW编译器

1、创建文件uac.manifest
文件内容为:
  1. <?xml version='1.0' encoding='UTF-8' standalone='yes'?>
  2. <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  3.   <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  4.     <security>
  5.       <requestedPrivileges>
  6.         <requestedExecutionLevel level='requireAdministrator' uiAccess='false' />
  7.       </requestedPrivileges>
  8.     </security>
  9.   </trustInfo>
  10. </assembly>
复制代码
2、创建资源文件res.rc
到场如下内容:
  1. 1 24 uac.manifest
复制代码
3、修改pro文件
.pro文件到场如下内容:
  1. RC_FILE += res.rc
复制代码
如果有其他ico等资源文件可以一起到场到res.rc文件中。
重新编译之后,步伐会带个盾牌标记。
也会有在第一章中提到的无法debug后遗症。
所以我们稍微修改下pro文件,让步伐仅仅在release模式下,才以管理员权限运行。
  1. CONFIG(release, debug|release){RC_FILE += res.rc
  2. }
复制代码
这样,debug就不受影响了。
三、使用代码实现以管理员权限运行步伐

以上2种方式,比力常见。而且编译完之后,exe会带盾牌标记。
下面介绍一种,编译完不带盾牌,但是依然以管理员权限运行步伐的方式。
我们首先创建UAC.h,如下:
  1. #ifndef UAC_H
  2. #define UAC_H
  3. #include <ShlObj_core.h>
  4. #include <QCoreApplication>
  5. // for IsUserAnAdmin()
  6. #pragma comment (lib, "Shell32.lib")
  7. class UAC
  8. {
  9. public:
  10.     // 以管理员权限启动一个新实例
  11.     // true-启动了新实例
  12.     // false-未启动新实例
  13.     static bool runAsAdmin()
  14.     {
  15.         if (IsUserAnAdmin())
  16.         {
  17.             return false; // 当前程序正以管理员权限运行
  18.         }
  19.         QStringList args = QCoreApplication::arguments(); // 获取命令行参数
  20.         if (args.count() < 2 || args[1] != "runas") // 不带参数或参数不为"runas"时,即直接运行
  21.         {
  22.             // 获取应用程序可执行文件的路径
  23.             QString filePath = QCoreApplication::applicationFilePath();
  24.             // 以管理员权限,执行exe程序
  25.             HINSTANCE ins = ShellExecuteA(nullptr, "runas", filePath.toStdString().c_str(),
  26.                                           "runas", nullptr, SW_SHOWNORMAL);
  27.             if (ins > (HINSTANCE)32)
  28.             {
  29.                 return true; // 程序新实例启动成功
  30.             }
  31.         }
  32.         return false;
  33.     }
  34. };
  35. #endif // UAC_H
复制代码
UAC类中只有一个方法runAsAdmin(),实现以管理员权限启动一个新实例步伐。
当执行到ShellExecuteA()函数时,会哀求以管理员权限启动一个新实例步伐,如下:
点击“是”,则表示允许启动,此时ShellExecuteA()返回值大于32;
点击“否”,则表示禁止启动,此时ShellExecuteA()返回值小于32。
我们在main.cpp中调用UAC类,如下:
  1. #include <QCoreApplication>
  2. #include "UAC.h"
  3. int main(int argc, char *argv[])
  4. {
  5.     QCoreApplication a(argc, argv);
  6.     // 以管理员权限启动一个新实例
  7.     if (UAC::runAsAdmin())
  8.     {
  9.         return 0; // 启动成功,当前程序退出
  10.     } // 未启动,当前程序继续
  11.     return a.exec();
  12. }
复制代码
我们双击执行天生的exe时,首先就会哀求以管理员运行一个新实例;
若允许了,那么当前步伐就退出;
若不允许,则当前步伐继续执行。
这样,实现了启动时选择权限,而后保留只有一个对应权限步伐运行的结果,与上述2种方式,双击运行结果一致。
不同点: 由于使用启动一个外部进程的方式来实现,故天生的exe不会带盾牌标记。
后遗症: 也有一个问题,就是进行debug时,允许管理员权限运行,那么启动了新实例,而当前步伐退出,所以是无法进行调试的。
只能选择禁止管理员权限运行,才气对当前步伐进行调试。
小贴士:
我们发现许多大厂出品的软件,也具有管理员权限,但是人家exe是不带盾牌标记的。或许用户看到盾牌,会觉得这货不是个善类。。。所以还是尽量伪装一下,我们就是普通软件,真的人畜无害!!! (>‿◠)
这种方式就看大家的需要吧。
四、对第三章内容的增补

使用代码实现以管理员权限运行步伐,思绪是源自磁盘测试开源软件CrystalDiskMark,其github地址:https://github.com/hiyohiyo/CrystalDiskMark
在DiskMark.cpp文件中,存在如下原版代码,我的代码在此基础上,进行了一点修改,方便调用。
  1. BOOL RunAsRestart()
  2. {
  3.         int count;
  4. #ifdef _UNICODE
  5.         TCHAR** cmd = ::CommandLineToArgvW(::GetCommandLine(), &count);
  6. #else
  7.         TCHAR** cmd = ::__argv;
  8.         count = ::__argc;
  9. #endif
  10.         if (count < 2 || _tcscmp(cmd[1], _T("runas")) != 0)
  11.         {
  12.                 TCHAR path[MAX_PATH];
  13.                 ::GetModuleFileName(NULL, path, MAX_PATH);
  14.                 if (::ShellExecute(NULL, _T("runas"), path, _T("runas"), NULL, SW_SHOWNORMAL)
  15.         > (HINSTANCE)32)
  16.                 {
  17.                         return TRUE;
  18.                 }
  19.         }
  20.         return FALSE;
  21. }
  22. BOOL CDiskMarkApp::InitInstance()
  23. {
  24.     // ......
  25.         if (! IsUserAnAdmin())
  26.         {
  27.                 if (RunAsRestart())
  28.                 {
  29.                         return FALSE;
  30.                 }
  31.         }
  32.     // ......
  33. }
复制代码
感兴趣,可以自己去看看。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立山

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表