Serveur d'impression

Migration des imprimantes réseau avec VBScript – Bien choisir son serveur d impression

Le 3 septembre 2019 - 9 minutes de lecture

Dans le cadre d’une migration de Windows XP vers Windows 7, il m’a été demandé de trouver un moyen d’exporter les imprimantes réseau installées sur les ordinateurs XP afin qu’elles puissent être réinstallées sur les ordinateurs Windows 7. Nous ne voulions pas capturer les imprimantes locales (imprimantes installées via TCP / IP ou connectées via USB) ni les imprimantes virtuelles (telles que l'imprimante virtuelle Adobe PDF ou Microsoft XPS Document Writer). Je pensais que la migration des imprimantes était moins attrayante, car les ordinateurs sources sont sous Windows XP 32 bits, alors que les ordinateurs de destination sont sous Windows 7 64 bits et que les pilotes sont donc différents.

Il existe différentes manières d’exporter des files d’impression, des paramètres d’imprimante et des ports d’imprimante, mais j’ai décidé que tout ce que je voulais, c’était de déterminer le nom de chaque imprimante (par exemple: \ SERVER Printer) sur le XP. ordinateur, exportez-le dans un fichier texte sur un partage réseau, puis exécutez PrintUI.exe / ga sur la machine Windows 7 en parcourant les lignes du fichier texte en entrée.

(Consultez l’assistant Migration d’imprimantes en lançant PrintBrmUI.exe ou la version en ligne de commande. % WINDIR% System32 Spool Tools Printbrm /?, pour des alternatives à printui.exe.)

De plus, j’exporte également le nom de l’imprimante par défaut afin qu’il puisse être défini par programme dans le nouvel environnement.

Le code est un travail en cours, mais j'espère que cela vous aidera à démarrer.

Les VBScripts

Voici les scripts que j'ai reconstitués.

exportPrinters.vbs

Le script exportPrinters.vbs crée deux fichiers texte dans H: PRINTERS. Ajustez votre chemin en conséquence.



Const ForWriting = 2

Set objNetwork = CreateObject ("Wscript.Network")

strName = objNetwork.UserName
strDomain = objNetwork.UserDomain
strUser = strDomain & "" & strName

'strText = strUser & vbCrLf

strComputer = "."

Définissez objWMIService = GetObject ("winmgmts: \" & strComputer & " root  cimv2")


'Exporter une liste d’imprimantes réseau dans un fichier texte

Définir colPrinters = objWMIService.ExecQuery _
    ("Select * From Win32_Printer Where Local = FALSE")

Pour chaque objPrinter en colPrinters
    strText = strText & objPrinter.Name & vbCrLf
Prochain

Définir objFSO = CreateObject ("Scripting.FileSystemObject")

strFolder = "H:  IMPRIMANTES"

Si non objFSO.FolderExists (strFolder), alors
    objFSO.CreateFolder (strFolder)
Fin si

Définir objFile = objFSO.CreateTextFile _
    ("H:  PRINTERS  printers.txt", ForWriting, False)

objFile.Write strText

objFile.Close


'Exporter l'imprimante par défaut séparément

Définir colPrinters = objWMIService.ExecQuery _
    ("Select * From Win32_Printer Où Default = TRUE")

Pour chaque objPrinter en colPrinters
    strText = objPrinter.Name
Prochain

Définir objFSO = CreateObject ("Scripting.FileSystemObject")

Définir objFile = objFSO.CreateTextFile _
    ("H:  PRINTERS  default.txt", ForWriting, False)

objFile.Write strText

objFile.Close

importPrinters.vbs

Notez que, si vos utilisateurs sous Windows 7 ne sont pas administrateurs, vous devrez exécuter le script en tant qu'administrateur (il existe différentes manières) ou vous obtiendrez une invite UAC pour chaque installation d'imprimante et le redémarrage de l'impression. spouleur.

Encore une fois, surveillez les chemins. Ceci est un script maison pour mon environnement spécifique.



Option explicite

'Ce script doit être exécuté avec les privilèges administor
'S'il n'est pas exécuté avec des privilèges d'administrateur, il lancera une invite UAC pour chaque imprimante lorsqu'il parcourra la liste en boucle.
'Voici un article intéressant sur l'utilisation de VBS en tant qu'utilisateur différent:
'http://blogs.technet.com/b/heyscriptingguy/archive/2006/04/28/how-can-i-use-the-runas-command-torrun-a-script-under-alternate-user -credentials.aspx

'Par exemple:
'runas / profile / user:[username][password] "cscript.exe " F:  Recherche de pilote d'imprimante  Automation  printers-import.vbs ""

Dim objNetwork, strComputer, strName, strFolder, objFSO, strTextFile, strData, strLine, arrLines, strRunCmd, WshShell
CONST ForReading = 1

'Créer un objet réseau
Set objNetwork = CreateObject ("Wscript.Network")

'Obtenir le nom de la machine locale à partir de l'objet réseau
strComputer = objNetwork.ComputerName

'Obtenir le nom d'utilisateur de l'utilisateur à partir de l'objet Réseau
strName = objNetwork.UserName

'Créer un objet de système de fichiers
Définir objFSO = CreateObject ("Scripting.FileSystemObject")

'Enregistrer le nom du fichier texte en tant que variable
'Notez que le script doit être exécuté en tant qu’administrateur et que l’appel du script avec
'Exécuter en tant que provoque l'exécution du script comme s'il se trouvait dans le même répertoire que "% SystemRoot%  System32  WScript.exe"
'D'où la nécessité de transmettre le chemin d'accès complet au fichier printers.txt
strTextFile = "H:  PRINTERS  printers.txt"

'Ouvrez le fichier texte - strData contient maintenant tout le fichier
strData = objFSO.OpenTextFile (strTextFile, ForReading) .ReadAll

'Diviser le fichier texte en lignes
arrLines = Split (strData, vbCrLf)

'Initialise le wshShell
Définir WshShell = WScript.CreateObject ("WSCript.shell")

'Traverser les lignes
Pour chaque ligne en ligne

    Si Len (strLine)> 0 alors
'N'exécute le processus que sur des lignes qui ne sont pas vides

'strRunCmd = "rundll32 printui.dll, PrintUIEntry / ga / c \" & strComputer & "/ n" & strLine & ""
strRunCmd = "" "printui.exe" "/ ga / q / c \" & strComputer & "/ n" & strLine & ""

'Renvoie la commande à exécuter
'WScript.Echo strRunCmd

'Ceci lance printui.exe
'strRunCmd = "" "printui.exe" ""

'Exécutez la commande, affichez la fenêtre et attendez la fin de la commande avant de continuer.
Résultat faible
result = WshShell.Run (strRunCmd, 1, True)

'WScript.Echo résultat

'Écrivez dans le journal d'application que l'imprimante a été installée
Si résultat = 0 alors
WshShell.LogEvent 0, "User:" & strName & "- Evénement: tentative d'installation de l'imprimante" & strLine & "avec [" & strRunCmd & "] (succès inconnu) "
Fin si

'WScript.Echo "Imprimante traitée:" & strLine
    Fin si

Prochain

'Nettoyer
Définir objFSO = Nothing

'Attends 10 secondes
WScript.Sleep 10000

'Redémarrez le spouleur d'impression
RestartService "Spouleur d'impression", True

Sub RestartService (myService, blnQuiet)
'Ce sous-programme redémarre un service
' Arguments:
'myService utilise le nom d'affichage du service
'blnQuiet si False, l'état du service est affiché
'chaque seconde pendant la procédure de redémarrage
'
'Écrit par Rob van der Woude
'http://www.robvanderwoude.com

    «Ménage standard
    Dim colServices, colServicesTest, objService
    Dim objServiceTest, objWMIService, strQuery, strTest

    'Créer un objet WMI
    Définissez objWMIService = GetObject ("winmgmts: \.  Root  CIMV2")

    'Interrogez les services pour "notre" service
    strQuery = "SELECT * FROM Win32_Service WHERE DisplayName = '" & myService & "'"
    Définissez colServices = objWMIService.ExecQuery (strQuery, "WQL", 48)

    'Boucle à travers la "collection" de services rendus
    Pour chaque objService dans colServices
        'Voir si nous devons dire à l'utilisateur que nous allons arrêter le service
        Si non blnQuiet alors
            WScript.Echo "Arrêt" et monService
        Fin si

        'Arrêtez le service
        objService.StopService

        'Attendez que le service soit arrêté
        Do Until strTest = "Stopped"
            'Créer un nouvel objet pour notre service; cette solution est nécessaire
            'sinon les informations d'état du service ne sont pas correctement mises à jour
            Définir colServicesTest = objWMIService.ExecQuery (strQuery, "WQL", 48)

            'Boucle à travers la "collection" de services rendus
            Pour chaque objServiceTest dans colServicesTest
                'Vérifier l'état du service
                strTest = objServiceTest.State
                'Voir si nous devons montrer les progrès
                Si non blnQuiet alors
                    WScript.Echo "State:" & strTest
                Fin si
                'Attendez 1 seconde
                WScript.Sleep 1000
            Prochain

            'Effacer l'objet temporaire
            Définir colServicesTest = Nothing
        Boucle

        'Voir si nous devons dire à l'utilisateur que nous allons (re) démarrer le service
        Si non blnQuiet alors
            WScript.Echo "Démarrage" & myService
        Fin si

        'Démarrer le service
        objService.StartService

        'Attendez que le service soit à nouveau opérationnel
        Do Until strTest = "Running"
            'Créer un nouvel objet pour notre service; cette solution est nécessaire
            'sinon les informations d'état du service ne sont pas correctement mises à jour
            Définir colServicesTest = objWMIService.ExecQuery (strQuery, "WQL", 48)

            'Boucle à travers la "collection" de services rendus
            Pour chaque objServiceTest dans colServicesTest
                'Vérifier l'état du service
                strTest = objServiceTest.State
                'Voir si nous devons montrer les progrès
                Si non blnQuiet alors
                    WScript.Echo "State:" & strTest
                Fin si
                'Attendez 1 seconde
                WScript.Sleep 1000
            Prochain

            'Effacer l'objet temporaire
            Définir colServicesTest = Nothing
        Boucle
    Prochain
End Sub

setDefaultPrinter.vbs

Enfin, nous voulons définir l’imprimante par défaut. L'imprimante devra déjà exister (évidemment). Si vous venez de lancer la commande printui.exe / ga pour installer l’imprimante, celle-ci ne sera disponible qu’au redémarrage du spouleur d’impression. Alors attendez une minute ou deux avant d'exécuter le script.



Option explicite

Dim objNetwork, strComputer, objFSO, strTextFile, strData, strLine, arrLines, strRunCmd, wshShell
CONST ForReading = 1

'Créer un objet réseau
Set objNetwork = CreateObject ("Wscript.Network")

'Obtenir le nom de la machine locale à partir de l'objet réseau
strComputer = objNetwork.ComputerName

'Enregistrer le nom du fichier texte en tant que variable
strTextFile = "H:  PRINTERS  default.txt"

'Créer un objet de système de fichiers
Définir objFSO = CreateObject ("Scripting.FileSystemObject")

'Ouvrez le fichier texte - strData contient maintenant tout le fichier
strData = objFSO.OpenTextFile (strTextFile, ForReading) .ReadAll

'Diviser le fichier texte en lignes
arrLines = Split (strData, vbCrLf)

'Initialise le wshShell
Définir wshShell = WScript.CreateObject ("WSCript.shell")

'Traverser les lignes
Pour chaque ligne en ligne

    Si Len (strLine)> 0 alors
'N'exécute le processus que sur des lignes qui ne sont pas vides

'strRunCmd = "rundll32 printui.dll, PrintUIEntry / y / c \" & strComputer & "/ n" & strLine & ""
strRunCmd = "" "printui.exe" "/ y / c " & strComputer & "/ n" "" & strLine & "" ""
'wscript.echo strRunCmd
wshShell.Run strRunCmd

'wscript.echo "Imprimante traitée:" & strLine
    Fin si

Prochain

'Nettoyer
Définir objFSO = Nothing

Au fur et à mesure de la migration, je reviendrai et peaufinerai les scripts. S'il vous plaît n'hésitez pas à laisser des commentaires et des suggestions.

Merci à Rob van der Woude pour sa formidable page de contrôle des imprimantes en ligne de commande, ainsi que pour d’autres.

Commentaires

Laisser un commentaire

Votre commentaire sera révisé par les administrateurs si besoin.