在Windows上以管理员身份运行Qt应用程序

6

有没有一种方法可以将Qt应用程序作为管理员运行?我有一个应用程序的自动更新器。它需要管理员特权才能替换Program Files文件夹中的文件,因此它需要管理员权限。


你编写了一个需要管理员权限才能运行的应用程序?在运行应用程序时,与Qt无关。 - Bart
@Bart 是的,我有一个应用程序需要管理员权限才能运行。 - ssk
@Bart 我想要通过编程实现。QtCreator 是我的 IDE。我认为我需要像你建议的一样使用清单文件。 - ssk
是的。这已经有所帮助了:http://www.qtcentre.org/threads/46917-How-to-run-application-in-qt-as-administrator 你在清单中寻找的级别是“requireAdministrator”。 - Bart
这篇2016年的文章演示了如何在Qt Creator中实现请求Windows管理员权限。 - karlphillip
显示剩余2条评论
3个回答

12

以管理员权限运行应用程序与Qt并没有太多关系,有两种方法。

"简单"的方法是手动将应用程序设置为以管理员权限运行。您可以右键单击可执行文件,然后在“兼容性”选项卡中选择“特权级别”下的“以管理员身份运行此应用程序”。

但是,如果您想自动实现相同的功能,则必须将清单嵌入到应用程序中。您要查找的是将requestedExecutionLevel设置为requireAdministrator。更多信息可以在MSDN上UAC的维基百科条目中找到一些。

对于使用Qt Creator构建的应用程序,这意味着您需要通过在资源(.rc)文件中包含对其的引用来嵌入清单。然后可以通过指定RC_FILE = myapp.rc将此资源文件添加到您的.pro文件中。这个问题的有趣博客文章在这里,以及QtCentre论坛上的这篇文章


4
如果您使用的是 MSVC 工具包,则可以通过将以下内容添加到项目文件中来获得非常简单的解决方案:
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部分,以查看它是如何添加它们的。

不确定在gccclang构建中该如何完成,可能需要@Hassdøµ和@Bart提供的解决方案。


我应该在哪里添加那行代码? - Avenger
1
@Avenger,你把它添加到项目文件中,这是qmake。我也编辑了答案。 - Nenad

1

从提到@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)"
}

上述代码将自动执行位于WINSDK_DIR中的mt.exe程序,并嵌入一个清单文件,该文件位于项目根目录中,并以项目目标(即MyApp.manifest)命名。这就是添加清单的全部内容,现在让我们继续指定版本信息。
原始帖子: http://blog.strixcode.com/2010/08/embedding-application-manifest-and.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接