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