群集中某些打印机的驱动无法复制到特定节点上
在将群集中的打印服务从一个节点转移到另一个节点上后,可能会发现某些队列在新节点上虽然可以显示,但是对应打印机的驱动却丢失了。重复在节点之间转移打印服务也不能将这些打印机的驱动复制到那个特定的节点上。
本文将讨论此类问题发生的原因,并分析碰到此类问题时可以采取的一些基本排错步骤。
注意: 在您将本文提到的步骤或方法应用到您的实际环境中之前,请先使用Print Migrator Tool备份当前的所有设置。
当我们建立群集并在群集节点上安装打印机驱动时,安装进程会将打印机驱动程序文件复制到共享文件夹\\虚拟服务器\print$ 上, 打印机驱动程序同时会被复制到群集内 当前拥有此打印群集资源的节点上的本地文件夹: %SystemRoot%\System32\Spool\Drivers\<后台打印程序 GUID>\Drivers 。驱动程序还会被复制到共享磁盘的 \PrinterDrivers 文件夹中。
群集中打印机驱动信息存放在注册表键HKLM\CLUSTER\Resources\<Cluster Resource GUID>\Parameters\Environments\<Windows X86 or Windows X64>\Drivers\Version-3\<Printer driver name> 下,该打印驱动信息对应的是群集打印队列中关联打印机当前的最新打印驱动程序信息。同时在群集中各个节点本地,也维护着打印机驱动信息,对应打印驱动的文件,如上段提到,存放在文件夹SystemRoot%\System32\Spool\Drivers\<后台打印程序 GUID>\Drivers下,对应这些打印机驱动的信息,存放在节点注册表键HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Cluster\<Cluster Resource GUID>\ <Windows X86 or Windows X64>\Drivers\Version-3\<Printer driver name>下。在将打印群集资源转移到其他节点的过程中,目标节点的Spoolsv.exe针对各个打印驱动,首先会检查上面提到的两个注册表键下的各个子健,其中包括键值Timestamp,如果HKLM\CLUSTER\Resources\<Cluster Resource GUID>\Parameters\Environments\<Windows X86 or Windows X64>\Drivers\Version-3\<Printer driver name> 下的Timestamp比HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Cluster\<Cluster Resource GUID>\ <Windows X86 or Windows X64>\Drivers\Version-3\<Printer driver name>下的要新,或者目标节点上根本不存在HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Cluster\<Cluster Resource GUID>\ <Windows X86 or Windows X64>\Drivers\Version-3\<Print Driver Name>这个键值,则表明该打印机驱动是打印服务处于其他节点上时发生了更新,或者是新安装上去的,spoolsv.exe此时需要将打印机驱动文件从共享文件夹处拷贝到该节点的本地文件夹下。
根据上述有关打印驱动复制的信息,我们可以得出结论:存放在群集节点本地的打印驱动程序文件,和在键值HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Cluster\<Cluster Resource GUID>\ <Windows X86 or Windows X64>\Drivers\Version-3\<Printer driver name>下的信息,需要保持严格一致。如果因为某种原因,群集中某个节点的打印驱动程序实际信息和该打印驱动对应的键值不一致,就可能导致驱动程序在打印群集资源转移时复制不正常。
所以,当您发现群集中某个节点的某些打印驱动程序无法正常复制,请首先检查如下信息:
- 节点上的注册表键值HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Cluster\<Cluster Resource GUID>\ <Windows X86 or Windows X64>\Drivers\Version-3\<Printer driver name>
- 同一节点,通过打印管理程序检查相应的打印机驱动程序是否存在,以及对应的版本信息。
- 检查本节点和群集节点上的注册表键值注册表键HKLM\CLUSTER\Resources\<Cluster Resource GUID>\Parameters\Environments\<Windows X86 or Windows X64>\Drivers\Version-3\<Printer driver name>。
如果您在检查上述信息时,发现对应节点上,注册表键值中有关驱动程序的信息和该节点本地实际存在的驱动程序不符,或者本地注册表键值中有关该驱动程序子健下的键值TimeStamp比HKLM\CLUSTER\Resources\<Cluster Resource GUID>\Parameters\Environments\<Windows X86 or Windows X64>\Drivers\Version-3\<Printer driver name>下的TimeStamp要新,则表示该节点上,有关该驱动程序的相关注册表键值已经损坏或无效。
解决此问题,可以首先备份HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Cluster\<Cluster Resource GUID>\ <Windows X86 or Windows X64>\Drivers\Version-3\<Printer driver name>键,之后将该键删除,并将群集打印资源再次转移到该节点上。
如果上述信息依然无法帮助我们解决该问题,我们可以在复现问题时,收集如下信息:
- 1. Netmon(download link https://www.microsoft.com/en-us/download/details.aspx?id=4865)
- 2. Procmon(download link: https://technet.microsoft.com/en-us/sysinternals/bb896645.aspx)
在其中您可以看到在打印资源转移过程中,目标节点的Clussvc.exe 和Spoolsv.exe进程会访问相关的注册表键值,如下所示:
8:30:11.8554361 AM clussvc.exe 2088 RegOpenKey HKLM\CLUSTER\Resources\<Cluster GUID>\Parameters\Environments\<Platform type>\Drivers\Version-3\<Driver name>\ SUCCESS
8:30:11.8554772 AM clussvc.exe 2088 RegQueryValue HKLM\CLUSTER\Resources\<Cluster GUID>\Parameters\Environments\<Platform type>\Drivers\Version-3\<Driver name>\TimeStamp SUCCESS Type: REG_BINARY, Length: 16, Data: DC 07 04 00 04 00 13 00 0A 00 16 00 1C 00 D8 00
8:30:11.8555134 AM clussvc.exe 2088 HKLM\CLUSTER\Resources\<Cluster GUID>\Parameters\Environments\<Platform type>\Drivers\Version-3\<Driver name>\ SUCCESS
8:30:11.8556160 AM spoolsv.exe 1284 RegCreateKey HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Cluster\<Cluster GUID>\<Platform type>\Version-3\<Driver Name> SUCCESS
8:30:11.8556308 AM spoolsv.exe 1284 RegQueryValue HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Cluster\<Cluster GUID>\<Platform type>\Version-3\<Driver Name>\TimeStamp SUCCESS Type: REG_BINARY, Length: 16, Data: DC 07 04 00 04 00 13 00 09 00 1F 00 27 00 A7 03
8:30:11.8556902 AM spoolsv.exe 1284 RegCloseKey HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Cluster\<Cluster GUID>\<Platform type>\Version-3\<Driver Name> SUCCESS
如果复制问题是由于网络失败,而非节点的注册表信息不正确所引起,在Netmon中,可以看到节点尝试访问对应文件夹失败的网络包。