有没有办法以管理员身份运行 Qt 应用程序?我的应用程序有一个自动更新程序。它需要管理员权限才能替换 Program Files 文件夹中的文件,因此需要管理员权限。
3 回答
以管理员权限运行应用程序与 Qt 没有太大关系。有两种方法。
“简单”的一种是手动设置您的应用程序以管理员权限运行。您可以通过右键单击可执行文件来执行此操作。然后在“兼容性”选项卡上,您可以在“权限级别”下选择“以管理员身份运行此应用程序”。
但是,如果您想自动实现相同的目标,则必须将清单嵌入到您的应用程序中。您正在寻找的是设置requestedExecutionLevel
to requireAdministrator
。可以在 MSDN或UAC 上的此 Wikipedia 条目中找到更多信息。
对于您在 Qt Creator 中构建的应用程序,这意味着您需要通过在资源 (.rc) 文件中包含对它的引用来嵌入清单。然后可以通过指定 .pro 将此资源文件添加到您的 .pro 文件中RC_FILE = myapp.rc
。关于这个问题的一篇信息丰富的博客文章是这个,以及QtCentre 论坛上的这篇文章。
如果您使用的是MSVC
工具包,一个非常简单的解决方案是将以下内容添加到项目文件中:
QMAKE_LFLAGS_WINDOWS += "/MANIFESTUAC:\"level='requireAdministrator' uiAccess='false'\""
我正在使用Qt 5.12 msvc2017
.
我发现这非常简洁,正如我在 generated 中看到的那样Makefile
,Qt 已经添加了一些与清单相关的链接标志,并且这种方法不会干扰已经嵌入的清单,因为从现有文件中手动添加清单。
可以轻松添加其他清单链接选项。您可以阅读 VS 编译器的文档,和/或您可以检查 Visual Studio IDE 必须提供的标志/选项Project properties/Linker/Manifest File
,然后检查Command Line
链接器的部分以查看它是如何添加它们的。
不确定这将如何在gcc
或clang
构建中完成,它可能需要@H Aßdøµ 和 @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>
其次,我们需要MT.exe
来自 Microsoft Windows SDK 的工具来将此 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)"
}
上述代码将自动从 WINSDK_DIR 执行 mt.exe 程序,并嵌入一个位于项目根目录并以项目目标命名的清单文件(即 MyApp.manifest)。这就是添加清单的全部内容,现在让我们继续并指定版本信息。
原帖:http: //blog.strixcode.com/2010/08/embedding-application-manifest-and.html