嵌入清单文件以使用 mingw32 要求管理员执行级别
Embed manifest file to require administrator execution level with 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 不显示清单文件 运行ning sigcheck -m hello.exe
.
现在,当我 运行 我的应用程序在 Windows 下时,它不会触发 UAC(=不会 运行 作为管理员),而当我附加 hello.exe.manifest
文件时在同一个文件夹中它确实触发了 UAC(如预期的那样)。
我错过了什么?
EDIT1: Playing with Resource Hacker 我打开了一个用 NSIS 创建的 Setup.exe
文件,唯一明显的区别是 Manifest
在我的 hello.exe
中写成 MANIFEST
,在 Setup.exe
中写成 Manifest
,尽管在 hello.rc
中写成 Manifest。 O_o
EDIT2: 我用 Resource Hacker 手动更改了 Manifest
组:
现在 hello.exe
正在正常触发 UAC 警报并 运行 以管理员身份运行。看起来像 "bug" 和 i586-mingw32msvc-windres
。 :-)
借助一些强烈的巫术,我可以在我的 hello.rc
文件中使用它:
1 24 "hello.exe.manifest"
甚至不会搜索以了解 24 的用途(资源类型清单?!)..:-)
关于魔术数字 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 术语,您会发现很多点击率,其中包含有关正在发生的事情的更多详细信息。
我正在 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 不显示清单文件 运行ning sigcheck -m hello.exe
.
现在,当我 运行 我的应用程序在 Windows 下时,它不会触发 UAC(=不会 运行 作为管理员),而当我附加 hello.exe.manifest
文件时在同一个文件夹中它确实触发了 UAC(如预期的那样)。
我错过了什么?
EDIT1: Playing with Resource Hacker 我打开了一个用 NSIS 创建的 Setup.exe
文件,唯一明显的区别是 Manifest
在我的 hello.exe
中写成 MANIFEST
,在 Setup.exe
中写成 Manifest
,尽管在 hello.rc
中写成 Manifest。 O_o
EDIT2: 我用 Resource Hacker 手动更改了 Manifest
组:
现在 hello.exe
正在正常触发 UAC 警报并 运行 以管理员身份运行。看起来像 "bug" 和 i586-mingw32msvc-windres
。 :-)
借助一些强烈的巫术,我可以在我的 hello.rc
文件中使用它:
1 24 "hello.exe.manifest"
甚至不会搜索以了解 24 的用途(资源类型清单?!)..:-)
关于魔术数字 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 术语,您会发现很多点击率,其中包含有关正在发生的事情的更多详细信息。