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

Author: Titanfall —

Short summary: 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 […]

Quick overview

Site
Tutos GameServer
Canonical URL
https://tutos-gameserver.fr/2019/09/03/migration-des-imprimantes-reseau-avec-vbscript-bien-choisir-son-serveur-d-impression/
LLM HTML version
https://tutos-gameserver.fr/2019/09/03/migration-des-imprimantes-reseau-avec-vbscript-bien-choisir-son-serveur-d-impression/llm
LLM JSON version
https://tutos-gameserver.fr/2019/09/03/migration-des-imprimantes-reseau-avec-vbscript-bien-choisir-son-serveur-d-impression/llm.json
Manifest
https://tutos-gameserver.fr/llm-endpoints-manifest.json
Estimated reading time
9 minutes (529 seconds)
Word count
1763

Key points

Structured content

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.

Click to rate this post! [Total: 0 Average: 0]

Topics and keywords

Themes: Serveur d'impression

License & attribution

License: CC BY-ND 4.0.

Attribution required: yes.

Manifest: https://tutos-gameserver.fr/llm-endpoints-manifest.json

LLM Endpoints plugin version 1.1.2.