【问题标题】:Install/update driver from Windows service从 Windows 服务安装/更新驱动程序
【发布时间】:2011-12-19 00:21:24
【问题描述】:

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

DefaultInstall 128 {inf 路径}

通过直接调用或 RunDLL 到 InstallHinfSection。

这非常有效。我可以在任何地方安装我的驱动程序(包括 64 位 Win 2008 R2,这意味着我也获得了所有代码签名)。

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

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

驱动程序本身未使用(我的服务是唯一使用它的服务)。有什么方法可以让服务静默更新驱动程序而无需用户交互?

【问题讨论】:

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

标签: windows service windows-services installation driver


【解决方案1】:

我打电话给微软并与支持工程师讨论了这个问题。

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

将来,这可能不会继续有效。此时,将驱动程序的 .cat 文件放入 Windows\System32\Catroot{F7... 文件夹,但不能直接将其复制进去——有一个 API。

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

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

基本上,支持工程师对此感到惊讶,我们四处寻找它的工作原理......希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    相关资源
    最近更新 更多