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

时间:2012-05-29 16:13:59

标签: qt exe administrator

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

3 个答案:

答案 0 :(得分:11)

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

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

但是,如果您自动希望实现相同目标,则必须在应用程序中嵌入清单。您要找的是将requestedExecutionLevel设置为requireAdministrator。可以找到更多信息on MSDNthis Wikipedia entry on UAC

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

答案 1 :(得分: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

答案 2 :(得分:1)

如果您使用的是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构建中将如何完成,可能需要@H Aßdøµ和@Bart提供的解决方案。