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

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

DefaultInstall 128 {inf path}

通过直接调用或RunDLL到InstallHinfSection。

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

但是,从Windows服务启动上述失败。 我已经阅读了关于服务和客户端的安装,并希望我已经满足了静默服务安装的所有要求(构build.CAT文件,它与驱动程序一起签名等)。

但没有骰子 – 它只是失败。 在交互式安装和服务安装之间比较SetupAPI.log中的错误不会显示任何差异(除了交互式执行复制驱动程序文件和成功的步骤,其他则不成功)。

驱动程序本身没有被使用(我的服务是唯一使用它的)。 有没有办法让服务静默地更新驱动程序,而不需要用户的交互?

我打电话给微软,并与一位支持工程师进行了讨论

事实证明,使用DefaultInstall和InstallHinfSection有点过时,但仍然有效。 如果驱动程序是由他们认可的证书签名的,因为DefaultInstall是“哑”,所以恰好在没有提示用户的情况下工作。 然而,驱动程序本身仍然被允许启动,因为它与Microsoft证书交叉签名。 我猜想一个不错的小洞。 诀窍是必须通过设置为与桌面互动(需求)的服务进行安装。 如果您的服务目前没有以这种方式运行,那么使用PsExec或RemCom之类的东西是一种方法。

将来,这可能不会继续工作。 在这一点上,获取驱动程序的.cat文件到Windows \ System32 \ Catroot {F7 …文件夹,但不能直接复制 – 有一个API。

如果.cat被放在第一位,那么理论上驱动程序不需要提示询问驱动程序的证书是否可以被用户接受,因为catroot是“用户可以接受的证书和驱动程序”列表。

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

基本上这个支持工程师对这个工作感到惊讶,我们围绕它如何工作…希望这可以帮助别人。