目前,我们所有的网络打印机都通过单个 Windows 服务器进行传输。然后通过组策略将打印机部署到桌面。
但是,如果这台服务器发生故障,那么所有联网的打印机都会“噗”地一声,没有人可以打印。显然,某种基于 AD 的复制会很棒——拥有“热备用”是可以的,但没有简单的方法可以重新定向打印作业:除非我们将两台打印机都添加到客户端,但那很烦人,“我应该使用哪台打印机,‘服务器 1 上的主打印机’还是‘服务器 2 上的主打印机’?”。出于这个原因,我想避免最终用户的解决方法,并希望在某个上游处理它。
有什么想法吗?
答案1
我一直在思考这个问题,并考虑以下问题:
- 设置专用的虚拟机仅用于打印服务
- 克隆此虚拟机并挂起(不要关闭)
- 将克隆复制到备份 VM 服务器
这可以解决 VM OS 故障以及 VM 服务器上的硬件故障问题(因为我们还没有更复杂的方法处理故障转移)。当挂起的 VM 上线时,恢复将花费不到 15 秒的时间,如果我最终安装 Nagios 或类似程序,则可能会编写脚本...
“暖”待机,没有客户端重复。我想不出有什么大问题,但这给了我一个机会来提出这个理论,看看是否有人能找到它们。
答案2
完全是过度杀伤,但这是针对您的问题的最佳实践解决方案!
答案3
从这里:
“我能想到三种方法。第一种(聚类),除了最大的网络外,我们可以出于成本原因不采用。
第二种方法是使用 Windows Server 2003 的网络负载平衡 (NLB) 功能。Microsoft 不建议将此功能用于打印服务,因为您没有共享存储,并且如果服务器发生故障,打印队列将丢失。但是,我认为对于很多人来说,如果打印服务器发生故障时发生的最糟糕的事情是某些用户必须再次单击“文件 | 打印”,那也不会造成太大的创伤。我已经在实验室环境中测试过此功能,它对我来说似乎运行正常。
第三种方法是将第二台打印服务器作为备用机器。禁用严格名称检查,如下文所述。
连接到基于 Windows 2000 的计算机或基于 Windows Server 2003 的计算机上的 SMB 共享可能无法使用别名 http://support.microsoft.com/default.aspx?scid=kb;en-us;281308
然后,将所有机器指向您创建的 DNS 别名。最初,此别名指向主打印服务器。定期使用 Microsoft 的 PrintMig 实用程序备份主打印服务器并恢复到备用服务器。当主打印服务器发生故障时,将别名重新指向备用服务器。
最糟糕的情况是,用户可能必须重新启动(或者以其他方式清除其 DNS 缓存),但这比没有备份和计划的打印服务器出现故障要好得多。”
答案4
这是一个比我之前两个建议更明智的选择。
这是我们用来将用户从打印服务器迁移到打印服务器的脚本。它还将保留他们的默认打印机选择。
如果最坏的情况发生,您可以从现有的登录脚本中调用此脚本,然后要求用户重新启动机器/注销并登录。
当然,您需要首先启动并运行备份打印服务器,并且您需要确保新服务器上的所有打印队列都已准备就绪,并具有相同的打印队列名称。
这里是:
Option Explicit
'On Error Resume Next'
MigratePrint "\\svr-print-01.yourdomain.loc", "\\svr-print-02.yourdomain.loc"
Function MigratePrint(strOldServer, strNewServer)
Dim strComputer
Dim strShareName
Dim objWMIService
Dim objPrinter
Dim objItem
Dim colItems
Dim WshNetwork
Dim objshell
strComputer = "."
Set WshNetwork = WScript.CreateObject("WScript.Network")
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_Printer",,48)
For Each objItem in colItems
If objItem.ServerName = strOldServer Then
If objItem.Default = "True" Then
strShareName = objItem.ShareName
End If
WshNetwork.RemovePrinterConnection objItem.ServerName & "\" & objItem.ShareName, True, True
WshNetwork.AddWindowsPrinterConnection strNewServer & "\" & objItem.Sharename
End If
Next
Set objPrinter = CreateObject("WScript.Network")
objPrinter.SetDefaultPrinter (strNewServer & "\" & strShareName)
End Function