使用mingw32嵌入清单文件以要求管理员执行级别

时间:2015-10-07 18:49:43

标签: c linux windows uac mingw32

我正在ubuntu下用i586-mingw32msvc交叉编译一个应用程序。

我很难理解如何嵌入清单文件以使用mingw32来管理执行级别。

对于我的例子,我使用了这个hello.c

int main() {
    return 0;
}

此资源文件hello.rc

1 Manifest "hello.exe.manifest"

此清单文件hello.exe.manifest

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
    <assemblyIdentity version="1.0.0.0" processorArchitecture="X86" name="hello" type="win32"/> 
    <description>Hello World</description> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
        <security>
            <requestedPrivileges>
                <requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
            </requestedPrivileges>
        </security>
    </trustInfo>
</assembly>

我使用:

编译我的资源文件
i586-mingw32msvc-windres hello.rc hello.o

我用:

编译我的最终申请
i586-mingw32msvc-gcc -O3 -Os -s -o hello.exe hello.c hello.o

SigCheck未显示运行sigcheck -m hello.exe的清单文件。

现在,当我在Windows下运行我的应用程序时,它不会触发UAC(=不以管理员身份运行),而当我在同一文件夹中附加hello.exe.manifest文件时,它会触发UAC(如预期的那样)。

我错过了什么?

EDIT1:Resource Hacker我打开了一个用NSIS创建的Setup.exe文件,唯一合理的区别是写了Manifest MANIFEST中的hello.exeManifest中的Setup.exehello.rc中的Manifest。 O_O

NSIS Installer vs hello.exe

EDIT2:我已经使用Resource Hacker手动更改了hello.exe组:

Modified with Resource Hacker

现在i586-mingw32msvc-windres通常会触发UAC警报并以管理员身份运行。似乎是{{1}}的“错误”。 : - )

2 个答案:

答案 0 :(得分:2)

关于神奇伏都教数字1和24:

1 24 "hello.exe.manifest"

这一行转化为这样的事情:

ID_MANIFEST RT_MANIFEST "hello.exe.manifest"

其中定义如下定义:

#define ID_MANIFEST 1
#ifndef RT_MANIFEST
#define RT_MANIFEST MAKEINTRESOURCE(24)
#endif

如上所示,条件包装器可能已经定义了 RT_MANIFEST ,如果你在Google上搜索 RT_MANIFEST 术语,你会发现很多点击量更多有关正在发生的事情的详细信息。

答案 1 :(得分:1)

有了一些强烈的伏都教,我在hello.rc文件中使用了它:

1 24 "hello.exe.manifest"

甚至无法搜索以了解24的用途(资源类型清单?!)..: - )