Windows容错打印服务器


只有备份,监视和复制所有内容后,真正的管理员才能安然入睡。 或者,当他在一个好的团队中工作时,您总是可以责备他人。
碰巧我主要在工作中使用Microsoft产品,并且可以说该公司认真备份其服务:Active Directory,Exchange DAG,SQL Always On,DFSR等。 与其他地方一样,既有非常优雅和成功的实现,也有明显的不便和困难的实现。 对于打印服务也有一个解决方案,但是它需要基于Hyper-V的群集。 我想要“开箱即用”的简单解决方案,不需要额外的资金。 Windows 2012 R2被作为基础,但是相同的方案很可能在Windows 2008以后的任何服务器版本,甚至Vista或更高版本的客户端操作系统上都不会出现问题(您好,以节省预算!)。 谁在乎-我要猫。

免责声明
为了尊重印第安人的工作,由于Habr的听众主要是俄语,并且为了使初级管理员更容易使用,因此这些示例使用了Windows版本的俄语界面。 在可能的情况下,链接也会导致俄语资源。


一点理论


任何不喜欢理论并想用鼠标和键盘更快地单击的人都可以直接进入下一部分。
如上所述,今天的官方建议是使用Hyper-V群集和虚拟化的解决方案。 同样,没有什么能确保在虚拟化系统级别(不一定是Hyper-V)上确保打印服务的容错能力,但是这种解决方案要花钱。
我确实想要类似于DHCP故障转移的功能 ,但要充当打印服务器的角色。
在互联网上,尤其是在Habr上,找不到合适的东西-我不得不自己发明它。

该段思想的实质
下面描述的解决方案基于BrintBrm实用程序,该实用程序是标准Windows 发行版的一部分, 已经取代了printmig
备用服务器在备用模式下工作,并使用此实用程序以指定的频率与主服务器同步设置。 对于客户端,在DNS中创建了一个具有较小TTL的CNAME,并引用了主服务器。 如果主服务器发生故障,管理员可以通过将客户端切换到备份服务器来更正CNAME。 实际上,仅此而已。
如果这个话题很有趣,并且我想了解已经塞满我的颠簸和绕过耙子的方法,请继续。

在开始之前,或者您需要了解有关PrintBrm的知识


那么,这个PrintBrm实用程序是什么,它的主要目的是为打印服务器提供服务?
  • 保养得好。 它具有一个称为“ 打印迁移”的GUI实施,可以从“打印管理”管理单元中启动。 GUI版本的功能较少,并且在端口移植方面存在问题。
  • 细心 默认情况下,它处理打印服务器的打印机ACL。 换句话说,如果只允许向会计 AD组成员的雇员打印到\\ printserver \ printer1打印机,则导入/导出时将考虑此限制。 或不会,如果您输入-NOACL键。 但是,无论密钥如何,都不会处理打印服务器本身的ACL。
  • 喜怒无常。 从文件导入参数时,目标服务器必须至少具有一台共享打印机,否则会出现错误。
  • 温柔 在文件路径中看不到空格。 看到引号引起这样的路径,他感到沮丧,并给出了错误0x8007007b。
  • 谦虚 如果指定的文件在尝试导出设置时已经存在,则无法覆盖它,询问时会避开并且还会出现错误。
  • 神秘的 始终返回退出代码0 。 事实证明,完美的程序。
  • 可以思考。 它可以在100%分钟的阶段冻结5次,有时甚至更多。 但是随后他考虑了一下并完成了工作(当然,除非您有耐心不要按Ctrl + C)。
  • 突然而矛盾。 可能会安排这样的惊喜
  • 聪明 可能会将源驱动程序重新分配给其他人。 例如,使用XML文件,您可以指定必须将目标服务器上已保存文件中的所有HP Universal Printing PCL 5驱动程序重新分配给HP Universal Printing PCL6。我在实践中没有使用过,但是对某些人有用。
  • 任性。 即使使用-NOACL开关,我也无法使用它在没有信任的域之间传输设置。 他可能无法做到这一点,或者我的魔力不够强。
  • 您可以在这里这里变得更好地了解,但是对于那些毫不犹豫地直接问的勇者,有一个钥匙/?


我承认我不该忽略某些功能。 也许在Windows 10/2016中,她的行为有所不同。 如果有信息,请分享。

环境准备


假定您已经部署了Active Directory,并且知道至少三种禁用Active Directory的方法,并且其中至少2种已经在实践中进行了测试。

一些歌词
与本文的主题不同,我注意到我喜欢该命令,因为每个网络打印机和MFP都有一个与其网络名称相对应的标签。 这简化了IT员工在尝试从用户那里查找特定猫照片打印机上的重要分析报告时所使用的有毒酸色调而不是精致的开心果色调的工作。 最好在打印机底部粘贴此类贴纸,以使每个人都更感兴趣,更有趣。
当每个网络打印机都在内部DNS区域中注册时,我也很喜欢。 基于Windows的DHCP服务器可以轻松地做到这一点。
例如,打印机名称可以采用msk-prn001或sale-printer023的格式,并且这些服务器在打印服务器上的端口名称将完全相同。 但这是我的个人喜好,我准备听听评论中的反对意见。

我们将假定所有打印机都已联网并且可以从主打印服务器和备用打印服务器进行打印。 让这些服务器分别称为prn-srv01prn-srv02
不低于2008的Windows Server上的域服务器适合用作打印服务器,原则上,如果您确实想省钱,也可以使用以Vista开头的客户端操作系统。 该示例使用Windows 2012 R2。 强烈建议在设置服务器和客户端计算机之前安装操作系统的所有必要更新。

您自己当然可以理解,但是上限仍然需要注意:如果打印服务器是虚拟的,则必须将它们分发到不同的物理服务器,否则我们的故障转移将简单地变成故障。

prn-srv01prn -srv02上 ,必须添加打印服务器角色。 使用PowerShell cmdlet对我来说更方便:
Install-WindowsFeature Print-Services

另外,应在打印服务器上应用注册表调整,当客户端计算机通过CNAME访问打印服务器时,该设置将更正0×00000709错误 。 您可以使用上面链接中的文章中的命令执行此操作:
reg add HKLM\SYSTEM\CurrentControlSet\Control\Print /v DnsOnWire /t REG_DWORD /d 1
应用命令后,必须重新启动打印管理器服务。
我建议您为打印服务器分配一个单独的OU,然后使用GPP分配此设置。

我们在域控制器上启动DNS管理单元并启用扩展显示:
点击


需要高级映射才能为创建的记录设置TTL。
在DNS中,创建一个CNAME 打印记录,该记录引用具有5分钟TTL值的prn-srv01
点击


点击


客户端计算机应使用该名称连接到打印服务器。 即 客户端将连接到地址\\ print \ printer01,\\ print \ printer02等。
TTL值越低,客户端更新记录的频率就越高,并且越早“了解”他们需要切换到另一台打印服务器。 5分钟对我来说足够了。
通过将该值设置得太低,您将在网络上生成DNS流量, 而通过指定一两个小时,则可以强调压力承受能力和强大的神经
使用PowerShell添加CNAME记录的另一种方法:
Import-Module DnsServer
Add-DnsServerResourceRecordCName -Name "print" -HostNameAlias "prn-srv01.lab.net" -ZoneName "lab.net" -TimeToLive 00:05:00

(当然,我们将lab.net更改为您的contoso.local或其他名称)

请记住,如果您有多个AD站点,则由于跨站点复制,因此在所有位置更新DNS记录将花费更长的时间。 您可以使用repadmin / syncall命令强制执行该过程。

使用组策略,我们允许普通用户从打印服务器安装驱动程序。 如何执行此操作在此处详细说明。

在AD中创建一个服务帐户(我将其命名为svc-printsync),并且密码的有效期限不受限制:
点击


根据PrintBrm的要求,该帐户必须在打印服务器上具有完整的权限,因此我们将其添加到admins域中,以便确保一切正常,并在description字段中写入密码,以免忘记 prn-srv01prn -srv02本地Administrators组(例如,使用“计算机管理”管理单元-in

配置第一个服务器


如果已经在主打印机上添加了所有必需的打印机,则可以立即进入配置第二台服务器的部分。

使用“打印管理”管理单元,我们将必要打印机的驱动程序添加到服务器:
点击


驱动程序安装向导启动。 这很直观,您可以自己解决。 我只会关注一点点的深度。
因为 由于Windows 2012R2仅在x64版本中可用,因此驱动程序也必须是x64。 如果具有Windows x86版本的客户端将连接到打印服务器,请不要忘记选中相应的框:
点击


某些驱动程序套件包含用于x86和x64系统的通用inf文件,而另一些则具有分隔符。

更多歌词
许多驱动程序以安装程序的形式出现,但是鉴于这些安装程序会将大量的垃圾与驱动程序放在一起,因此,我尝试遵循“必要且足够”的原则,并如上所述手动添加驱动程序。
另外,为了一致起见,我努力最大程度地使用通用版本的驱动程序(几乎所有普通的供应商都提供)。 但是有时候这可能是个问题。 因此,一旦我遇到一个HP Universal Printing PCL 6版本中的一个错误,即在RDP会话中通过EasyPrint的PDF文档从右到右从左到左打印。
您也可以考虑使用v4驱动程序


添加所有必需的驱动程序后,我们将处理端口和打印机。 您可以从同一管理单元中手动添加它们,但我建议在Excel中创建CSV文件并将其提供给PowerShell脚本。 当然,没有什么可以阻止Excel通常使用其他任何电子表格编辑器或记事本。 最主要的是,脚本中指定的分隔符和编码与CSV文件中的分隔符和编码相对应。
另请注意,CSV文件中的驱动程序名称必须与“打印管理”管理单元中指定的名称完全相同。
复制粘贴以营救



样本CSV文件



尽管我在上面写道,我喜欢所有打印机都具有统一的网络名称,但是该示例( 打印机地址字段)使用了IP地址和名称的可变信息,以防您稍后在网络中没有订单。

将此表保存为CSV格式:
点击

注意事项 尽管在“文件类型”字段中逗号表示为分隔符,但Excel还是使用分号作为分隔符。 可能会变得更加有趣和有趣。

这是脚本本身:
CreatePrintersFromCsv.ps1
 #    $InputFile = 'C:\Scripts\Printers.csv' #      CSV- $Printers = (Import-Csv $InputFile -Delimiter ";" -Encoding Default) #          ForEach ($Printer in $Printers) { #       $PrinterName = $Printer.' ' $ShareName = $Printer.'  ' $DriverName = $Printer.' ' $PrinterAddr = $Printer.' ' $Comment = $Printer.'' $Location = $Printer.'' #  Add-PrinterPort -Name $PrinterAddr -PrinterHostAddress $PrinterAddr -SNMP 1 -SNMPCommunity 'public' #  Add-Printer -Name $PrinterName -DriverName $DriverName -PortName $PrinterAddr -Comment $Comment -Location $Location #   Set-Printer -Name $PrinterName -Shared $True -Published $False -ShareName $ShareName } 


如果制表符用作CSV中的定界符,则在脚本中需要设置-Delimiter“`t”

请注意,如果脚本运行时服务器上没有打印机,则将其添加到打印服务器将花费更长的时间(2-3分钟而不是几秒钟)

脚本的结果:
点击



为确保在此阶段一切正常,请使用以前创建的CNAME将共享打印机从主打印服务器添加到任何客户端计算机上(例如\\ print \ printer01),然后尝试在其上进行打印。 为此,最适合此目的的短语“ Preved,我是一张纸”,以粗体Arial键入,尺寸为200。

配置第二台服务器


联合国艺术家协会(联合国),格兰艺术家协会(巴勃罗·毕加索)

我们的prn-srv02尚未达到gran artista的水平,因此我们将限于复制。 虽然...只要轻按手腕就可以...

我们创建并共享至少一台打印机,否则PrintBrm会出现错误。 您可以伪造产品,但不要选择错误的驱动程序或端口,这一点很重要。 例如,不能共享带有Microsoft XPS Document Writer驱动程序或FILE端口的打印机。

我们创建一个简单的同步脚本。 我更喜欢PowerShell,但没有人禁止制作热管批处理文件。

PrintSync.ps1
 #   PrintBrm $ProgramPath = 'C:\Windows\System32\Spool\Tools\PrintBrm.exe' #    $SourceServer = 'prn-srv01' $DestServer = 'prn-srv02' #,   .     , ..  PrintBrm       $ConfigFilePath = 'C:\Scripts\prn-config.printerExport' #    $Arguments = "-s $SourceServer -f $ConfigFilePath -b" Start-process $ProgramPath -ArgumentList $Arguments -Wait -PassThru #    $Arguments = "-s $DestServer -f $ConfigFilePath -r -o force" Start-process $ProgramPath -ArgumentList $Arguments -Wait -PassThru #   Del $ConfigFilePath 



我们将脚本放置在僻静的地方(在示例中为C:\ Scripts ),并在Scheduler中创建任务。
我们将使用权限最高的先前创建的svc-printsync帐户运行:
点击


确定执行频率。 足够我每天一次:
点击


在“操作”选项卡上,创建一个新的PowerShell启动操作:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
作为参数,我们使用以下参数设置脚本的路径:
C:\Scripts\PrintSync.ps1 -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass
点击


默认情况下,我们将其余任务参数保留在“ 条件”和“ 参数”选项卡上。
保存任务时,将要求svc-printsync帐户输入密码 。 你没有忘记他吗? 如果您已经忘记了(这篇文章很长),那么一切都是徒劳的,并且生活没有成功 ,请使用ADUC管理单元或以其他方便的方式对其进行重置, 并在description字段中进行指定以使其更加平静

注意事项
该作业不必在备份打印服务器上运行。 如果您有用于运行例程的单独服务器,则可以在其上创建任务。 在这种情况下, svc-printsync帐户必须有权以批处理作业的身份登录到该服务器。 默认情况下,本地组“ 备份操作员”拥有此权限,如果在您的环境中未更改此权限,则只需将服务帐户包括在将运行任务的服务器的存档操作员组中即可。


第一次,我们手动启动任务并等待其完成。
对于我的动物园来说,濒临灭绝和最近繁殖的大约50种不同类型的打印机,同步过程大约需要10分钟。 该文件同时重约1GB。
为了加快导入/导出过程,可以使用-NOBIN开关 ,该开关负责复制驱动程序。 当打印机群由相同型号组成并且所有服务器上都安装了必要的驱动程序时,这才有意义。

完成后,运行“ 事件查看器”管理单元,转到“ 应用程序和服务日志”部分,打开Microsoft \ Microsoft \ PrintBRM \ Administrator日志并分析错误和警告。 而且如果它们太多,那么我们更有可能清洁杂志,以免我们的眼睛看不到老茧。

我碰到了代码20、22、80和81。例如,
这样的


从文本可以清楚地看出,传输特定驱动程序时出现问题。 浏览日志,我们列出了有问题的驱动程序,并手动将它们放置在备份服务器上,或者将其替换为不讨厌旅行的其他驱动程序。 我只有HP,Kyocera和Konica Minolta遇到问题,其他制造商的驱动程序未发现任何错误(可能是因为它们更好,或者可能是因为我们没有)。
因此,您需要在主服务器和备份服务器上获得相同的打印机列表,并且日志中没有错误和警告。

切换至保留


在轴敲打和拨叉打磨的情况下,我们将办公室的门设为路障,然后关闭电话。 运行DNS管理单元并编辑CNAME记录,使其指向备份服务器:
点击


片刻之后(您在其中输入了TTL的什么?), 危险的叫声将平息,客户端计算机将切换到prn-srv02, 并且可以打开电话门

回来啦


如果在备份主服务器的恢复过程中需要保存配置更改,我们将以相反的方向开始同步。 为此,在上面的PrintSync.ps1脚本中我们交换变量$ SourceServer$ DestServer的值 。 传输更改后,请不要忘记将这些值返回,否则每晚都会被命运的邪恶意志无情地扫除prn-srv01上打印机配置中的所有更改。
在DNS管理单元中,将CNAME记录的print设置为目标节点prn-srv01的值-一切返回平方。

结果如何?


领导层的暴风雨般的掌声,将管理人员抛在怀里,提高了薪水(本文的作者坦白地说,涨幅的10%)...
好吧,一些指导进一步美丽的方向的想法。

不幸的是,每个人都没有足够的奇迹,而且此解决方案不是全面的故障转移。 如果在主打印服务器崩溃时,上面有非空的打印队列,那么它们的内容很可能会消失在空中,因此有人必须重复发送它们进行打印。

但是,对用户透明地执行打印服务器的例行维护将非常方便。
您遵循Microsoft的建议吗?



自动化迷可以更进一步,创建一个脚本,该脚本在输入时以同步间隔接收服务器名称,并自行完成其余设置:如有必要,创建服务帐户,在调度程序中创建任务等。

监视专家将在日志中添加对同步任务和错误的监视。

深入研究的爱好者可以本着AD复制的精神考虑双向同步,并为每台打印机进行时间跟踪更改。 PrintBrm在这里无济于事,但是没有人取消PowerShell!

蛋糕上的重头戏将是针对AD组使用GPP在客户端计算机上自动安装打印机。 将用户添加到组中-所需的打印机便飞向他。 是的,这是另一个超出本文讨论范围的故事。

我希望我的出版物对某人有用。 我希望每个人都不会出现小故障,并希望在评论中提出问题和建议。

Source: https://habr.com/ru/post/zh-CN414369/


All Articles