cpau habe ich ja bereits vorgestellt. Sinn und Funktionsweise setze ich hier voraus 🙂
Das Ausführen von CPAU Jobs vom Netzlaufwerk funktioniert aufgrund von simplen Windows Sicherheitsprinzipien nicht. Schließlich hat ein lokales Administratorkonto kein Zugriff auf Netzlaufwerke, die ja einen Domänenaccount benötigen. Also brauche ich ein Workaround, wenn ich automatisierte Softwareinstallationen auf einem UNC Share im Unternehmen bereitstellen will.
Ziel soll es sein, jedem eingeschränkten Nutzer Admin-Softwareinstallationen dank CPAU vom Netzlaufwerk aus bereitzustellen:
So wird es dann aussehen. Der Nutzer bewegt sich auf dem Netzlaufwerk, starte eine Batch und die Installation mit Adminrechten wird gestartet.
Kurz zum Verständnis:
Der Aufbau eines cpau Systems (mit Jobs) ist grundsätzlich recht einfach:
1 Batch Script ist für den Benutzer („Userscript“). Bei Doppelklick führt es die gespeicherte Job Datei aus. Die Job Datei führt wiederum ein Login auf das Administratorkonto durch und startet eine Datei oder ein Script („Ziel-Datei/Installer“) mit den entsprechenden Rechten. Für den Benutzer müssen weder Job Datei noch die Ziel-Datei sichtbar sein.
Das Verzeichnis mit den Benutzerscripten und das Verzeichnis mit den Job- und Ziel-Dateien.
Wären Netzlaufwerke erlaubt müsste das Benutzerscript nur 1 Zeile haben:
bash“>“\\Server\Pfad\zu\cpau.exe“ -dec -file „\\Server\Pfad\zu\jobfile.job“ -nowarn -lwp
Das geht natürlich nicht. In der Job sind die Administratorcredentials gespeichert, beim Start von cpau wird das working dir auf einen lokalen Pfad gelegt und der Administrator kommt auch nicht mehr an den Server. Es bleibt nur eine Lösung: alles, was benötigt wird, lokal zu kopieren und damit lokal zu arbeiten.
Hier das Userscript:
winbatch“ line=“1″>
@echo off
echo Verzeichnis erstellen und reinigen
if not exist c:\temp md c:\temp >> nul
del c:\temp /f /s /q >> nul
echo Job Files und Ziel-Dateien lokal kopieren
copy \\Server\Pfad\zu\den\Installer\und\Jobfiles c:\temp /y >> nul
echo Lokale Jobfile ausführen
c:\temp\cpau.exe -dec -file „c:\temp\notepad.job“ -nowarn -lwp
echo Verzeichnis löschen, 1 Ziel-Datei ist in Benutzung und bleibt übrig
del %wdir% /f /s /q >> nul
Das mag jetzt etwas unübersichtlich aussehen, ist aber ein einfaches Prinzip.
Es wird ein lokaler Ordner erstellt, falls noch nicht vorhanden. Der Inhalt des Ordners wird gelöscht, falls der Ordner existieren sollte und sich noch Dateien darin befinden. Dann wird der Ordner vom Netzlaufwerk, in dem Installer und Jobfiles liegen in diesen lokalen Ordner kopiert. Die nun lokal liegende Jobfile kann jetzt ausgeführt werden. Danach wird der Ordnerinhalt gelöscht. Fertig.
Der Benutzer startet dieses Userscript vom Netzlaufwerk aus und bekommt von der ganzen lokalen Geschichte nichts mit, einige Sekunden später startet einfach die administrative Installation, die das Userscript schließlich ja hervorbringen sollte.
Nun müsst ihr das Jobfile speziell für diesen Fall generieren. Erstellt euch den temporären Ordner, falls noch nicht vorhanden. Pfad und Name genauso wie in dem Userscript benutzt. Kopiert dort den gewünschten Installer oder Ziel-Datei hinein und erstellt die Job File mit folgender Codezeile:
cpau.exe -u Administrator -p PaSsWoRt -ex „c:\temp\installer.exe“ -crc „c:\temp\installer.exe“ -enc -file „\\beliebiger\lokaler\oder\serverpfad\installer.job“
Wichtig ist, dass ihr die Jobfile mit den lokalen Pfaden der Ziel-Datei erstellt. Der Installer muss in dem selben lokalen Verzeichnis liegen, wie die Dateien durch das Userscript kopiert werden.
Ich nutze das System, wie man auf den Screenshots oben sieht, bereits produktiv im Unternehmen und es kommt sehr gut bei den Mitarbeitern an. Sollte es über einfache Aufgaben hinausreichen, bietet es sich an, das Script zu verbessern. Hier ist meine Version des Userscripts:
winbatch“ line=“1″>
@echo off
echo Variablen erstellen…
set log=\\server\laufwerk\Computer\Software\GPOs_Install\PC-Data\Updatelogs\Programmupdates.txt
set wdir=c:\updatetemp
set updatedir=\\server\laufwerk\Computer\Software\GPOs_Install\Updates\
set /a loop=0
echo Verzeichnis erstellen, reinigen und kopieren…
echo %computername% – %username% – %date% %time% startet Notepad++ Installer >> %log%
if not exist %wdir% md %wdir% >> nul
del %wdir% /f /s /q >> nul
:kopieren
set /a loop=%loop%+1
if %loop%==4 goto :Fehler
copy „\\server\laufwerk\Computer\Software\cpau.exe“ %wdir% >> nul
if errorlevel 1 goto :kopieren
copy %updatedir% %wdir% /y >> nul
if errorlevel 1 goto :kopieren
echo Installation starten…
%wdir%\cpau.exe -dec -file „%wdir%\notepad.job“ -nowarn -lwp
echo Verzeichnis löschen…
del %wdir% /f /s /q >> nul
echo %computername% – %username% – %date% %time% beendet Notepad++ Installer >> %log%
echo ################ >> %log%
goto :eof
:Fehler
echo.
echo ### Fehler beim Kopieren ###
echo Bitte informieren Sie die EDV Abteilung.
pause
goto :eof
Alle Pfade werden in Variablen gespeichert und erleichtern die Übersicht im Script. Ein Logfile wird beim Start und beim Beenden einer Softwareinstallation (hier im Beispiel Notepad++) beschrieben und ermöglicht mir das (noch relativ grundlegende ^^) Troubleshooting, falls es zu Problemen kommen sollte. Der Kopiervorgang des Installer- und Jobordners wird mit errorlevel überwacht und in einer Schleife wiederholt, sollte er fehlschlagen. Schlägt er zu oft fehl, wird eine Fehlermeldung ausgegeben. Läuft alles gut (das war bis jetzt immer der Fall), so wird die Job gestartet und der lokal liegende Installer mit dem lokalen Administrator ausgeführt.
Was der Benutzer sieht, zeige ich in dem Video ganz oben. Das passiert im Hintergrund:
Der Nachteil wird schnell klar: je mehr Softwareinstallationen ich bereitstelle und je größer die Produkte sind desto länger dauert der Kopiervorgang für jeden Benutzer bei jeder Installation, da immer der ganze Ordner kopiert wird. Das könnte man ganz leicht umgehen, in dem man in jedem Script nur die Dateien kopieren lässt, die auch wirklich benötigt werden, z.B. %programm%.job und %programm%.exe. Sollte ich das demnächst noch so programmieren werdet ihr es erfahren.
Bei Fragen und Anregungen mail me 🙂
Ich hätte mal eine Frage zu folgendem Abschnitt aus dem Skript:
Wenn jetzt der errorlevel 1 ist, dann geht der wieder zu :kopieren und setzt loop hoch. Wenn das ganze dann wieder fehlschlägt (das wäre ja dann wieder errorlevel 1 oder?) dann geht er wieder zu kopieren. Ist irgendwann der Errorlevel mal nicht 1, selbst wenn es fehlschlägt (wird der dann größer, also 2?), damit das Skript zur loop-Wert-Abfrage kommt?
Ist dort ein Strukturfehler im Skript (Endlosschleife wenn das kopieren nicht geht)?
Ich frage nur, da ich selber (fast) keine Ahnung von Batch-Skript habe, aber doch noch was dazu lernen will 😉
Stimmt, die Absicherung läuft nicht, wenn das erste copy (cpau.exe) fehlschlagen sollte. Da muss noch gefeilt werden.
Sinnvoller wäre:
Jetzt müsste es fehlerfrei laufen, oder?
edit: Danke übrigends 🙂 Hab es im Artikel angepasst.
Bitte Bitte.
Genau so hätte ich das auch gemacht – ich war mir halt nur nicht sicher wie das mit dem Errorlevel ist.
Ich verstehe ehrlich gesagt nicht so ganz, was du mit dem Nachteil am Ende des Artikels meinst. Die Dateien sind doch alle für das Programm wichtig – ansonsten würden die doch nicht mitgeliefert werden. Selbst wenn du es hinkriegen würdest, nur den Installer runterladen zu müssen, dann würde dieser selbstständig alle weitere Dateien transparent nachladen müssen – die Menge der übertragenen Dateien bleibt also gleich (nur das du im zweiten Fall nicht selber für die Übertragung zuständig bist).
Da hast du mich missverstanden.
Es geht um den Befehl
copy %updatedir% %wdir% /y >> nul
dieser kopiert das Updateverzeichnis, im dem die Installer liegen, in das Working Directory, lokal auf C.
Der Befehl copy kopiert den kompletten Ordnerinhalt.
Der Updateverzeichnis beinhaltet aber mittlerweile einige Programminstaller und jobs und es werden momentan wöchentlich mehr Programme, die wir mit dieser Methode freigeben.
Und da jedes mal der komplette Ordnerinhalt kopiert wird, und nicht nur der 1 Installer, der für das Programm nötig wäre, dauert der Kopiervorgang immer länger, bevor die Installation startet.
Besser wäre immer
copy %updatedir%\programm.exe %wdir% /y >> nul
copy %updatedir%\programm.job %wdir% /y >> nul
Somit würde immer nur der Teil des Ordners kopiert, der benötigt wird.
Das ergänze ich vielleicht noch.
Achsooo… 😀
Die Arbeit am Computer ist schön und gut, aber ich finde, dass man bei solch einem Job ganz dringend einen Ausgleich in Form von sportlichen Aktivitäten benötigt. Hier sollten viele Unternehmen noch viel mehr für ihre Mitarbeiter anbieten.
Was hat das jetzt mit dem Thema zu tun? Inwiefern sich jeder IT Mitarbeiter in seiner Freizeit sportlich betätigt ist doch jedem selbst überlassen. Man kann Nachmittag zu McFit gehen oder man kann es lassen aber es ist ja wohl kaum Pflicht des Arbeitgebers sich um die sprtlichen Aktivitäten der Arbeitnehmer zu kümmern.