narthan
Goto Top

Batch: Umzug auf neuen Printserver - Drucker aller User per Skript migrieren

Guten Tag Administratoren!


Es geht um ein lästiges Thema, mit dem ich selbst zu arbeiten hatte und zudem ich keine vollständige und zufriedenstellende Lösung im Internet gefunden habe. Mit ein wenig Hilfe und eigener Arbeit bin ich auf eine - in meinen Augen - schöne Lösung gekommen und stelle sie Euch hiermit ebenfalls zur Verfügung. face-smile


__Problemstellung__:

Es wird ein neuer Printserver in der Firma eingerichtet und die Drucker aller User müssen auf den neuen Druckserver umgestellt werden. Um dies zu tun gibt es mehrere Möglichkeiten:
1. von User zu User laufen und alles manuell neu installieren (subjektive Einschätzung: hoher Aufwand)
2. via GPO (Gruppenrichtlinien) die neuen Drucker für unterschiedliche User zuweisen (subjektive Einschätzung: geringer Aufwand)
3. unten beigefügte Batch mit dem Anmeldeskript ausführen lassen (subjektive Einschätzung: geringer Aufwand)


__Optionsauswahl__:

In meinem Fall spielte Option 1 von Beginn an keine Rolle, aufgrund des hohen Zeitaufwands bei so vielen Mitarbeitern im Unternehmen.
Option 2 ist eine sehr gute Möglichkeit dieses Problem lösen, und für die meisten bestimmt die einfachste und bequemste Lösung. Hierzu findet man im world wide web auch eine Menge Material zum Nachlesen und die meisten "Kenner der Problemstellung" würden diese auch beim Nachfragen empfehlen.
Im meinem Fall wiederum, kam die Option 2 allerdings aufgrund von firmeninternen Regularien ebenfalls nicht in Frage...
Infolgedessen werde ich nun denen, die dieses Problem mit Hilfe der Option 3 lösen wollen bzw. müssen, weil 1 und 2 nicht zur Debatte stehen, meine Resultate präsentieren und erläutern.


__Informationen & Voraussetzungen__:

- sämtliche User des Unternehmens verwenden WINDOWS 7 (wichtig für Batch-Abfrage: Standarddrucker, nähere Erläuterung unten)
- alle User verfügen an ihrem eigenen PC über Admin-Rechte
- der ALTE Printserver war ein Windows Server 2003
- der NEUE Printserver ist ein Windows Server 2012 R2
- Programm GnuWin32 (sed for Windows, __ohne__ Sources) installiert (1x auf Server, nicht auf jedem einzelnen PC!)
- Programm con2prt.exe (keine Installation notwendig, direkt verwendbar) im selben Ordner wie sed.exe
(Direktdownload für con2prt.exe findet Ihr HIER! bzw. die Seite mit dem Mirror HIER! face-smile


__BATCH__:

@ECHO off
SETLOCAL enabledelayedexpansion

SET "gesuchte_datei=C:\temp\Printer_Migration.txt"  
IF NOT EXIST %gesuchte_datei% GOTO fortfahren
GOTO END
:fortfahren
ECHO Bitte warten...
cscript C:\Windows\System32\Printing_Admin_Scripts\de-DE\prnmngr.vbs -g > C:\temp\stndprnt.txt

con2prt.exe /f > C:\temp\drucker.txt

sed.exe "s/\xd//" "C:\temp\drucker.txt" > "C:\temp\druckersed.txt"  
SET "quell_datei=C:\temp\druckersed.txt"  
SET "ziel_datei=C:\temp\druckersedNEU.txt"  
SET "suchen_nach=ALTERSERVER"  
SET "ersetzen_durch=NEUERSERVER"  
IF NOT DEFINED suchen_nach (ECHO Fehler: Die Variable suchen_nach nicht definiert^^!&GOTO :eof)
IF EXIST %ziel_datei% (DEL /f %ziel_datei% 1>NUL 2>NUL)
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (  
SET zeile=%%i& CALL :ersetzen !zeile!
)
GOTO :weiter
:ersetzen
SET zeile=!zeile:%suchen_nach%=%ersetzen_durch%!
IF [!zeile!] EQU  (ECHO.>>%ziel_datei%) ELSE (ECHO !zeile!>>%ziel_datei%)
GOTO :eof
:weiter

SET "quell_datei=C:\temp\stndprnt.txt"  
SET "ziel_datei=C:\temp\stndprntNEU.txt"  
SET "suchen_nach=ALTERSERVER"  
SET "ersetzen_durch=NEUERSERVER"  
IF NOT DEFINED suchen_nach (ECHO Fehler: Die Variable suchen_nach nicht definiert^^!&GOTO :eof)
IF EXIST %ziel_datei% (DEL /f %ziel_datei% 1>NUL 2>NUL)
FOR /f "delims=" %%i IN ('FINDSTR . "%quell_datei%"') DO (  
SET zeile=%%i& CALL :ersetzen !zeile!
)
GOTO :weiter
:ersetzen
SET zeile=!zeile:%suchen_nach%=%ersetzen_durch%!
IF [!zeile!] EQU  (ECHO.>>%ziel_datei%) ELSE (ECHO !zeile!>>%ziel_datei%)
GOTO :eof
:weiter
FOR /f "tokens=5 delims= " %%i IN (C:\temp\druckersedNEU.txt) DO con2prt.exe /c %%i  
SET "Textdatei=C:\temp\stndprntNEU.txt"  
FOR /f "tokens=4" %%s IN ('findstr /c:"Standarddrucker" "%Textdatei%" ^|findstr /n "^" ^|findstr "1:"') DO con2prt.exe /cd %%s  
ECHO Diese Datei darf nicht gelöscht werden^^! > C:\temp\Printer_Migration.txt

DEL C:\temp\drucker.txt 
DEL C:\temp\druckersed.txt
DEL C:\temp\druckersedNEU.txt
DEL C:\temp\stndprnt.txt
DEL C:\temp\stndprntNEU.txt
GOTO ENDE
:END
ECHO Die Migration des Printservers wurde auf diesem PC bereits durchgefuehrt^^!
:ENDE


__Erläuterung des Codes__:

Zeilen 4-7 & Zeile 48:
Da das Skript nicht bei jedem Anmeldevorgang erneut ausgeführt werden soll - da sonst bei jedem Start die installierten Drucker deinstalliert und wieder neuinstalliert werden - wird in Zeile 48 nach erstmaligen erfolgreichen Ablauf des Batchskripts eine Textdatei erstellt, die nicht gelöscht werden sollte (außer man möchte die De- und Neuinstallation beim nächsten PC-Start ;) ). In den Zeilen 4-7 prüft das Skript, ob diese Datei existiert. Falls ja, springt das Skript ans Ende und ist fertig. Falls die Datei nicht existiert, wird das Skript ausgeführt und die Datei wird erstellt.

Zeile 9:
Hier wird mit Hilfe eines von Windows hinterlegten Skripts der Drucker ermittelt, der vor der Servermigration als Standarddrucker eingerichtet ist. Das Ergebnis wird in einer Text-Datei gespeichert, damit nach Migration der gleiche Standarddrucker wieder eingestellt werden kann.
(!) Wichtig: Der Pfad und ggf. der Name des Skripts können von Betriebssystem zu Betriebssystem variieren. Der hier aufgeführte Pfad bezieht sich auf Windows 7 Systeme.

Zeile 11:
Mit Hilfe von "con2prt.exe /f" werden alle installierten Drucker entfernt. Damit die gleichen Drucker wieder eingerichtet werden können, wird das Ergebnis ist einer Text-Datei gespeichert.

Zeile 13:
con2prt kann nicht mit Zeilenumbrüchen umgehen. Wenn mehrere Drucker installiert waren und entfernt werden, dann gibt con2prt eine Fehlermeldung beim Versuch der erneuten Installation wieder. Daher wird mit Hilfe von sed.exe die gerade erstellte Text-Datei überarbeitet und das Resultat in einer neuen Text-Datei gespeichert.

- An dieser Stelle nochmals Danke an @Endoro, der mir dabei geholfen hat! face-smile

Zeilen 14-28:
Da wir aber nicht die selben Drucker des ALTEN Druckservers wieder installieren möchte, weil das relativ sinnfrei wäre, muss der Servername in der zuvor durch sed bearbeiteten Text-Datei durch den Namen des NEUEN Printservers ersetzt werden. Die einzigen Änderungen die Ihr vornehmen müsst, sind die ersten 4 SET-Zeilen. Das Ergebnis wird in der Ziel-Datei gespeichert.

Zeilen 30-44:
Auch der Servername des Standarddruckers, den wir oben ermittelt und separat in einer Text-Datei abgespeichert haben, muss durch den NEUEN Namen ersetzt werden. Gleiche Prozedur, gleiche Änderungen notwendig.

Zeile 45:
Mit Hilfe des "con2prt.exe /c" Befehls werden die zuvor ursprünglich installierten Drucker, nun jedoch unter NEUEM Server installiert.

Zeilen 46-47:
Mit Hilfe des "con2prt.exe /cd" Befehls wird der eingerichtet, der in der Textdatei durch das Windows-spezifische Skript abgespeichert wurde.

Zeile 48:
s.o.

Zeilen 50-54:
Alle für das Skript notwendigen Text-Dateien, bis auf die für den weiteren Verlauf relevante Datei aus Zeile 48, werden gelöscht, da sie nicht mehr benötigt werden.


Ich hoffe es ist alles verständlich formuliert und falls ich auch nur einer weiteren Person damit helfen kann/konnte, freue ich mich. face-smile

Grüße, narthan

Content-ID: 224328

Url: https://administrator.de/contentid/224328

Ausgedruckt am: 22.11.2024 um 06:11 Uhr

qualidat
qualidat 12.12.2013 aktualisiert um 14:29:05 Uhr
Goto Top
Wenn der Druckserver über seinen Namen aufgelöst wird, dann nenn doch den Neuen genau so wie den Alten (der dann vom Netz muss) und gut ist - oder nicht?
narthan
narthan 13.12.2013 um 08:21:01 Uhr
Goto Top
Moin qualidat

Zitat von @qualidat:

Wenn der Druckserver über seinen Namen aufgelöst wird, dann nenn doch den Neuen genau so wie den Alten (der dann vom
Netz muss) und gut ist - oder nicht?

Theoretisch liegst du damit richtig, allerdings wurde in unserem Bsp. der alte Druckserver nicht aufgelöst. Über ihn laufen noch diverse alte Programme, die erst in den kommenden Wochen erneuert werden. Daher blieb nur ein neuer Name übrig ;) So konnten wir übrigens auch die Treiber vom alten auf den neuen Server packen, ohne erneutes Heraussuchen im Internet.

Gruß, narthan
Dani
Dani 26.12.2013 um 22:20:33 Uhr
Goto Top
Zitat von @qualidat:

Wenn der Druckserver über seinen Namen aufgelöst wird, dann nenn doch den Neuen genau so wie den Alten (der dann vom
Netz muss) und gut ist - oder nicht?
Das wird z.B. schwer wenn es viele Drucker sind. Wir haben auf einem Printserver ca. 400 Drucker. Das dauert seine Zeit. Oft wurden spezielle Einstellungen hinterlegt. Somit kann ich auf den alten Server nachschauen und übernehmen.
Vllt wäre es sinnvoll den alten und neuen Printservernamen am Anfang abzufragen um diese später in Variable zu wenden?!


Grüße,
Dani
spankyham98
spankyham98 26.01.2016 um 15:43:22 Uhr
Goto Top
Hallo,

wir sind aktuell dabei mit der o. g Batchdatei unsere User auf einen neuen Printserver umzuziehen. Angepasst haben wir dafür bisher folgendes:

- Zeilen 16, 17, 32 und 33 mit useren entsprechenden Printservernamen gefüllt
- alle Zeilen angepasst die "C:\temp" als Verzeichnis anzeigen -> ersetzt durch einen Laufwerksbuchstaben, auf welchen der User Vollzugriff hat
- Programm GnuWin32 auf beiden Printservern installiert
- angepasste Batchdatei, con2prt.exe, benötigte Programmbibliotheken (libiconv2.dll, libintl3.dll, regex2.dll) von sed.exe und sed.exe in ein Verzeichnis abgelegt auf welches der User Vollzugriff hat

Testweise hat die Änderung bei einem User schon funktioniert, der die Batchdatei manuell ausgeführt hat.

Leider scheitert der Versuch die Batchdatei als Anmeldeskript über eine GPO zu verteilen... Die Batchdatei wurde dafür lediglich als Anmeldeskript unter User Configuration->Policies->Windows Settings->Skripts(Anmelden/Abmelden) abgelegt. Nach der Anmeldung taucht die Textdatei "Printer_Migration" im angegebenen Verzeichnis auf, die alten Drucker wurden allerdings nicht ersetzt.

Gibt es jemanden der dies bereits über eine GPO erfolgreich durchgeführt hat?

Gruß
spankyham98