Serveur d'impression à tolérance de pannes Windows


Un vrai administrateur ne peut dormir paisiblement que lorsque tout est sauvegardé, surveillé et dupliqué. Ou quand il travaille dans une bonne équipe, où vous pouvez toujours blâmer les autres.
Il se trouve que j'utilise principalement des produits Microsoft dans mon travail et je peux dire que la société souhaite sérieusement sauvegarder ses services: Active Directory, Exchange DAG, SQL Always On, DFSR, etc. Comme ailleurs, il existe à la fois des implémentations très élégantes et réussies, ainsi que des implémentations évidemment gênantes et difficiles. Il existe également une solution pour le service d'impression, mais elle nécessite un clustering basé sur Hyper-V. Et je voulais une solution simple «prête à l'emploi», qui ne nécessite pas de financement supplémentaire. Windows 2012 R2 a été pris comme base, mais le même schéma fonctionnera probablement sans problème sur toutes les versions de serveur à partir de Windows 2008, et même sur les systèmes d'exploitation clients de Vista et supérieurs (bonjour aux fans qui économisent le budget!). Peu importe - je demande un chat.

Clause de non-responsabilité
Afin de respecter le travail des Indiens, le public Habr étant majoritairement russophone et pour faciliter la tâche aux administrateurs débutants, les exemples utilisent la version russe de l'interface Windows. Dans la mesure du possible, les liens mènent également à des ressources en russe.


Un peu de théorie


Quiconque n'aime pas la théorie et souhaite cliquer plus rapidement avec une souris et un clavier peut passer directement à la partie suivante.
Comme mentionné ci-dessus, la recommandation officielle aujourd'hui est une solution utilisant le clustering et la virtualisation Hyper-V. De plus, rien n'empêche d'assurer la tolérance aux pannes du service d'impression au niveau du système de virtualisation, et pas forcément Hyper-V, mais de telles solutions coûtent cher.
Je voulais vraiment quelque chose de similaire au basculement DHCP , mais pour le rôle d'un serveur d'impression.
Rien de convenable n'a été trouvé sur Internet en général et sur le Habr en particulier - et j'ai dû l'inventer moi-même.

L'essence de l'idée dans un paragraphe
La solution décrite ci-dessous est basée sur l'utilitaire BrintBrm, qui fait partie de la distribution Windows standard et est venu remplacer printmig .
Le serveur de secours fonctionne en mode veille et synchronise les paramètres avec le serveur principal avec la fréquence spécifiée à l'aide de cet utilitaire. Pour les clients, un CNAME avec un petit TTL a été créé dans DNS, référençant le serveur principal. En cas de défaillance du serveur principal, l'administrateur corrige CNAME en basculant les clients vers le serveur de sauvegarde. En fait, c'est tout.
Si le sujet est intéressant et que je veux me familiariser avec les bosses déjà farcies avec moi et les moyens de contourner le râteau, veuillez suivre ensuite.

Avant de commencer ou ce que vous devez savoir sur PrintBrm


Alors, quel est-il, cet utilitaire PrintBrm, dont le but principal est de servir le serveur d'impression?
  • Bien entretenu. Il a une implémentation GUI appelée Print Migration et peut être lancé à partir du composant logiciel enfichable Gestion de l'impression . La version GUI est moins fonctionnelle et a des problèmes avec le portage de port.
  • Attentif. Par défaut, il gère les listes de contrôle d'accès d'imprimante du serveur d'impression. En d'autres termes, si vous avez autorisé l'impression sur l'imprimante \\ serveur d'impression \ imprimante1 uniquement aux employés membres du groupe Comptabilité AD, cette restriction sera prise en compte pour l'importation / exportation. Ou pas, si vous mettez la clé -NOACL . Cependant, l'ACL du serveur d'impression lui-même n'est pas traité quelle que soit la clé.
  • Maugrey. Au moment d'importer des paramètres à partir d'un fichier, le serveur cible doit avoir au moins une imprimante partagée, sinon vous obtiendrez une erreur.
  • Doux. Espaces perdus dans le chemin du fichier. A la vue des guillemets encadrant un tel chemin, il est contrarié et donne une erreur 0x8007007b.
  • Modeste. Si le fichier spécifié existe déjà en essayant d'exporter les paramètres, il ne peut pas le remplacer, il est timide de le demander et se termine également par une erreur.
  • Mystérieux. Renvoie toujours un code de sortie de 0 . Il s'avère que le programme parfait.
  • Apte à réfléchir. Il peut geler au stade de 100% minutes pendant 5, et parfois plus. Mais alors il réfléchit et termine le travail (à moins, bien sûr, que vous n'ayez la patience de ne pas appuyer sur Ctrl + C).
  • Soudain et contradictoire. Peut organiser de telles surprises .
  • Intelligent. Peut réaffecter des pilotes source à d'autres. Par exemple, en utilisant un fichier XML, vous pouvez spécifier que tous les pilotes HP Universal Printing PCL 5 dans un fichier enregistré sur le serveur de destination doivent être réaffectés à HP Universal Printing PCL 6. Je ne l'ai pas utilisé dans la pratique, mais il peut être utile pour quelqu'un.
  • Capricieux. Je ne pouvais pas l'utiliser pour transférer des paramètres entre des domaines sans confiance, même avec le commutateur -NOACL. Soit il ne peut pas le faire en principe, soit ma magie n'est pas assez forte.
  • Vous pouvez mieux vous connaître ici et ici , mais pour ceux qui ont du courage et qui n'hésitent pas à demander directement, il y a une clé /?


J'avoue que certaines fonctionnalités que j'ai négligées à juste titre. Peut-être que dans Windows 10/2016, elle a commencé à se comporter différemment. S'il y a des informations, veuillez les partager.

Préparation de l'environnement


Il est supposé que vous avez déjà déployé Active Directory et que vous connaissez au moins 3 façons de le désactiver et qu'au moins 2 d'entre elles ont été testées dans la pratique.

Quelques paroles
En partant du sujet de l'article, je note que j'aime la commande, et je suis pour le fait que chaque imprimante réseau et MFP possède un autocollant correspondant à son nom de réseau. Cela simplifie le travail des employés de l'informatique lorsqu'ils essaient de découvrir auprès de l'utilisateur sur quelle imprimante photo de chat des rapports analytiques importants sont imprimés dans des tons acides toxiques au lieu de délicats pistaches. Il est préférable de coller de tels autocollants sur le dessous de l'imprimante, afin que tout le monde soit plus intéressé et plus amusant.
J'aime aussi quand chaque imprimante réseau est enregistrée dans la zone DNS interne. Un serveur DHCP basé sur Windows peut facilement le faire .
Par exemple, le nom de l'imprimante peut être au format msk-prn001 ou sale-printer023, et les noms de port pour ces imprimantes sur le serveur d'impression sont nommés exactement de la même manière. Mais c'est ma préférence personnelle, je suis prêt à entendre des objections dans les commentaires.

Nous supposerons que toutes les imprimantes sont en réseau et disponibles pour l'impression à partir des serveurs d'impression principal et de secours. Que ces serveurs s'appellent respectivement prn-srv01 et prn-srv02 .
Les serveurs de domaine sur Windows Server pas inférieurs à 2008 conviennent comme serveurs d'impression. En principe, les OS clients commençant par Vista conviennent également, si vous voulez vraiment économiser de l'argent. L'exemple utilise Windows 2012 R2. Il est fortement conseillé d'installer toutes les mises à jour nécessaires du système d'exploitation avant de configurer les serveurs et les machines clientes.

Vous-même, bien sûr, comprenez, mais le plafond nécessite toujours de l'attention: si les serveurs d'impression sont virtuels, ils doivent être distribués sur différents serveurs physiques, sinon notre basculement se transformera simplement en échec.

Sur prn-srv01 et prn -srv02 , le rôle de serveur d'impression doit être ajouté. Il est plus pratique pour moi d'utiliser l'applet de commande PowerShell:
Install-WindowsFeature Print-Services

En outre, un ajustement du Registre doit être appliqué sur les serveurs d'impression, ce qui corrige l' erreur 0 × 00000709 lorsque les ordinateurs clients accèdent au serveur d'impression via CNAME. Vous pouvez le faire avec la commande de l'article sur le lien ci-dessus:
reg add HKLM\SYSTEM\CurrentControlSet\Control\Print /v DnsOnWire /t REG_DWORD /d 1
Après avoir appliqué la commande, vous devez redémarrer le service Gestionnaire d'impression .
Je vous recommande d'allouer une unité d'organisation distincte pour les serveurs d'impression et de distribuer ce paramètre à l' aide de GPP .

Nous démarrons le composant logiciel enfichable DNS sur le contrôleur de domaine et activons l'affichage étendu:
cliquer


Un mappage avancé est nécessaire pour pouvoir définir TTL pour les enregistrements créés.
Dans DNS, créez un enregistrement d' impression CNAME qui référence prn-srv01 avec une valeur TTL de 5 minutes:
cliquer


cliquer


Ce nom doit être utilisé par les ordinateurs clients pour se connecter au serveur d'impression. C'est-à-dire le client se connectera aux adresses \\ print \ printer01, \\ print \ printer02, etc.
Plus la valeur TTL est faible, plus les clients mettront à jour l'enregistrement et «comprendront» plus tôt qu'ils doivent passer à un autre serveur d'impression. 5 minutes me suffisent.
En définissant une valeur trop basse, vous générez du trafic DNS sur votre réseau et en spécifiant une heure ou deux, vous accentuez votre tolérance au stress et vos nerfs forts .
Une autre façon d'ajouter un enregistrement CNAME à l'aide de PowerShell:
Import-Module DnsServer
Add-DnsServerResourceRecordCName -Name "print" -HostNameAlias "prn-srv01.lab.net" -ZoneName "lab.net" -TimeToLive 00:05:00

(Bien sûr, nous changeons lab.net en votre contoso.local ou quoi que ce soit)

Gardez à l'esprit que si vous avez plusieurs sites AD, la mise à jour des enregistrements DNS dans tous les emplacements prendra plus de temps en raison de la réplication intersite. Vous pouvez forcer le processus avec la commande repadmin / syncall .

En utilisant la stratégie de groupe, nous permettons aux utilisateurs ordinaires d'installer des pilotes à partir du serveur d'impression. La procédure à suivre est décrite en détail ici .

Créez un compte de service dans AD (je l'ai nommé svc-printsync) avec une expiration de mot de passe illimitée:
cliquer


Selon les exigences de PrintBrm, ce compte doit avoir tous les droits sur le serveur d'impression, nous l'ajoutons donc au domaine admins pour que tout fonctionne à coup sûr et nous écrivons le mot de passe dans le champ de description afin de ne pas oublier le groupe Administrateurs local sur prn-srv01 et prn-srv02 ( par exemple, à l' aide du composant logiciel enfichable Gestion de l'ordinateur ).

Configurer le premier serveur


Si toutes les imprimantes nécessaires sur l'imprimante principale ont déjà été ajoutées, vous pouvez immédiatement passer à la section sur la configuration du deuxième serveur.

À l' aide du composant logiciel enfichable Gestion de l'impression , nous ajoutons des pilotes pour les imprimantes nécessaires au serveur:
cliquer


L'assistant d'installation du pilote se lance. C'est intuitif, vous pouvez le découvrir vous-même. Je ne ferai attention qu'au moment avec une profondeur de bits.
Parce que Étant donné que Windows 2012R2 n'est disponible que dans la version x64, les pilotes doivent également être x64. Si les clients avec des versions x86 de Windows se connectent au serveur d'impression, n'oubliez pas de cocher la case correspondante:
cliquer


Certains kits de pilotes contiennent un fichier inf commun pour les systèmes x86 et x64, tandis que d'autres ont une séparation.

Quelques paroles de plus
De nombreux pilotes se présentent sous la forme d'un installateur, mais étant donné que ces installateurs mettent beaucoup de déchets avec les pilotes, j'essaie de suivre le principe «nécessaire et suffisant» et d'ajouter des pilotes manuellement, comme décrit ci-dessus.
Aussi, par souci de cohérence, je m'efforce d'utiliser au maximum la version universelle des pilotes (presque tous les fournisseurs normaux l'ont). Mais parfois, cela peut être un problème. Ainsi, une fois que j'ai rencontré un bogue dans l'une des versions de HP Universal Printing PCL 6, dans lequel un document PDF via EasyPrint dans une session RDP a été imprimé en miroir de gauche à droite.
Vous pouvez également regarder vers les pilotes v4 .


Lorsque tous les pilotes nécessaires seront ajoutés, nous traiterons des ports et des imprimantes. Vous pouvez les ajouter manuellement à partir du même composant logiciel enfichable, mais je recommande de créer un fichier CSV dans Excel et de le charger dans un script PowerShell. Bien sûr, rien n'empêche Excel d'utiliser tout autre éditeur de feuille de calcul ou bloc-notes en général. L'essentiel est que le séparateur et l'encodage spécifiés dans le script correspondent au séparateur et à l'encodage dans le fichier CSV.
Notez également que le nom du pilote dans le fichier CSV doit être exactement le même que celui spécifié dans le composant logiciel enfichable Gestion de l'impression.
Copiez-collez à la rescousse



Exemple de fichier CSV



Bien que j'aie écrit ci-dessus que j'aime quand toutes les imprimantes ont des noms de réseau unifiés, l'exemple (champ d' adresse de l'imprimante ) utilise une vinaigrette d'adresses IP et de noms au cas où vous n'auriez pas de commande dans votre réseau un peu plus tard.

Enregistrez ce tableau au format CSV:
cliquer

Remarque Malgré le fait que les virgules sont indiquées comme séparateurs dans le champ «Type de fichier», Excel a créé un point-virgule comme séparateur. Probablement pour être plus intéressant et plus amusant.

Et voici le script lui-même:
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 le caractère de tabulation est utilisé comme délimiteur dans votre CSV, alors dans le script, vous devez définir -Delimiter "` t "

Veuillez noter que si une imprimante n'est pas disponible sur le serveur pendant l'exécution du script, l'ajout au serveur d'impression prendra plus de temps (2-3 minutes au lieu de quelques secondes)

Le résultat du script:
cliquer



Pour vous assurer que tout fonctionne à ce stade, ajoutez une imprimante partagée à l'une des machines clientes du serveur d'impression principal à l'aide du CNAME précédemment créé (par exemple, \\ print \ printer01) et essayez d'imprimer quelque chose dessus. A cet effet, la phrase «Prévenu, je suis un morceau de papier», tapée en gras Arial au 200e, convient le mieux à cet effet.

Configurer un deuxième serveur


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

Notre prn-srv02 n'a pas encore atteint le niveau de gran artista, nous nous limiterons donc à la copie. Bien que ... c'est possible avec un coup de poignet ...

Nous créons et partageons au moins une imprimante, sinon PrintBrm donnera une erreur. Vous pouvez créer un faux, mais il est important de ne pas choisir le mauvais pilote ou le mauvais port. Par exemple, une imprimante avec un pilote Microsoft XPS Document Writer ou un port FILE ne peut pas être partagée.

Nous créons un script de synchronisation simple. Je préfère PowerShell, mais personne n'interdit de créer un fichier batch de tube chaud.

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 



Nous mettons le script dans un endroit isolé (dans l'exemple c'est C: \ Scripts ) et créons une tâche dans le Planificateur.
Nous allons exécuter à partir du compte svc-printsync précédemment créé avec les autorisations les plus élevées:
cliquer


Déterminez vous-même la fréquence d'exécution. Assez pour moi une fois par jour:
cliquer


Dans l'onglet Actions, créez une nouvelle action de lancement PowerShell:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Comme arguments, nous définissons le chemin d'accès au script avec les paramètres suivants:
C:\Scripts\PrintSync.ps1 -NonInteractive -WindowStyle Hidden -ExecutionPolicy Bypass
cliquer


Nous laissons le reste des paramètres de tâche dans les onglets Conditions et Paramètres par défaut.
Lors de l'enregistrement de la tâche, un mot de passe sera demandé pour le compte svc-printsync . Tu ne l’as pas oublié? Si vous avez déjà oublié (l'article est long), alors tout a été fait en vain et la vie a échoué, réinitialisez-le à l'aide du composant logiciel enfichable ADUC ou d'une autre manière pratique et spécifiez-le déjà dans le champ de description pour le rendre plus calme .

Remarque
Il n'est pas nécessaire d'exécuter le travail sur le serveur d'impression de sauvegarde. Si vous avez un serveur distinct pour exécuter des routines, vous pouvez créer une tâche dessus. Dans ce cas, le compte svc-printsync doit avoir le droit de se connecter en tant que tâche par lots sur ce serveur. Par défaut, le groupe local Opérateurs de sauvegarde a ce droit, et si cela ne change pas dans votre environnement, alors incluez simplement le compte de service dans le groupe d'opérateurs d'archives du serveur sur lequel la tâche s'exécutera.


Pour la première fois, nous démarrons la tâche manuellement et attendons son achèvement.
Pour mon zoo, où il y a environ 50 imprimantes de types différents, à la fois en voie de disparition et récemment développées, la procédure de synchronisation prend environ 10 minutes. Le fichier pèse en même temps près de 1 Go.
Pour accélérer le processus d'importation / exportation, vous pouvez utiliser le commutateur -NOBIN , qui est responsable de la copie des pilotes. Cela a du sens lorsque le parc d'imprimantes est composé des mêmes modèles et que les pilotes nécessaires sont installés sur tous les serveurs.

Une fois l'opération terminée, exécutez le composant logiciel enfichable Observateur d'événements , accédez à la section Journaux des applications et des services , ouvrez le journal Microsoft \ Microsoft \ PrintBRM \ Administrator et analysez-le à la recherche d'erreurs et d'avertissements. Et s'il y en a trop, alors nous sommes plus susceptibles de nettoyer le magazine afin que nos yeux ne callosent pas.

Je suis tombé sur les codes 20, 22, 80 et 81. Par exemple,
tel


Comme il ressort clairement du texte, un problème est survenu lors du transfert d'un pilote spécifique. En parcourant le journal, nous dressons une liste des pilotes problématiques et les mettons sur le serveur de sauvegarde avec nos mains, ou les remplaçons par d'autres qui ne sont pas opposés aux voyages. Je n'ai eu que des problèmes avec HP, Kyocera et Konica Minolta, aucune erreur n'a été détectée pour les pilotes d'autres fabricants (peut-être parce qu'ils sont meilleurs ou peut-être parce que nous ne les avons tout simplement pas).
Par conséquent, vous devez obtenir la même liste d'imprimantes sur les serveurs principal et de sauvegarde et l'absence d'erreurs et d'avertissements dans les journaux.

Passer à réserver


Sous le coup des haches et le grincement des fourchettes, nous barricadons la porte de notre bureau et éteignons le téléphone. Exécutez le composant logiciel enfichable DNS et modifiez l'enregistrement CNAME afin qu'il pointe vers le serveur de sauvegarde:
cliquer


Après un certain temps (qu'avez-vous mis dans TTL là-bas?), Les cris menaçants se calmeront, les machines clientes passeront à prn-srv02 et la porte avec le téléphone peut être déverrouillée .

Reviens


Si, lors de la récupération du serveur principal sur la sauvegarde, des modifications de configuration doivent être enregistrées, nous démarrons la synchronisation dans le sens opposé. Pour ce faire, dans le script PrintSync.ps1 ci-dessus , nous échangeons les valeurs des variables $ SourceServer et $ DestServer . Après avoir transféré les modifications, n'oubliez pas de renvoyer ces valeurs, sinon tous les changements dans la configuration de l'imprimante sur prn-srv01 seront impitoyablement balayés chaque nuit par la mauvaise volonté du destin.
Dans le composant logiciel enfichable DNS, définissez l' impression pour l'enregistrement CNAME sur la valeur du nœud de destination prn-srv01 - et tout revient à la case départ.

Quel est le résultat?


Applaudissements orageux de la direction, jetant l'administrateur dans ses bras, augmentant le salaire (à l'auteur de l'article - honnête 10% de l'augmentation) ...
Eh bien, quelques réflexions dans le sens d'une orientation de plus belle beauté.

Malheureusement, il n'y a pas assez de miracles pour tout le monde et cette solution n'est pas un basculement à part entière. Si au moment de l'effondrement du serveur d'impression principal, il y a des files d'attente d'impression non vides, alors leur contenu disparaîtra très probablement dans l'air et quelqu'un devra répéter l'envoi de l'impression.

Mais il sera très pratique pour les utilisateurs d'effectuer de manière transparente la maintenance de routine des serveurs d'impression.
Vous suivez les recommandations de Microsoft?



Les fans d'automatisation peuvent aller plus loin et créer un script qui reçoit les noms de serveur avec un intervalle de synchronisation à l'entrée et fait le reste des paramètres lui-même: crée un compte de service si nécessaire, une tâche dans le planificateur, etc.

Les gourous de surveillance ajouteront la surveillance de la tâche de synchronisation et des erreurs dans les journaux.

Les amateurs de creuser plus profondément peuvent penser à la synchronisation bidirectionnelle dans l'esprit de la réplication AD avec des changements de suivi du temps pour chaque imprimante. PrintBrm n'aidera pas ici, mais personne n'a annulé PowerShell!

La cerise sur le gâteau sera l'installation automatique d'imprimantes sur les machines clientes utilisant GPP, ciblant le groupe AD. Ajoutez l'utilisateur au groupe - et l'imprimante souhaitée vole vers lui. Certes, c'est une autre histoire qui dépasse le cadre de l'article.

J'espère pour quelqu'un que ma publication sera utile. Je souhaite à tout le monde moins de problèmes et j'attends avec impatience les questions et suggestions dans les commentaires.

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


All Articles