6

有没有办法以管理员身份运行 Qt 应用程序?我的应用程序有一个自动更新程序。它需要管理员权限才能替换 Program Files 文件夹中的文件,因此需要管理员权限。

4

3 回答 3

11

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

“简单”的一种是手动设置您的应用程序以管理员权限运行。您可以通过右键单击可执行文件来执行此操作。然后在“兼容性”选项卡上,您可以在“权限级别”下选择“以管理员身份运行此应用程序”。

但是,如果您想自动实现相同的目标,则必须将清单嵌入到您的应用程序中。您正在寻找的是设置requestedExecutionLevelto requireAdministrator。可以在 MSDNUAC 上的此 Wikipedia 条目中找到更多信息。

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

于 2012-05-29T20:41:02.187 回答
4

如果您使用的是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链接器的部分以查看它是如何添加它们的。

不确定这将如何在gccclang构建中完成,它可能需要@H Aßdøµ 和 @Bart 提供的解决方案。

于 2019-09-15T22:20:59.160 回答
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>

其次,我们需要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

于 2017-01-28T00:19:09.800 回答