如何使用 heat.exe(或类似的)从 Windows 服务获取 COM 注册?

How can I use heat.exe (or similar) to harvest COM registration from a Windows Service?

如何使用 heat.exe(或类似的)从 Windows 服务获取 COM 注册?

多年来,我一直在使用 heat.exe(或者实际上是通过 Wix 使用 DllHarvester class)在 Windows 2003 服务器上收集安装包的 COM 和 .Net 注册。由于 IT 部门的要求,我现在被迫升级服务器并切换到 "modern" OS(即 2012R2)。但是在将所有内容迁移到新的 OS 之后,我开始丢失大约 1/3 的所有注册信息。追踪它表明它与一些较旧的第 3 方 COM 文件有关。

进一步的跟踪似乎表明,当使用提升的进程从交互式用户帐户(登录到桌面)运行 时,收获工作正常。但是 运行 将其从服务中删除(我正在使用 CruiseControl.Net 构建服务器 运行 使用管理员组中的用户帐户将其作为服务)。

使用 Task Scheduler 进一步试验我发现 "Running when the user is logged on" 有效,但 "Running whether or not user is logged on" 无效。

我试图获得一个 LogonUser/CreateProcessAsUser 重新启动器,但它非常复杂,我无法让它工作。

我想 运行宁作为登录用户会创建一个不同的注册表视图,但我真的不知道为什么这会影响 COM 注册?

有什么方法可以在现代 OS(最好是 W2k12R2)上从服务中获取数据?

使用来自 sysinternals 的 psexec 调用收集器

psexec -h ...

在你自己的机器上。