在基于 Windows 的服务器上安装 Service Pack、更新汇总或打印机修补程序后,用户无法打印

本文帮助解决在服务器上安装 Service Pack 或打印机修补程序后无法打印的问题。

适用于: Windows Server 2012 R2
原始 KB 编号: 832219

症状

在 Windows Server 上安装 Service Pack、更新汇总或更新 Unidrvui.dll 文件的修补程序后,用户可能会遇到以下两种症状:

  • 当客户端或服务器尝试打印时,打印后台处理程序服务似乎停止响应 (或“挂起”) ,并显示以下错误消息:

    无法创建打印作业。

  • 尝试从服务器控制台打印测试页时,会收到以下错误消息:

    测试页无法打印。

  • 当你尝试使用设备和打印机或打印管理控制台安装驱动程序时,“添加驱动程序”或“添加打印机”向导停止响应。

原因

如果在具有许多基于 Unidrv 的打印机控制语言 (PCL) 打印机驱动程序的服务器上安装 Service Pack 或修补程序包,则可能会出现此行为。

在使用许多基于 Unidrv 的 PCL 打印机驱动程序的服务器上安装更新 Unidrvui.dll 的 Service Pack 或修补程序文件时,服务器可能需要花费很长时间 (长达 2 小时,) 重新生成用于提高这些驱动程序的后台处理程序效率的已分析二进制打印机说明文件 (.bud 文件) 。 在此期间,打印后台处理程序无法接收传入的打印作业,并且可能会将消息返回到指示打印队列已满的客户端。 这是一次性分析操作,在成功重新生成已分析的二进制 .bud 文件后不会发生。

必须重新生成从通用打印机说明 (GPD) 文件的二进制 .bud 文件,因为 GPD 分析器文件版本已更改。 分析所有基于 Unidrv 的 PCL 驱动程序后,后台处理程序可以再次接收打印作业。 因此,Microsoft 建议在具有许多基于 Unidrv 的 PCL 打印机驱动程序的服务器上计划 Service Pack 和修补程序安装,以适应此长达两小时的 .bud 文件编译。

解决方案

若要解决此问题,请安排足够的时间让服务器为每个升级的驱动程序文件完成所有基于 Unidrv 的打印机驱动程序进行分析,然后为使用这些文件的每个打印机安排足够的时间。

解决方法

重要

此部分(或称方法或任务)介绍了修改注册表的步骤。 但是,注册表修改不当可能会出现严重问题。 因此,请务必严格按照这些步骤操作。 为了加强保护,应先备份注册表,再进行修改。 如果出现问题,可以还原注册表。 有关如何备份和还原注册表的详细信息,请参阅如何备份和还原 Windows 中的注册表

如果无法等待服务器完成所有基于 Unidrv 的打印机驱动程序分析,请手动删除所有缓存的二进制打印机说明文件 (.bud 文件) ,然后自动重新创建它们。 根据服务器的速度,此自动重新创建可能在较短时间内完成。 通常,此操作在 30 分钟内完成。

注意

当 Print Spooler 启动时,它将安装较新版本的 Unidrv.dll。 因此,.bud 文件已过期。 .bud 文件是 .ppd 文件的编译版本,可以从这些 .ppd 文件完全重新生成。 因此,可以删除 .bud 文件。

为此,请按照下列步骤操作:

  1. 停止打印后台处理程序服务。 为此,请从命令提示符运行以下命令:

    net stop spooler
    
  2. 搜索所有 .bud 文件,并确保它们带有当前时间和日期的标记。 文件以今天的日期显示。

  3. 删除日期和时间戳早于今天日期的所有 .bud 文件。 这些文件位于以下文件夹中:

    %SYSTEMROOT%\System32\Spool\Drivers\w32x86\3

  4. 删除以下注册表项(如果存在):
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\PostSPUpgrade

    为此,请按照下列步骤操作:

    1. 依次单击“开始”和“运行”,在“打开”框中键入“regedit”,再单击“确定”

    2. 找到,然后单击以下注册表子项:
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print

    3. 在“注册表”菜单上,单击“导出注册表文件”

    4. 在“ 文件名 ”框中,键入 printkey,然后单击“ 保存”。

      注意

      如果以后必须还原 Print 注册表项,可以通过双击保存的 Printkey.reg 文件来执行此操作。

    5. 找到,然后单击以下注册表子项(如果存在):
      HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\PostSPUpgrade

    6. “编辑 ”菜单上,单击“ 删除”,然后单击“ ”以确认删除 PostSPUpgrade 注册表项。

      注意

      重启计算机后 ,PostSPUpgrade 注册表项可能会重新出现。 如果存在尚未分析的其他 .bud 文件,则会出现此行为。 分析这些文件后,会自动删除此注册表项。

  5. 重新启动服务器。

重启服务器后,打印功能将在大约 30 分钟后可供用户使用。

更多信息

在 .NET Framework 3.0 中,unidrv.dll 文件现在包含在 XPS 打印中。 unidrv.dll 文件也可以触发此行为。