Inhaltsverzeichnis

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.