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

标签 windows service windows-services installation driver

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

默认安装 128 {inf 路径}

通过直接调用或 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 是“用户可接受”的证书列表,并且驱动程序。

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

基本上,支持工程师对它的工作原理感到惊讶,我们反复研究它如何工作......希望这对其他人有帮助。

关于windows - 从 Windows 服务安装/更新驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7958760/

相关文章:

c# - C#Windows服务-在哪里可以找到好的教程?

c# - Windows 服务/无法为堆栈创建新的保护页

windows - 在 Windows 上设置 postgres 用户密码

c# - 当类在服务项目中时,最小起订量在不可覆盖的成员上抛出无效设置

javascript - 在 JS 中继续 ALLWAYS Illegal in switch 但 break 工作正常

service - 在服务的当前 Activity 中显示 toast

java - 在服务接收器中使用什么来实例化对象的正确上下文是什么?

c# - 从控制台应用程序创建 Windows 服务

java - 无法在数据库中保存日期(月/日/年)

windows - boot2docker bash 命令行很慢