使用 DISM Api 在 Windows PE 环境中以编程方式捕获图像

问题描述

我一直在研究 dism API 的 windows documentation,目的是用 C++(或任何可以实现这一点的语言)编写一个可以在 Windows PE 中运行时创建 WIM 映像的 exe。我发现了一个用于 dism API 的 .NET Wrapper,它似乎对这个目的很有用,但我不确定 .NET 应用程序是否能在 Windows PE 中成功运行。总的来说,我的问题是我没有看到一个可以创建——而不是简单地修改——一个 wim 文件函数

如果我不关心将它封装在 .exe 文件中,Dism documentation 确实显示了如何最初创建 wim——这让我很好奇为什么 api 中不存在类似的函数。请告知最简单的解决方案是否是让我的代码代码调用诸如 system() 之类的函数

总而言之,我正在寻找一种在 Windows PE 中以编程方式(通过执行 exe 文件调用)创建 wim 文件方法

一如既往,感谢您的帮助和建议。

解决方法

我参与了一个在 WinPE 中与 DISM 配合使用的项目。我们将所有 .net 包的 WinPE 配置为 described here。然后可以将 WinPE 配置为 start an application

我使用 c#,但您可以在 c++ 中执行托管应用程序,我相信您知道。我发现将 c# 代码放入 WinPE 中要容易得多,但这更多是我的经验,我想。

我们用来与 DISM 交互的主要方式是使用 System.Diagnostics.Process 运行命令。该进程在单独的线程中运行,但 API 很简单,您可以等待(和/或超时)您的进程以进行同步。这仅使用 DISM 命令行界面,但如果您已将该包添加到 WinPE 映像,您也可以使用 powershell cmdlet。从您的应用程序到 DISM,它可能看起来像是一个骇人听闻的“界面”,但它工作可靠,并且您可以防止进程窗口显示在屏幕上。这为运行大量 Windows 映像实用程序(例如 DISKPART、DISM 和 BCDEDIT)提供了一个不错的异步平台。

捕捉新图像的主要方式是使用 DISM /Capture-Image。听起来你已经发现了这个事实。很多选项都超出了本问答的范围,但我希望这能让您走上有用的道路。