要安装驱动程序,您通常会发送以下命令:
DefaultInstall 128 {inf path}
通过直接调用或 RunDLL 到 InstallHinfSection。
这非常有效。我可以在任何地方安装我的驱动程序(包括 64 位 Win 2008 R2,这意味着我也有所有的代码签名)。
但是,从 Windows 服务启动时,上述操作失败。我已经阅读了有关服务与客户端安装的内容,并希望我已经满足了静默服务安装的所有要求(构建了一个 .CAT 文件,它与驱动程序一起签名等)。
但是没有骰子 - 它只是失败了。比较交互式安装和从服务安装之间的 SetupAPI.log 中的错误没有显示任何差异(除了交互式采取复制驱动程序文件的步骤并成功,而另一个没有)。
驱动程序本身未使用(我的服务是唯一使用它的服务)。有没有什么方法可以让服务在不需要用户交互的情况下静默更新驱动程序?
最佳答案
我调用 Microsoft 并与支持工程师讨论了这个问题。
事实证明,使用 DefaultInstall 和 InstallHinfSection 有点过时了,但仍然有效。如果驱动程序是由他们识别的证书签名的,它恰好可以在不提示用户的情况下工作,因为 DefaultInstall 是“愚蠢的”。然而,驱动程序本身仍然允许启动,因为它与 Microsoft 证书交叉签名。我猜是一个不错的小漏洞。诀窍是它必须由设置为与桌面交互(要求)的服务安装。如果您的服务当前未以这种方式运行,则使用 PsExec 或 RemCom 之类的东西是一种方法。
将来,这可能不会继续起作用。那时,将驱动程序的 .cat 文件放入 Windows\System32\Catroot{F7... 文件夹,但不能直接复制进去——有一个 API。
如果首先放入 .cat,那么驱动程序理论上不需要提示询问用户是否可以接受该驱动程序的证书,因为 catroot 是“用户可接受”的证书和驱动程序列表。
此外,在尝试安装驱动程序之前安装目录文件可能会有所帮助,因为目录包含驱动程序将提供的安全证书(尽管在这种情况下不一定 - 但它可能在 future 有所帮助(可能在 Win 2003 中)
基本上支持工程师很惊讶这一切都有效,我们四处寻找它可能如何工作......希望这对其他人有所帮助。
关于windows - 从 Windows 服务安装/更新驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7958760/