有没有一种方法可以将Qt应用程序作为管理员运行?我有一个应用程序的自动更新器。它需要管理员特权才能替换Program Files文件夹中的文件,因此它需要管理员权限。
有没有一种方法可以将Qt应用程序作为管理员运行?我有一个应用程序的自动更新器。它需要管理员特权才能替换Program Files文件夹中的文件,因此它需要管理员权限。
以管理员权限运行应用程序与Qt并没有太多关系,有两种方法。
"简单"的方法是手动将应用程序设置为以管理员权限运行。您可以右键单击可执行文件,然后在“兼容性”选项卡中选择“特权级别”下的“以管理员身份运行此应用程序”。
但是,如果您想自动实现相同的功能,则必须将清单嵌入到应用程序中。您要查找的是将requestedExecutionLevel
设置为requireAdministrator
。更多信息可以在MSDN上或UAC的维基百科条目中找到一些。
对于使用Qt Creator构建的应用程序,这意味着您需要通过在资源(.rc)文件中包含对其的引用来嵌入清单。然后可以通过指定RC_FILE = myapp.rc
将此资源文件添加到您的.pro文件中。这个问题的有趣博客文章在这里,以及QtCentre论坛上的这篇文章。
QMAKE_LFLAGS_WINDOWS += "/MANIFESTUAC:\"level='requireAdministrator' uiAccess='false'\""
我正在使用Qt 5.12 msvc2017
。
我发现这很不错,因为从我看到的生成的Makefile
中,Qt已经添加了一些与清单相关的链接标志,并且这种方法不会干扰已经嵌入清单的项目,如手动从现有文件中添加清单。
其他清单链接选项可以很容易地添加。您可以阅读VS编译器的文档,或者检查Visual Studio IDE在Project properties/Linker/Manifest File
中提供的选项和标志,然后检查链接器的Command Line
部分,以查看它是如何添加它们的。
不确定在gcc
或clang
构建中该如何完成,可能需要@Hassdøµ和@Bart提供的解决方案。
从提到@Bart先生的文章中:
应用程序清单
首先,我们需要准备一个应用程序清单文件。下面这个是针对不需要管理员权限的应用程序:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity version="2.0.2.0" processorArchitecture="X86" type="win32"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
其次,我们需要来自Microsoft Windows SDK的MT.exe
工具将此XML嵌入到我们的可执行文件中。要做到这一点,请使用以下命令:
mt.exe –manifest MyApp.exe.manifest -outputresource:MyApp.exe;1
自动清单嵌入
每次编译后手动执行mt命令是一项繁琐的任务。那么,让qmake来为我们完成如何呢?在研究文档后,看起来以下代码行应该可以解决问题:
win32 {
WINSDK_DIR = C:/Program Files (x86)/Microsoft SDKs/Windows/v7.0A
WIN_PWD = $$replace(PWD, /, \\)
OUT_PWD_WIN = $$replace(OUT_PWD, /, \\)
QMAKE_POST_LINK = "$$WINSDK_DIR/bin/x64/mt.exe -manifest $$quote($$WIN_PWD\\$$basename(TARGET).manifest) -outputresource:$$quote($$OUT_PWD_WIN\\${DESTDIR_TARGET};1)"
}