从Windows服务安装/更新驱动程序



要安装驱动程序,通常发送以下命令:

DefaultInstall 128 {inf path}

到InstallHinfSection通过直接调用或RunDLL。

这工作得很好。我可以在任何地方安装我的驱动程序(包括64位的Win 2008 R2,这意味着我也得到了所有代码签名的权利)。

然而,当从Windows服务启动时,上述操作失败。我读过关于服务与客户端安装的文章,并希望我已经满足了静默服务安装的所有要求(构建了一个. cat文件,它与驱动程序一起签名,等等)。

但是没有骰子-它只是失败。比较交互式安装和从服务安装的SetupAPI.log中的错误并没有显示出任何差异(除了交互式执行复制驱动程序文件的步骤并成功,而另一个没有)。

驱动程序本身没有被使用(我的服务是唯一使用它的)。有没有一种方法可以让服务在不需要用户交互的情况下默默地更新驱动程序?

我打电话给微软,和一位技术支持工程师讨论了这个问题。

结果是,使用DefaultInstall与InstallHinfSection有些过时,但仍然有效。如果驱动程序是由用户识别的证书签名的,因为DefaultInstall是"哑的",所以它恰好可以工作,而不会提示用户。然而,驱动程序本身仍然可以启动,因为它与微软证书交叉签名。我想这是一个不错的小漏洞。诀窍是它必须由一个设置为"与桌面交互"的服务安装(这是一个要求)。如果你的服务目前没有以这种方式运行,使用PsExec或RemCom是一种方法。

将来,这可能无法继续工作。在这一点上,得到驱动程序的。cat文件到WindowsSystem32Catroot{F7…文件夹,但不能直接复制进去——有一个API。

如果把。cat放在前面,那么驱动程序理论上不需要提示询问驱动程序的证书是否为用户所接受,因为catroot是"用户可接受的"证书和驱动程序列表。

此外,在尝试安装驱动程序之前安装目录文件可能会有所帮助,因为目录包含驱动程序将提供的安全证书(尽管在这种情况下不一定是这样-但它可能在将来(可能是win2003)有帮助

基本上,支持工程师很惊讶这能起作用,我们一直在研究它是如何工作的…

最新更新