1ère étape créer le premier serveur, que je nommerais pour l'exercice PRINTSERV01 avec toutes les imprimantes que les utilisateurs peuvent utiliser, avec les droits et les paramètres. Microsoft met un outil à disposition pour migrer ces serveurs d'impression sans avoir besoin de tout réinstaller. Nous allons l'utiliser pour dupliquer et sauvegarder le(s) serveur(s).
Télécharger la dernière version de PrintMig sur le site officiel
Pour l'exemple je crée un répertoire "printmig" sur notre premier serveur PRINTSERV01 que je partage, "printmig$" pour des raisons d'accès depuis les autres serveurs d'impression. Vous pouvez aussi utiliser le partage administratif c$. Bien sûr que si vous avez un serveur dédié aux sauvegardes, vous pouvez directement placer le fichier de sauvegarde sur son disque. Cependant il sera pratique que les autres serveurs puissent y accéder.
Dans ce répertoire nous allons créer un batch qui utilise Printmig.exe pour faire la sauvegarde de votre serveur d'impression, que je nommerai "sauvegarde.bat". Ce sciript crée un fichier .CAB avec le nom de votre serveur (dans notre cas PRINTSERV01.CAB) sous c:\PrintMig. Pour avoir les informations d'utilisation de Printmig, exécuter printmig.exe /? Ou lisez la documentation fournit sur le site officiel.
%SystemDrive%\PrintMig\printmig.exe -b %SystemDrive%\PrintMig\%COMPUTERNAME%.cab \\%COMPUTERNAME%
Nous utiliserons le même batch chaque semaine (ou journalier, dépendra de la fréquence d'installation des périphériques d'impression) pour faire un export que l'on utilisera pour importer sur les autres serveurs d'impression.
Sur les serveurs de redondance, nous copions la structure c:\printmig\printmig.exe. Par contre pas besoin de le partager, puisque ces serveurs ne vont qu'importer les paramètres du serveur primaire, ils ne sont qu'une pâle copie du premier.
Attention! Lors de l'importation des imprimantes, si vous utilisez des pilotes en mode noyaux, il faut désactiver l'interdiction de l'importation de tels pilotes dans les stratégies locale du serveur: méthode : Exécuter -> gpedit.msc

De cette façon en ayant plusieurs serveurs, vous pouvez diminuer les charges sur un serveur et les équilibrer de façon qu'un service ou département utilise tel serveur ou l'autre ou encore le troisième.
Et nous créons un même genre de batch que celui de la sauvegarde mais l'importation reprendra les valeurs sauvées par le premier.
Il est pu plus compliquer car il est préférable de tout effacer : fichiers et base de registre avant de restaurer.
@echo off cls ::définir le nom du serveur source SET SERVSOURCE=PRINTSERV01 :: Arrêt du service d'impression (spooler) /!\ Attention langue du système net stop "Spouleur d'impression" ::1. supprimer les clés dans la base de registre: %windir%regedit.exe /s C:\PrintMig\delreg.reg ::2. Vider le dossier : C:\WINNT\system32\spool\PRINTERS et spool\driversw32x86 DELTREE.EXE /y %windir%\system32\spool\PRINTERS\*.* DELTREE.EXE /y %windir%\system32\spool\driversw32x86\*.* ::3. Redémarrer le service d'impression (spooler) /!\ Attention langue du système net start "Spouleur d'impression" ::4. Importer la sauvegarde du premier serveur C:\PrintMig\printmig.exe -r \\%SERVSOURCE%\PrintMig$\%SERVSOURCE%.cab \\%COMPUTERNAME%{/xtypo_code} Il faudra rajouter un REG pour la surpression des clés qui est appelé par notre batch qui doit contenir {xtypo_code}Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows NT x86\Drivers\Version-2] [-HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Environments\Windows NT x86\Drivers\Version-3] [-HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Print\Monitors\Standard TCP/IP Port\Ports] [-HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Print\Printers]
Jusque là, pas trop de soucis et pratiquement rien de nouveau, vous aller me dire, je suis d'accord !
Mais voilà le script VBS que je vous propose ici, qui est à utiliser avec une GPO, ou au logon script, vous permettra de balancer les utilisateurs qui utilisaient le PRINTSERV01 sur PRINTSERV02 si le premier est en panne ou ne répond pas.
Le script lance un echo (PING) sur serveur par défaut et si celui-ci ne répond pas alors il migre toutes les imprimantes connectées sur sur le serveur par défaut sur le serveur de sauvegarde. En prenant en compte, bien sûr, de l'imprimante définie par défaut par l'utilisateur. De cette façon les utilisateurs peuvent toujours imprimer et vous avez le temps de réparer celui qui est tombé en panne. Si le serveur revient sur le réseau, ou une nouvelle machine avec le même nom, alors à leur prochaine connexion au domaine, les utilisateurs vont reprendre les imprimantes connectées sur le serveur d'impression que vous avez défini par défaut.
A ce stade c'est évident que tous les serveurs doivent avoir toutes les imprimantes. Et durant la panne, le serveur restant doit un peu plus travailler, puisqu'il reçoit tout les travaux d'impression. Le but de la manœuvre et que les utilisateurs peuvent imprimer.
Prenez le script suivant et modifier les variables (lignes 12 & 13) nécessaires pour votre site, dupliquez-le a votre guise.

'========================================================================== ' ' NAME: monscript.vbs ' ' AUTHOR: sharky ' DATE : 21.02.2007 ' ' COMMENT: Ce script a pour but de balancer automatiquement les imprimantes ' connectées à l'utilisation au serveur backup d'impression et retour ' '========================================================================== On Error Resume Next DefaultPrintServer = "PRINTSERV01" 'Nom netbios du serveur par défaut BackupPrintServer = "PRINTSERV02" 'Nom netbios du serveur d'impression backup Set WSHShell = WScript.CreateObject("WScript.Shell") UTemp = WSHShell.ExpandEnvironmentStrings("%TEMP%") 'Définition de la zone de travail temporaire pour le script 'Contrôle du serveur d'impression par défaut présent Set objShell = CreateObject("WScript.Shell") Set objExecObject = WSHShell.Exec _ ("%comspec% /c ping -n 2 -w 800 "&DefaultPrintServer&"")'Ping le serveur par défaut, il existe une autre possibilité mais uniquement XP/2003 Do While Not objExecObject.StdOut.AtEndOfStream strText = objExecObject.StdOut.ReadAll() If Instr(strText, "TTL=") => 1 Then 'Si dans le résultat du PING il y a au moins 1 TTL= OK 'Si serveur d'impression par défaut est atteignable OLDSERVER = "\\" & BackupPrintServer NEWSERVER = "\\" & DefaultPrintServer Else 'Si serveur d'impression par défaut n'est pas atteignable OLDSERVER = "\\" & DefaultPrintServer NEWSERVER = "\\" & BackupPrintServer End If Loop Const ForReading = 1 Const ForWriting = 2 PrinterList = UTemp&"PrinterList.txt" const HKEY_CURRENT_USER = &H80000001 '1 crée la liste des imprimantes actuelle ListPrinters() '2 Ajoute les mêmes imprimantes de liste mais de NEWSERVER AddPrinters() '3 redéfinis l'imprimante par défaut SetDefaultPrinter() '4 supprime les anciennes imprimantes DeletePrinters() '5 Supprime le fichier list Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.DeleteFile(PrinterList) WScript.Quit '************************************************************************************** Sub ListPrinters() Set objFSO = CreateObject("Scripting.FileSystemObject") Set objDestinationFile = objFSO.OpenTextFile(PrinterList, ForWriting, true) Set WshNetwork = WScript.CreateObject("WScript.Network") Set oPrinters = WshNetwork.EnumPrinterConnections For i = 0 to oPrinters.Count - 1 Step 2 Printer = oPrinters.Item(i+1) If UCase(Left(Printer,Len(OLDSERVER)))=OLDSERVER Then PrinterName=Replace(UCase(Printer),OLDSERVER & "","") objDestinationFile.Writeline PrinterName End If Next objDestinationFile.Close End Sub '************************************************************************************** Sub AddPrinters() Set objFSO = CreateObject("Scripting.FileSystemObject") Set objSourceFile = objFSO.OpenTextFile(PrinterList, ForReading) Set WshNetwork = WScript.CreateObject("WScript.Network") Do Until objSourceFile.AtEndOfStream PrinterName = objSourceFile.ReadLine NewPrinter = NEWSERVER & "" & PrinterName WshNetwork.AddWindowsPrinterConnection NewPrinter Loop objSourceFile.Close End Sub '************************************************************************************** Sub SetDefaultPrinter() strComputer = "." Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "rootdefault:StdRegProv") strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Windows" strValueName = "Device" oReg.GetStringValue HKEY_CURRENT_USER,strKeyPath,strValueName,strValue If UCase(Left(strValue,Len(OLDSERVER)))=OLDSERVER Then PrinterName=Replace(UCase(strValue),OLDSERVER & "","") Name = Split(PrinterName,",") strKeyPath = "Software\Microsoft\Windows NT\Current\Version\Devices" strDeviceName = NEWSERVER & "" & Name(0) oReg.GetStringValue HKEY_CURRENT_USER,strKeyPath,strDeviceName,SpoolName strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Windows" strValueName = "Device" strValue = NEWSERVER & "" & Name(0) & "," & SpoolName oReg.SetStringValue HKEY_CURRENT_USER,strKeyPath,strValueName,strValue End If End Sub '************************************************************************************** Sub DeletePrinters() Set objFSO = CreateObject("Scripting.FileSystemObject") Set objSourceFile = objFSO.OpenTextFile(PrinterList, ForReading) strComputer = "." Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "rootdefault:StdRegProv") Do Until objSourceFile.AtEndOfStream PrinterName = objSourceFile.ReadLine strServer = Replace(OLDSERVER,"\\","") strKeyPath = "PrintersConnections,," & strServer & "," & PrinterName oReg.DeleteKey HKEY_CURRENT_USER, strKeyPath strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Devices" strDeviceName = OLDSERVER & "" & PrinterName oReg.DeleteValue HKEY_CURRENT_USER, strKeyPath,strDeviceName strKeyPath = "Software\Microsoft\Windows NT\CurrentVersion\Printer\Ports" strPrinterPortName = OLDSERVER & "" & PrinterName oReg.DeleteValue HKEY_CURRENT_USER, strKeyPath,strPrinterPortName Loop objSourceFile.Close End Sub
Très pratique

Brice
a dit:
|
... Bonjour , Lors de l'exécution du script il me détecte une erreur de syntaxe à cette ligne la , pour ma part je ne vois rien d'anodin ! Set oReg=GetObject("winmgmts:{impersonationLevel=impersonate}!" & strComputer & "rootdefault:StdRegProv") strKeyPath = "SoftwareMicrosoftWindows NTCurrentVersionWindows" strValueName = "Device" |
|




