如何在没有提升的情况下执行应用?

Tam*_*lei 7 qt uac shellexecute

我想调用更新程序来检查更新(不是实际进行更新,而只检查是否有更新).我想在后台默默地做这件事.如果有更新,我会要求用户提升权限并运行更新程序.检查涉及读取应用程序目录中的文件,并将其中找到的版本与网站上的版本进行比较.

如何在没有高程的情况下运行它只进行检查?QProcess::start()失败,因为它需要提升权限,ShellExecute只有在我添加"runas"动词时才会出现相同的原因(我只想在那个目录中实际写入,即我想要执行更新).我猜我需要添加某种清单,但我不知道它的内容.

Tam*_*lei 10

事实证明,我有另一个错误导致非升级运行分支在所有情况下运行.我在帖子中描述的模型有效.要避免Windows推断需要提升权限,您需要添加清单资源.(例如,如果应用程序exe的名称包含单词"updater",则会触发)

清单的内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
                <requestedExecutionLevel level="asInvoker" uiAccess="false" />
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>
Run Code Online (Sandbox Code Playgroud)

将它编译为.exe取决于你的编译器和环境,所以我只展示我的:Qt Creator和mingw-gcc:

使用以下内容为资源创建rc文件:

1 24 DISCARDABLE manifest.xml
Run Code Online (Sandbox Code Playgroud)

将此rc文件添加到.pro中,如下所示:

win32:RC_FILE = resources.rc
Run Code Online (Sandbox Code Playgroud)

在此之后,没有动词参数的ShellExecute将在没有提升的情况下运行,并且使用"runas"将以高程运行它.

  • 我更喜欢这个答案.少说话,多写代码. (3认同)