Servidor de impresión tolerante a fallas de Windows


Un administrador real puede dormir tranquilo solo cuando todo está respaldado, monitoreado y duplicado. O cuando trabaja en un buen equipo, donde siempre puedes culpar a los demás.
Dio la casualidad de que uso principalmente productos de Microsoft en mi trabajo y puedo decir que la compañía se toma en serio la copia de seguridad de sus servicios: Active Directory, Exchange DAG, SQL Always On, DFSR, etc. Como en otros lugares, hay implementaciones muy elegantes y exitosas, así como obviamente inconvenientes y difíciles. También hay una solución para el servicio de impresión, pero requiere agrupación basada en Hyper-V. Y quería una solución simple "lista para usar", que no requiera financiamiento adicional. Windows 2012 R2 se tomó como base, pero lo más probable es que el mismo esquema funcione sin problemas en cualquier versión de servidor que comience con Windows 2008, e incluso en los sistemas operativos cliente de Vista y superior (¡hola a los fanáticos que ahorran el presupuesto!). A quién le importa: le pido un gato.

Descargo de responsabilidad
Para respetar el trabajo de los indios, dado que la audiencia de Habr es principalmente de habla rusa y para facilitar a los administradores principiantes, los ejemplos utilizan la versión rusa de la interfaz de Windows. Los enlaces, donde sea posible, también conducen a recursos en ruso.


Poco de teoría


Cualquiera a quien no le guste la teoría y quiera hacer clic más rápido con el mouse y el teclado puede pasar directamente a la siguiente parte.
Como se mencionó anteriormente, la recomendación oficial de hoy es una solución que usa la agrupación y virtualización de Hyper-V. Además, nada impide garantizar la tolerancia a fallos del servicio de impresión a nivel del sistema de virtualización, y no necesariamente Hyper-V, pero tales soluciones cuestan dinero.
Realmente quería algo similar a DHCP Failover , pero para el papel de un servidor de impresión.
No se encontró nada adecuado en Internet en general y en el Habr en particular , y tuve que inventarlo yo mismo.

La esencia de la idea en un párrafo.
La solución que se describe a continuación se basa en la utilidad BrintBrm, que forma parte de la distribución estándar de Windows y ha reemplazado a printmig .
El servidor en espera funciona en modo de espera y sincroniza la configuración con el servidor principal con la frecuencia especificada utilizando esta utilidad. Para los clientes, se creó un CNAME con un pequeño TTL en DNS, haciendo referencia al servidor principal. En el caso de una falla del servidor primario, el administrador corrige CNAME cambiando los clientes al servidor de respaldo. Eso, de hecho, es todo.
Si el tema es interesante y quiero familiarizarme con los baches que ya están llenos de mí y las formas de evitar el rastrillo, siga a continuación.

Antes de comenzar, o lo que necesita saber sobre PrintBrm


Entonces, ¿qué es esta utilidad PrintBrm, cuyo objetivo principal es servir al servidor de impresión?
  • Bien mantenido Tiene una implementación de GUI llamada Print Migration y se puede iniciar desde el complemento Print Management . La versión GUI es menos funcional y tiene problemas con el puerto de puertos.
  • Atento De manera predeterminada, maneja las ACL de la impresora del servidor de impresión. En otras palabras, si permitía imprimir en la impresora \\ printserver \ printer1 solo para los empleados que son miembros del grupo de contabilidad AD, entonces esta restricción se tendrá en cuenta para la importación / exportación. O no lo hará, si coloca la tecla -NOACL . Sin embargo, la ACL del servidor de impresión en sí no se procesa independientemente de la clave.
  • Moody En el momento de importar parámetros desde un archivo, el servidor de destino debe tener al menos una impresora compartida; de lo contrario, obtendrá un error.
  • Gentil. Perdió ver espacios en la ruta del archivo. Al ver las comillas que enmarcan ese camino, está molesto y da un error 0x8007007b.
  • Modesto. Si el archivo especificado ya existe al intentar exportar la configuración, no puede sobrescribirlo, es tímido preguntar y también termina con un error.
  • Misterioso Siempre devuelve un código de salida de 0 . Resulta que el programa perfecto.
  • Apto para pensar. Se puede congelar en la etapa de 100% minutos durante 5, y a veces más. Pero luego piensa y termina el trabajo (a menos que, por supuesto, tenga la paciencia de no presionar Ctrl + C).
  • De repente y contradictorio. Puede organizar tales sorpresas .
  • Inteligente Puede reasignar controladores de origen a otros. Por ejemplo, al usar un archivo XML, puede especificar que todos los controladores de HP Universal Printing PCL 5 en el archivo guardado en el servidor de destino deben reasignarse a HP Universal Printing PCL 6. No lo he usado en la práctica, pero puede ser útil para alguien.
  • Rebelde No podría usarlo para transferir configuraciones entre dominios sin confianza, incluso con el interruptor -NOACL. O no puede hacerlo en principio, o mi magia no es lo suficientemente fuerte.
  • Puede conocer mejor aquí y aquí , pero para aquellos valientes que no dudan en preguntar directamente, hay una clave /?


Admito que algunas características las ignoré inmerecidamente. Quizás en Windows 10/2016 ella comenzó a comportarse de manera diferente. Si hay información, por favor comparta.

Preparación del medio ambiente


Se supone que ya ha implementado Active Directory y conoce al menos 3 formas de deshabilitarlo y al menos 2 de ellos han sido probados en la práctica.

Algunas letras
Partiendo del tema del artículo, noto que me gusta el pedido, y estoy a favor del hecho de que cada impresora de red y MFP tiene una etiqueta que corresponde a su nombre de red. Esto simplifica el trabajo de los empleados de TI cuando intentan averiguar por parte del usuario en qué impresora de fotos de gatos en particular se imprimen informes analíticos importantes en tonos ácidos tóxicos en lugar de delicados pistachos. Es mejor pegar esas pegatinas en la parte inferior de la impresora, para que todos estén más interesados ​​y más divertidos.
También me gusta cuando cada impresora de red está registrada en la zona DNS interna. Un servidor DHCP basado en Windows puede hacer esto fácilmente .
Por ejemplo, el nombre de la impresora puede tener el formato msk-prn001 o sale-printer023, y los nombres de puerto para estas impresoras en el servidor de impresión se denominan exactamente igual. Pero esta es mi preferencia personal, estoy listo para escuchar las objeciones en los comentarios.

Asumiremos que todas las impresoras están conectadas en red y disponibles para imprimir desde los servidores de impresión primario y de respaldo. Deje que estos servidores se llamen prn-srv01 y prn-srv02 respectivamente.
Los servidores de dominio en Windows Server no inferiores a 2008 son adecuados como servidores de impresión. En principio, los sistemas operativos cliente que comienzan con Vista también son adecuados, si realmente desea ahorrar algo de dinero. El ejemplo usa Windows 2012 R2. Es muy recomendable instalar todas las actualizaciones necesarias del sistema operativo antes de configurar los servidores y las máquinas cliente.

Usted mismo, por supuesto, entiende, pero el límite aún requiere atención: si los servidores de impresión son virtuales, entonces deben distribuirse a diferentes servidores físicos, de lo contrario nuestra conmutación por error simplemente se convertirá en un error.

En prn-srv01 y prn-srv02 , se debe agregar la función del servidor de impresión. Es más conveniente para mí usar el cmdlet de PowerShell:
Install-WindowsFeature Print-Services

Además, se debe aplicar un ajuste de registro en los servidores de impresión, que corrige el error 0 × 00000709 cuando las máquinas cliente acceden al servidor de impresión a través de CNAME. Puede hacer esto con el comando del artículo en el enlace de arriba:
reg add HKLM\SYSTEM\CurrentControlSet\Control\Print /v DnsOnWire /t REG_DWORD /d 1
Después de aplicar el comando, debe reiniciar el servicio Administrador de impresión .
Le recomiendo que asigne una unidad organizativa separada para los servidores de impresión y distribuya esta configuración con GPP .

Iniciamos el complemento DNS en el controlador de dominio y habilitamos la pantalla extendida:
haga clic


Se necesita un mapeo avanzado para poder establecer TTL para los registros creados.
En DNS, cree un registro de impresión CNAME que haga referencia a prn-srv01 con un valor TTL de 5 minutos:
haga clic


haga clic


Las máquinas cliente deben usar este nombre para conectarse al servidor de impresión. Es decir el cliente se conectará a las direcciones \\ print \ printer01, \\ print \ printer02, etc.
Cuanto más bajo sea el valor TTL, más a menudo los clientes actualizarán el registro y antes "comprenderán" que necesitan cambiar a otro servidor de impresión. 5 minutos son suficientes para mí.
Al establecer el valor demasiado bajo, genera tráfico DNS en su red, y al especificar una o dos horas, enfatiza su tolerancia al estrés y sus nervios fuertes .
Una forma alternativa de agregar un registro CNAME con PowerShell:
Import-Module DnsServer
Add-DnsServerResourceRecordCName -Name "print" -HostNameAlias "prn-srv01.lab.net" -ZoneName "lab.net" -TimeToLive 00:05:00

(Por supuesto, cambiamos lab.net a su contoso.local o lo que sea)

Tenga en cuenta que si tiene varios sitios de AD, la actualización de los registros DNS en todas las ubicaciones llevará más tiempo debido a la replicación entre sitios. Puede forzar el proceso con el comando repadmin / syncall .

Mediante la Política de grupo, permitimos que los usuarios comunes instalen controladores desde el servidor de impresión. Cómo hacer esto se describe en detalle aquí .

Cree una cuenta de servicio en AD (la llamé svc-printsync) con una caducidad de contraseña ilimitada:
haga clic


De acuerdo con los requisitos de PrintBrm, esta cuenta debe tener todos los derechos en el servidor de impresión, por lo que la agregamos al dominio de los administradores para que todo funcione con seguridad y escribamos la contraseña en el campo de descripción para no olvidar el grupo de administradores locales en prn-srv01 y prn-srv02 ( por ejemplo, usando el complemento de Administración de computadoras ).

Configure el primer servidor


Si ya se han agregado todas las impresoras necesarias en la impresora principal, puede pasar inmediatamente a la sección sobre la configuración del segundo servidor.

Usando el complemento Print Management , agregamos controladores para las impresoras necesarias al servidor:
haga clic


Se inicia el asistente de instalación del controlador. Es intuitivo, puede resolverlo usted mismo. Solo prestaré atención al momento con poca profundidad.
Porque Como Windows 2012R2 solo está disponible en la versión x64, los controladores también deben ser x64. Si los clientes con versiones x86 de Windows se conectarán al servidor de impresión, no olvide marcar la casilla correspondiente:
haga clic


Algunos kits de controladores contienen un archivo inf común para los sistemas x86 y x64, mientras que otros tienen una separación.

Algunas letras más
Muchos controladores vienen en forma de un instalador, pero dado que estos instaladores ponen mucha basura junto con los controladores, trato de seguir el principio de "necesario y suficiente" y agregar controladores manualmente, como se describió anteriormente.
Además, en aras de la coherencia, me esfuerzo por utilizar la versión Universal de los controladores al máximo (casi todos los proveedores normales lo tienen). Pero a veces puede ser un problema. Entonces, una vez que encontré un error en una de las versiones de HP Universal Printing PCL 6, en el que un documento PDF a través de EasyPrint en una sesión RDP se imprimió de espejo a izquierda de derecha a derecha.
También puede mirar hacia los controladores v4 .


Cuando se agreguen todos los controladores necesarios, trataremos con puertos e impresoras. Puede agregarlos manualmente desde el mismo complemento, pero le recomiendo crear un archivo CSV en Excel y alimentarlo a un script de PowerShell. Por supuesto, nada impide que Excel use cualquier otro editor de hojas de cálculo o bloc de notas en general. Lo principal es que el separador y la codificación especificados en el script corresponden al separador y la codificación en el archivo CSV.
También tenga en cuenta que el nombre del controlador en el archivo CSV debe ser exactamente el mismo que se especifica en el complemento Administración de impresión.
Copiar y pegar al rescate



Archivo CSV de muestra



Aunque escribí anteriormente que me gusta cuando todas las impresoras tienen nombres de red unificados, el ejemplo (campo de dirección de impresora ) usa una vinagreta de direcciones IP y nombres en caso de que no tenga orden en su red un poco más tarde.

Guarde esta tabla en formato CSV:
haga clic

Nota A pesar de que las comas se indican como separadores en el campo "Tipo de archivo", Excel ha hecho un punto y coma como separador. Probablemente sea más interesante y más divertido.

Y aquí está el guión en sí:
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 } 


Si el carácter de tabulación se usa como delimitador en su CSV, entonces en el script debe establecer -Delimiter "` t "

Tenga en cuenta que si una impresora no está disponible desde el servidor mientras se ejecuta la secuencia de comandos, agregarla al servidor de impresión llevará más tiempo (2-3 minutos en lugar de unos segundos)

El resultado del guión:
haga clic



Para asegurarse de que todo funcione en esta etapa, agregue una impresora compartida a cualquiera de las máquinas cliente desde el servidor de impresión principal utilizando el CNAME creado anteriormente (por ejemplo, \\ print \ printer01) e intente imprimir algo en él. Para este propósito, la frase "Preved, soy un pedazo de papel", escrita en negrita Arial con un tamaño 200, es la más adecuada para este propósito.

Configurar un segundo servidor


Un artista copia, un gran artista roba (Pablo Picasso)

Nuestro prn-srv02 aún no ha alcanzado el nivel de gran artista, por lo que nos limitaremos a copiar. Aunque ... es posible con un movimiento de muñeca ...

Creamos y compartimos al menos una impresora, de lo contrario PrintBrm dará un error. Puede hacer una falsificación, pero es importante no elegir el controlador o puerto incorrecto. Por ejemplo, una impresora con un controlador Microsoft XPS Document Writer o un puerto FILE no se puede compartir.

Creamos un script de sincronización simple. Prefiero PowerShell, pero nadie prohíbe hacer un archivo por lotes de tubo caliente.

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 



Ponemos el script en un lugar apartado (en el ejemplo es C: \ Scripts ) y creamos una tarea en el Programador.
Ejecutaremos desde la cuenta svc-printsync creada anteriormente con los permisos más altos:
haga clic


Determine la frecuencia de ejecución por usted mismo. Suficiente para mí una vez al día:
haga clic


En la pestaña Acciones, cree una nueva acción de inicio de PowerShell:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Como argumentos, establecemos la ruta al script con los siguientes parámetros:
C:\Scripts\PrintSync.ps1 -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass
haga clic


Dejamos el resto de los parámetros de la tarea en las pestañas Condiciones y Parámetros de forma predeterminada.
Al guardar la tarea, se solicitará una contraseña para la cuenta svc-printsync . ¿No lo olvidaste? Si ya lo ha olvidado (el artículo es largo), entonces todo se hizo en vano y la vida no tuvo éxito. Reinícielo utilizando el complemento ADUC o de otra manera conveniente y especifíquelo ya en el campo de descripción para que sea más tranquilo .

Nota
El trabajo no tiene que ejecutarse en el servidor de impresión de respaldo. Si tiene un servidor separado para ejecutar rutinas, puede crear una tarea en él. En este caso, la cuenta svc-printsync debe tener derecho a iniciar sesión como un trabajo por lotes en este servidor. De manera predeterminada, el grupo local Operadores de respaldo tiene este derecho, y si esto no se cambia en su entorno, simplemente incluya la cuenta de servicio en el grupo de operadores de archivo del servidor en el que se ejecutará la tarea.


Por primera vez, comenzamos la tarea manualmente y esperamos su finalización.
Para mi zoológico, donde hay alrededor de 50 impresoras de diferentes tipos, tanto en peligro como recientemente creadas, el procedimiento de sincronización dura aproximadamente 10 minutos. El archivo al mismo tiempo pesa casi 1 GB.
Para acelerar el proceso de importación / exportación, puede usar el modificador -NOBIN , que se encarga de copiar los controladores. Tiene sentido cuando la flota de impresoras consta de los mismos modelos y los controladores necesarios están instalados en todos los servidores.

Una vez completado, ejecute el complemento Visor de eventos , vaya a la sección Registros de aplicaciones y servicios , abra el registro de Microsoft \ Microsoft \ PrintBRM \ Administrator y analícelo en busca de errores y advertencias. Y si hay demasiados, es más probable que limpiemos la revista para que nuestros ojos no se calmen.

Encontré los códigos 20, 22, 80 y 81. Por ejemplo,
tal


Como queda claro en el texto, hubo un problema al transferir un controlador específico. Mirando a través del registro, hacemos una lista de controladores problemáticos y los colocamos en el servidor de respaldo con nuestras manos, o los reemplazamos con otros que no son reacios a viajar. Solo tuve problemas con HP, Kyocera y Konica Minolta, no se detectaron errores para los controladores de otros fabricantes (tal vez porque son mejores, o tal vez porque simplemente no los tenemos).
Como resultado, debe lograr la misma lista de impresoras en los servidores primario y de respaldo y la ausencia de errores y advertencias en los registros.

Cambiar a reserva


Bajo el golpe de las hachas y el molido de los tenedores, cerramos la puerta de nuestra oficina y apagamos el teléfono. Ejecute el complemento DNS y edite el registro CNAME para que apunte al servidor de respaldo:
haga clic


Después de un tiempo (¿qué pusiste en TTL allí?), Los gritos amenazantes disminuirán, las máquinas del cliente cambiarán a prn-srv02 y la puerta con el teléfono se puede desbloquear .

Regresa


Si durante la recuperación del servidor principal en la copia de seguridad hubo cambios de configuración que deben guardarse, comenzamos la sincronización en la dirección opuesta. Para hacer esto, en el script PrintSync.ps1 anterior , intercambiamos los valores de las variables $ SourceServer y $ DestServer . Después de transferir los cambios, no olvide devolver estos valores, de lo contrario, todos los cambios en la configuración de la impresora en prn-srv01 serán barridos sin piedad todas las noches por la mala voluntad del destino.
En el complemento DNS, configure print para el registro CNAME como el valor del nodo de destino prn-srv01, y todo volverá al punto de partida.

Cual es el resultado?


Tormentosos aplausos del liderazgo, arrojando al administrador en sus brazos, aumentando el salario (para el autor del artículo: honesto 10% del aumento) ...
Bueno, algunos pensamientos en la dirección de orientación de mayor belleza.

Desafortunadamente, no hay suficientes milagros para todos, y esta solución no es una conmutación por error completa. Si en el momento del colapso del servidor de impresión principal hay colas de impresión no vacías, entonces su contenido probablemente desaparecerá en el aire y alguien tendrá que repetir el envío para imprimir.

Pero será muy conveniente para los usuarios realizar de manera transparente el mantenimiento de rutina de los servidores de impresión.
¿Sigues las recomendaciones de Microsoft?



Los fanáticos de la automatización pueden ir más allá y crear un script que reciba nombres de servidor con un intervalo de sincronización en la entrada y realice el resto de la configuración en sí: crea una cuenta de servicio si es necesario, una tarea en el programador, etc.

Los gurús de supervisión agregarán la supervisión de la tarea de sincronización y los errores en los registros.

Los amantes de cavar más profundo pueden pensar en la sincronización bidireccional en el espíritu de la replicación AD con cambios de seguimiento de tiempo para cada impresora. ¡PrintBrm no ayudará aquí, pero nadie ha cancelado PowerShell!

La guinda del pastel será la instalación automática de impresoras en máquinas cliente que utilizan GPP, dirigidas al grupo AD. Agregue el usuario al grupo y la impresora deseada vuela hacia él. Es cierto, esta es otra historia que va más allá del alcance del artículo.

Espero para alguien que mi publicación sea útil. Les deseo a todos menos problemas técnicos y espero preguntas y sugerencias en los comentarios.

Source: https://habr.com/ru/post/es414369/


All Articles