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
- 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.
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.