【问题标题】:How to prevent embedded manifest from being used?如何防止使用嵌入式清单?
【发布时间】:2013-09-19 19:56:20
【问题描述】:

我正在开发许多使用 RegFree COM 激活的应用程序,除了其中一个应用程序是使用使用 JIT 类型编译器的旧技术运行之外,一切都运行良好。

为了让 RegFree COM 正常工作,我必须为启动的可执行文件提供一个清单(如果我错了,请纠正我)并列出我的依赖项。我所有的其他应用程序都是内部构建的,我可以完全控制我的清单(创作,如果我嵌入它,如果我将它并排放置,等等)。但是这个 JIT 编译器(ala Java JRE)不是我的,它已经包含(嵌入)一个清单。

我已经提取了清单(使用带有 -inputresource 和 -outfile 的 MT),对其进行了修改并重新嵌入。它按预期工作。但是,由于对这个可执行文件没有所有权,我担心这种操作的合法性(修改第三方的可执行文件并重新分发它!)并希望避免这样做。 另外,我担心在某些时候这个可执行文件可能会被第三方签名,因此修改嵌入式清单会破坏签名。

有没有办法让 sxs-loader 先寻找另一个清单?似乎如果它找到一个嵌入的,它默认采用它(在大多数情况下这很好)。 我可以提供一个配置文件或任何可以跳过嵌入式清单并使用我并排提供的文件(myExe.exe.manifest,而不是 myExe.exe 中的 RT_MANIFEST 资源)吗?

【问题讨论】:

    标签: manifest side-by-side regfreecom winsxs


    【解决方案1】:

    据我所知,您只能在整个系统范围内进行操作。将其添加到注册表中:

    [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide]
    "PreferExternalManifest"=dword:00000001
    

    通过更新可执行文件的最后修改日期确保trip activation context cache,否则您的清单更改将不会被拾取(重命名和重命名它似乎有效)。

    在 Win XP 上,外部清单优先于内部清单,但自 Windows server 2003 Service Pack 1 起,他们将其更改为相反。

    【讨论】:

    • 优秀的答案!谢谢!系统范围可能有点多,但至少我知道现在有可能并且这个选项存在!感谢您添加有关上下文缓存的详细信息。我已经读过它总是确保触发它(在我的情况下通过重命名文件),触摸方法非常好,我会使用它。也很高兴知道 Win2k3/Vista 改变了行为!
    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多