{{tag> D}} ====== Postsync-Script kombiniert mit Aufgabenplanung ====== ===== Automatische Installation von Netzwerkdruckern - raumweise ===== ==== Konzept: Postsync mit Aufgabenplanung mischen ==== Mit den //Printing_Admin_Scripts// können Drucker unter Windows XP und 7 scriptgesteuert installiert werden. Ich habe dies so realisiert, dass ich ein batch-Script in die Aufgabenplanung aufgenommen habe, welches bei jedem Rechnerstart ausgeführt wird. Dies muss im image verewigt werden. Dieses batch-Script startet dann die Druckerinstallation. Mit diesem Mechanismus kann man eigentlich alles Mögliche nach der Syncronisation anstellen, deshalb habe ich die Scripte modularisiert. Wer nur Drucker installieren möchte kann alles auch in ein script packen. Abgeschaut habe ich die Grundidee vom VAMT-Konzept. Die Konfigurationsdatei und die Druckertreiber, etc. liegen auf dem Server und werden während des postsync auf den Windowsclient kopiert. Die PCs haben Namen wie r102pc03. Für dieses Namensschema wird bei jedem PC in einem Raum der entsprechende Drucker eingerichtet. ==== Verzeichnisse und Dateien ==== Die folgenden Dateien und Verzeichnisse unter ''C:\linuxmuster'' anlegen. Datei ''C:\linuxmuster\linbo_postsync_system.bat'' @echo off & setlocal enabledelayedexpansion rem Diese script sollte als geplanter task nach dem Rechnerstart ausgeführt werden, rem als Benutzer pgmadmin wählen. (Als SYSTEM geht es irgendwie nicht) set WorkDir=C:\linuxmuster rem Prozesssteuerung durch lockfiles: Das script wird nur vollständig ausgeführt, wenn postsync_system_todo vorhanden ist. set ToDo=%WorkDir%\postsync_system_todo set Doing=%WorkDir%\postsync_system_doing set Done=%WorkDir%\postsync_system_done rem Daten von Linuxmuster auslesen set raum=%COMPUTERNAME:~0,4% :main if exist "%Done%" goto eof if exist "%Doing%" goto error move /Y %ToDo% %Doing% rem rem Drucker installieren rem SET drucker_bat=%WorkDir%\drucker\drucker_installieren.bat SET drucker_conf=%WorkDir%\drucker\drucker.conf FOR /F "eol=# delims=" %%i in (%drucker_conf%) do Call :splitline "%%i" GOTO :done :splitline FOR /F "tokens= 1,2,3,4,5 delims=;" %%i in (%1) do set "bla=%%i" & set "ble=%%j" & set "bli=%%k" & set "blo=%%l" & set "blu=%%m" IF %raum%==%bla% call %drucker_bat% "%ble%","%bli%","%blo%","%blu%" >> %Doing% GOTO :eof :done move /Y %Doing% %Done% goto :eof :error echo "Es ist ein Fehler bei der Bearbeitung aufgetreten" :eof Datei ''C:\linuxmuster\linbo_postsync_todo'' ist leer und dient als Marker, dass das script noch nicht ausgeführt wurde Verzeichnis '' C:\linuxmuster\drucker'': hier Konfigurationdatei, Drucker_Installations_Script und Verzeichnisse mit Druckerdateien Datei ''c:\linuxmuster\drucker\drucker.conf'' : # drucker.conf: 5 Einträge durch Strichpunkt getrennt, ohne Leerzeichen # # Raum ; Drucker .inf-Datei und Treiber ; Name für Drucker ; Name aus .inf-Datei ; IP des Druckers # r206;c:\linuxmuster\drucker\HP4700;Lehrerzimmer HP;HP Color LaserJet 4700 PCL 6;10.16.206.240 r206;C:\linuxmuster\drucker\Samsung;Lehrerzimmer Samsung;Samsung CLP-650 Series PCL 6;10.16.206.241 Verzeichnis ''c:\linuxmuster\drucker\HP4700'' mit inf- und cab-Dateien z.B für den HP LaserJet 4700 Datei ''c:\linuxmuster\drucker\drucker_installieren.bat'' : @echo off rem dies script erwartet vier Parameter: rem %1 Pfad zum Verzeichnis mit inf-Datei und Treiber-Datei rem %2 Druckername : ist beliebig rem %3 Druckertyp : muss mit den Name in der inf-Datei übereinstimmen rem %4 IP-Adresse : Wie der drucker eingestellt ist rem Quelle:http://hamsterhirn.de/index.php/2011/12/einen-drucker-automatisiert-installieren-mit-einem-batch-skript/ rem An Linuxmuster angepasst: Helge Münnich, Merian-Schule, Freiburg echo %~1 echo %~2 echo %~3 echo %~4 SET InfPath=%1 SET PrnName=%2 SET PrnType=%3 SET PortIP=%4 systeminfo | find "Windows 7" if %ERRORLEVEL% == 0 goto Win7 systeminfo | find "Windows XP" if %ERRORLEVEL% == 0 goto WinXP :Win7 echo Running Windows 7 Script rem check if 32 or 64 bit Set RegQry=HKLM\Hardware\Description\System\CentralProcessor\0 REG.exe Query %RegQry% > C:\Windows\Temp\checkOS.txt Find /i "x86" < C:\Windows\Temp\CheckOS.txt > C:\Windows\Temp\StringCheck.txt If %ERRORLEVEL% == 0 ( Echo "This is 32 Bit Win7" rem Lehrerzimmer HP cscript C:\Windows\System32\Printing_Admin_Scripts\de-DE\prnport.vbs -a -r IP_%PortIP% -h %PortIP% -o RAW -n 9100 cscript C:\Windows\System32\Printing_Admin_Scripts\de-DE\prndrvr.vbs -a -m %PrnType% -v 3 -e "Windows NT x86" -i %InfPath% cscript C:\Windows\System32\Printing_Admin_Scripts\de-DE\prnmngr.vbs -a -p %PrnName% -m %PrnType% -r IP_"%PortIP%" rem Lehrerzimmer Samsung ) ELSE ( Echo "This is 64 Bit Win7" ) goto exit Diese batch-Datei bietet die Möglichkeit für Windows XP bzw. für 64bit Win7 angepasste Befehle einzubauen. Die haben wir nicht - kann ich also nicht beitragen ... ==== Erster Test ==== Die Datei ''linbo_postsync_system.bat'' in der Eingabeaufforderung (cmd) als Administrator ausführen. Aus ''postsync_system_todo'' sollte ''postsync_system_done'' geworden sein. In der neuen Datei steht die Ausgabe der Druckereinrichtung evtl. mit Hinweisen zu Fehlern. Vor einem neuen Test done bzw. doing in todo umbenennen, sonst tut sich nichts. Der Drucker sollte nun verfügbar sein. ==== Aufgabenplanung einrichten ==== In der Aufgabenplanung von Windows eine neue Aufgabe anlegen, die die Aktion ''C:\linuxmuster\linbo_postsync_system.bat'' bei jedem Start ausführt. Eigentlich wollte ich dien Task als SYSTEM ausführen lassen, aber das geht aus irgendeinem Grund (welchen???) für Drucker nicht nicht; bei VAMT läuft die Aufgabe als SYSTEM. Ich lasse diese Aufgabe also als pgmadmin laufen; das Passwort wird beim Anlegen einmal abgefragt und gespeichert. ==== Zweiter Test ==== Drucker löschen, ''postsync_system_done'' wieder zu todo umbenennen, Rechner neu starten. Der Drucker sollte nach einer Weile - kann nach dem Start noch ein, zwei Minuten gehen - installiert sein . Wenn der Test erfolgreich ist, **muss man nun von diesem Rechner ein Image anlegen**, damit die Aufgabenplanung verewigt wird. Davor kann/sollte man die Druckerdateien löschen, aber erst nachdem diese auf den Server kopiert wurden, siehe unten. ==== Postsync Script ==== Zu jedem image gibt es auf dem Server unter ''/var/linbo'' eine postsync-Datei ''image.cloop.postsync''. Meine sieht so aus: # $Id: win7-reactivate.postsync 998 2011-03-10 09:23:25Z tschmitt $ echo "##### POSTSYNC BEGIN #####" # Ggf. anzupassende Variablen. # cil-Datei muss unter /var/linbo auf dem Server liegen. mycil="schule.cil" # Zielverzeichnis auf der Betriebssystempartition. mytarget="cil" # Server-IP wird berechnet. myserverip="$(grep ^linbo_server /tmp/dhcp.log | tail -1 | awk -F\' '{ print $2 }')" # Wenn Netzwerkverbindung vorhanden ist, lade die cil-Datei in eine temporäre # Datei in den lokalen Cache herunter. if ! localmode; then echo "Lade $mycil herunter ..." rsync -L "$myserverip::linbo/$mycil" "/cache/${mycil}.tmp" fi # Wenn temporäre cil-Datei vorhanden ist, benenne sie um. [ -s "/cache/${mycil}.tmp" ] && mv "/cache/${mycil}.tmp" "/cache/$mycil" # Ist cil-Datei im lokalen Cache vorhanden, kopiere sie in den Ordner $mytarget # auf der Betriebssystempartition. if [ -s "/cache/$mycil" ]; then echo "Kopiere $mycil nach /mnt/$mytarget ..." mkdir -p "/mnt/$mytarget" cp "/cache/$mycil" "/mnt/$mytarget" fi # # linuxmuster-Verzeichnis muss unter /var/linbo/postsync auf dem Server liegen. # Zielverzeichnis auf der Betriebssystempartition. mytarget_dir="linuxmuster" # Wenn Netzwerkverbindung vorhanden ist, lade die Dateien in eine temporäreen # Datei in den lokalen Cache herunter. #if ! localmode; then # echo "Lade $mytarget_dir herunter ..." # rsync -rL "$myserverip::linbo/postsync/$mytarget_dir/" "/cache/${mytarget_dir}.tmp" #fi echo "loeschen alte Dateien" if [ -f "/mnt/${mytarget_dir}/postsync_system_todo" ] ; then rm "/mnt/${mytarget_dir}/postsync_system_todo" fi if [ -f "/mnt/${mytarget_dir}/postsync_system_done" ]; then echo "loesche alte done-Datei /mnt/${mytarget_dir}/postsync_system_done" rm "/mnt/${mytarget_dir}/postsync_system_done" fi if [ -f "/mnt/${mytarget_dir}/postsync_system_doing" ]; then echo "loesche alte doing-Datei" rm "/mnt/${mytarget_dir}/postsync_system_doing" fi echo "Lade $mytarget_dir herunter ..." rsync -r "$myserverip::linbo/postsync/${mytarget_dir}/" "/mnt/$mytarget_dir" echo "##### POSTSYNC END #####" Ab #linuxmuster kommt mein Teil. Dieser Teil gleicht das Verzeichnis ''/var/linbo/postsync'' mit dem Verzeichnis ''c:\linuxmuster'' auf dem Windows-Client ab und stellt sicher, dass die Todo-Datei alleine vorhanden ist. D.h. man muss vorher alles von ''c:\linuxmuster'' nach ''/var/linbo/postsync'' kopiern, damit es funktioniert. Genau genommen könnte man nun auch den Inhalt von ''c:\linuxmuster'' löschen - ich habe nur die Treiber-Dateien gelöscht. ==== Dritter Test ==== Rechner syncen. Will man nun einen neuen Drucker installieren, ergänzt man die Daten in ''/var/linbo/postsync'' und nach dem nächsten sync stehen diese Dateien auf dem Client zur Verfügung und der Drucker wird installiert.