我有两个可执行文件,第一个应该运行第二个。第二个包含不同类型的清单:asInvoker
,requireAdministrator
等
是否可以更改可执行文件的清单?我正在C
上搜索一个简单的解决方案
我不想保留几个可执行文件的副本与不同类型的清单,而不是保留可以改变它的第三方工具。顺便说一下,有可能并且这个工具存在:来自visual studio包的MT
(清单工具),link。
答案 0 :(得分:3)
是的,您可以使用Win32 SDK中的mt.exe
更改清单文件。但这只是 在开发或测试期间应该做的事情。您无法将此工具部署到客户的计算机上,因此您无法使用它来来回动态地更改清单。
但是没关系,因为您不需要在运行时来回更改清单文件。可执行文件的清单文件应指定该EXE的最低要求权限。因此,如果用户可以在没有管理权限的情况下运行EXE(即,没有提升) - 即使这意味着应用程序以有限的功能运行 - 应用程序的清单应指定" asInvoker&#34 ;.如果用户需要这些额外功能,用户始终可以选择使用管理权限运行应用程序。
当然,您可以通过编程方式启动EXE。您可以使用ShellExecuteEx
执行此操作,指定" runas" lpVerb
参数的动词。这与将应用程序的清单中的权限级别设置为" requireAdministrator"具有相同的效果。
您的问题如何设置应用程序并不完全清楚。通常情况下,第一个EXE有" asInvoker"在其清单中设置,以便任何用户都可以运行它。它不需要管理权限就可以做任何事情。但是,如果 某些东西它可能需要执行它需要管理权限,它会显示一些带有UAC盾牌图标的UI,然后单击它将启动第二个EXE(使用" requireAdministrator"在其清单中设置,执行任何需要提升的任务。第二个应用程序不需要在" asInvoker"中分发。形式因为它所做的总是需要提升。您会注意到这就是所有Microsoft应用程序的设置方式,包括操作系统附带的软件。
答案 1 :(得分:-1)
感谢@RbMm的comment 后来我发现我的问题是duplicate。对不起,我早些时候没有发现这个。
所以,解决方案(错误处理和包含省略):
HANDLE handle = BeginUpdateResourceW(file, TRUE);
UpdateResourceW(handle, RT_MANIFEST, CREATEPROCESS_MANIFEST_RESOURCE_ID, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), manifest, strlen(manifest));
EndUpdateResourceW(handle, FALSE);
进一步发展的注意事项:
short chars
- char *
而不是wchar *
Event Viewer
,Windows Logs -> Application
部分