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