首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在可执行文件中更改清单?

如何在可执行文件中更改清单?
EN

Stack Overflow用户
提问于 2017-06-11 08:27:16
回答 2查看 6.6K关注 0票数 0

我有两个可执行文件,第一个应该运行第二个。第二种是不同类型的清单:asInvokerrequireAdministrator等。

是否可以更改可执行文件的清单?我正在C上搜索一个简单的解决方案。

我不想用不同类型的清单保存少量的可执行文件副本,也不想保留可以更改它的第三方工具。顺便说一句,这是可能的,而且这个工具是存在的:MT (清单工具)来自visual包,链接

EN

回答 2

Stack Overflow用户

发布于 2017-06-11 08:39:01

是的,您可以使用mt.exe从Win32 SDK更改清单文件。但这只是在开发或测试期间应该做的事情。您不能将此工具部署到客户的机器上,因此不能使用它来动态地更改清单。

但是这没关系,因为您不需要在运行时来回更改清单文件。可执行文件的清单文件应指定该EXE所需的最低权限。因此,如果用户可以在没有管理权限(即没有提升)的情况下运行EXE,如果这意味着应用程序运行功能有限--应用的清单应该指定“-even”。如果用户需要这些额外的功能,他们总是可以选择以管理权限运行应用程序。

当然,您也可以以编程的方式以高度启动EXE。您可以使用ShellExecuteEx,为lpVerb参数指定"runas“谓词。这将与将应用程序清单中的权限级别设置为"requireAdministrator“具有相同的效果。

从您的问题中并不完全清楚您的应用程序是如何设置的。通常,第一个EXE在其清单中设置了"asInvoker“,以便任何用户都可以运行它。它不需要管理特权就能做任何事情。但是,如果它可能需要做一些需要管理特权的事情,它会使用UAC屏蔽图标显示一些UI,然后单击它将启动第二个EXE (清单中设置了"requireAdministrator“)来执行任何需要提升的任务。第二个应用程序不需要以"asInvoker“形式发布,因为它所做的总是需要提升。您会注意到,微软的所有应用程序都是这样设置的,包括操作系统附带的部分。

票数 4
EN

Stack Overflow用户

发布于 2017-06-11 11:19:20

谢谢@RbMm的评论

后来我发现我的问题是复制。抱歉,我之前还没找到这个。

因此,解决方案(错误处理,包括省略):

代码语言:javascript
复制
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 *中。
  • 错误(例如,不正确的XML语法)可以在Event ViewerWindows Logs -> Application中跟踪。
  • 一些工具(Resource )可以打开和显示清单,但它们也显示unicode清单而没有错误。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44481825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档