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

从Windows服务安装/更新驱动程序,windows,service,windows-services,installation,driver,Windows,Service,Windows Services,Installation,Driver,要安装驱动程序,通常需要发送以下命令: DefaultInstall 128{inf path} 通过直接调用或RunDLL连接到InstallHinfSection 这真是太棒了。我可以在任何地方安装我的驱动程序(包括64位Win2008R2,这意味着我也拥有所有正确的代码签名) 但是,当从Windows服务启动时,上述操作失败。我已经读过服务与客户端安装的相关内容,希望我已经满足了静默服务安装的所有要求(构建了一个.CAT文件,并与驱动程序一起签名,等等) 但是没有骰子,它只是失败了。将Se

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

DefaultInstall 128{inf path}

通过直接调用或RunDLL连接到InstallHinfSection

这真是太棒了。我可以在任何地方安装我的驱动程序(包括64位Win2008R2,这意味着我也拥有所有正确的代码签名)

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

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


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

我打电话给Microsoft,与支持工程师讨论了这个问题

事实证明,将DefaultInstall与InstallHinfSection一起使用有些过时,但仍然有效。如果驱动程序是由用户识别的证书签名的,因为DefaultInstall是“哑”的,那么它恰好可以在不提示用户的情况下工作。但驱动程序本身仍然可以启动,因为它与微软证书交叉签名。我想这是一个很好的小循环孔。诀窍在于,它必须由设置为与桌面交互的服务安装(这是一项要求)。如果您的服务当前没有以PsExec或RemCom的方式运行,那么可以使用PsExec或RemCom之类的工具

在未来,这可能不会继续起作用。此时,将驱动程序的.cat文件放入Windows\System32\Catroot{F7…文件夹中,但它不能直接复制到中--这是一个API

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

此外,在尝试安装驱动程序之前安装目录文件可能会有所帮助,因为目录包含驱动程序将提供的安全证书(虽然在本例中不一定如此,但在将来可能会有所帮助(可能在Win 2003中)


基本上,支持工程师对此感到惊讶,我们一直在研究它的工作原理……希望这对其他人有所帮助。

我们在服务中也做了同样的事情,而且效果很好;这是直接调用API,而不是通过RundL32。真的吗?我尝试过启动RundL32并使用相同的资源调用APIults.您运行的是什么操作系统?安装的是什么类型的驱动程序?实际上,我们都在使用这两种方法。在32位机器上,我们直接调用API;在64位机器上,我们通过rundll32调用API(我们有一个32位安装程序)。这是用于Vista及更高版本的文件系统迷你过滤器。我的安装程序一切正常(当用户运行时)。但如果运行的服务在后台以静默方式启动安装程序以更新自身(即以非交互式服务运行,在不同的状态下),则情况并非如此。您这样做了吗?它可以工作吗?我们的驱动程序是在作为LocalSystem运行的服务的上下文中按需安装的;它本身不是安装程序。可能这就是问题所在。我们有一个DLL,它公开一个Start()函数。该函数是从作为LocalSystem运行的服务调用的。如果没有安装驱动程序,则Start()函数函数将通过InstallHinfSection()API安装它。