Folgendes Phänomen: Die Fehlermeldung „Element wurde nicht gefunden“ wird bei jeder Ordneraktion (Erstellen, Löschen, Verschieben, Umbenennen) angezeigt. Der Ordner existiert natürlich. Nach einem Klick auf „Wiederholen“ wird die Aktion fehlerfrei durchgeführt.
Dieses Problem bekam ich vor kurzer Zeit an meinem privaten PC. 1, 2 Wochen später das Selbe auf Arbeit. Zeit eine Lösung zu finden. Und die fand ich im Antary Blog von Tobias (btw: Lesetipp). Er hatte das Problem ebenfalls und hat eine Lösung im Netz gefunden, einen Registry Fix:
Schritt 1: Registry Fix (KB980408_fix.reg) herunterladen und per Doppelklick anwenden
Registry Key anwenden, PC neustarten und das Problem ist behoben.
Sollte das doch noch nicht reichen gäbe es hier noch eine Lösung, die aber nicht mehr so richtig zu funktionieren scheint: Wer Windows Updates automatisch bezieht kann meistens Schritt 1 überspringen, da das Update auf aktuellen Windows 7 PCs schon installiert ist. Wer auf Nummer Sicher gehen möchte, Schritt 2: Update KB 980408 installieren (x86, x64)
Über den Ursprung kann man nur Rätseln. Tobias vermutet, dass der nur Fehler auftritt, wenn man Bibliotheken Explorer Tweaks angewendet hat. Z.B. die Bibliotheken aus dem Dateibrowser entfernen, nicht anzeigen lassen o.Ä. Da ich diese Tweaks sowohl zu Hause als auch auf Arbeit durchgeführt habe, könnte da was dran sein.
Es kann vorkommen, dass eine Softwareinstallation via GPO nicht so rund läuft und die Software fehlerhaft installiert wird. Die Gruppenrichtlinie sieht die (fehlerhaft) installierte Software und hakt diesen Punkt also ab, die Softwareinstallation bleibt fehlerhaft. Wenn nun auch die manuelle Deinstalltion der Software nichts daran ändert und die Gruppenrichtlinie immernoch nicht die Software neu zuweisen will, muss ein Trick her. Grundsätzlich kann natürlich mein Guide zum Troubleshooten von GPO-/Softwareinstallationsfehlern helfen.
Ich möchte jetzt aber noch einen Trick ergänzen, den ich gestern entdeckt habe.
Grundsätzlich hilft bei diesem Problem (Installation fehlerhaft, Deinstallation wird nicht erkannt) wie erwähnt das Löschen des Registry Keys
und die komplette Gruppenrichtlinie wird erneut angewandt.
Wenn in der Softwareinstallation nun aber 5-10 Programme stehen und dann alle neu installiert werden ist das eine wirklich zeitraubende Lösung. Möglicherweise verlorene Programmfeatures, Updates, Pakete, Einstellungen durch die Neuinstallation sind auch oft ärgerlich. Also wäre es besser nur die Installation zurückzusetzen, die tatsächlich fehlerhaft ist.
Geht in den Group Policy Key (siehe oben), dort in „AppMgmt“ und ihr werdet einige GUID Schlüssel sehen. Jeder Schlüssel representiert eine Softwareinstallation. Klickt eine GUID an und schaut euch den Wert „Deployment Name“ an, dort steht der Softwarename, den ihr in der GPO vergeben habt. Löscht den Schlüssel der fehlerhaften Software und startet den Computer neu.
Die GPO wird jetzt diese Software neu installieren. Gibt es immernoch Probleme dann deinstalliert die Software erneut, löscht alle Spuren (Regcleaner wie CCleaner), löscht den eventuell verbliebenen Installerverweis mit Microsoft Installation CleanUp Utility, löscht nochmal den Registry Key und rebootet nochmal den PC. Spätestens jetzt sollte die Software so korrekt installiert werden. Wenn nicht liegt der Fehler eher woanders 😉
Im Windows Server 2008 ist das Backup Tool „Windows Server Backup“ enthalten.
Edit/Update: Diese Serversicherung (vor allem die später beschriebene automatische Sicherung per Script) ist ein Feature von Windows Server und muss als solches also erst installiert werden. Geht dazu in den Server-Manager, auf „Features hinzufügen“ und installiert die komplette „Windows Server-Sicherungsfeatures“. Für die Befehlszeilenvariante muss auch „Windows Powershell“ mitinstalliert werden.
Mit diesem Feature sind Backups schnell erstellt, manuell oder auch automatisch. Die automatische Erstellung von Server Backups wird durch einen simplen „Sicherungszeitplan“ ermöglicht. Bei der Erstellung eines solchen Plans stehen allerdings nur 2 Zeitspannen zur Verfügung: täglich und mehrmals täglich. Für eine seltenere Sicherung ist keine Option vorgesehen. Möchte man nun doch flexibler Backups erstellen ist ein Workaround angebracht.
Meine spontane Idee war ein Backup per Batch und diese dann per Taskplaner timen.
Wie erstellt man ein Backup per Batch? Hier der Befehl:
gibt an, dass mit dem Volume Shadow Copy Service die History aller Dateien aktualisiert wird. Mehr Infos erhaltet ihr mit
wbadmin start backup /?
. Backups die mit Hilfe der Batch erstellt wurden werden auch im „Windows Server Backup“ Tool gelistet und können dort auch ganz normal benutzt werden. Also es geht keinerlei Funktionalität durch die CMD verloren.
Die erstellte Batch können wir jetzt per „Aufgabenplanung“ automatisch ausführen lassen, in meinem Fall einmal wöchentlich. Um eine etwas bessere Kontrolle über das Ergebniss der Sicherung zu haben empfehle ich die Batch auszubauen:
Wir setzen den Pfad zu einer Logdatei in die Variable
logfile
und geben vor dem Backupvorgang und danach einige Informationen dazu. An unsere bekannte Zeile 4 hängen wir die Umleitung
>> %logfile%
an. Die Textdatei sieht nach einem Backupvorgang ungefähr so aus:
Der Aufgabenplaner sollte die Batch nach Plan ausführen, diese sollte ein tolles Backup erstellen und den Vorgang in die Logdatei schreiben und das Server Backup Tool sollte die Sicherung erkennen. Links die manuellen Tests und rechts das Backup am Samstag.
Das wars! Vielleicht etwas unprofessionell aber es funktioniert 1A!
Update: Ich habe das Script noch weiter ausgebaut und möchte euch das natürlich nicht vorenthalten. Das Sicherungsziel wird jetzt über eine Variable angesprochen. Diese wird erst auf Ort 1 gesetzt und falls dieser – aus welchen Grund auch immer – nicht erreichbar ist wird ein Ort 2 als Alternative gesetzt. Hier ließen sich natürlich weitere Alternativen einbauen, es sollte aber eher die Bemühung es Admins sein, einen zuverlässigen Ort zu arrangieren 😉 Das Backup wird jetzt mit -allCritical und -systemState ausgeführt und sicher somit systemkritische Dateien aller Art mit. Update 20.07.2011: -systemState gibt es nicht mehr!? Vorerst entfernt. Bei einem Fehlschlag wird die Logdatei entsprechend geschrieben und eine Alarmmail via Batch Mailer an die Admins abgesetzt. Wie ihr diesen Batch Mailer aufsetzt steht hier.
@echo on
if not exist Z: net use Z: \\server\*** /user:***
set logfile="C:\backuplog.txt"
::error mail reciever
set mailto=***@***.***
for /f "skip=1 tokens=2 delims=[]" %%* in ('ping.exe -n 1 -4 %computername%') Do (set "IP=%%*")
for /f "tokens=1,2,3,4 delims=." %%a in ("%IP%") do set IPb1=%%a&set IPb2=%%b&set IPb3=%%c&set IPb4=%%d
set target=\\server\***
echo ########################## %computername%: %date% - %time% >> %logfile%
echo. >> %logfile%
wbadmin start backup -backuptarget:%target% -include:C: -vssfull -allCritical -quiet >> %logfile%
set backuperrorlevel=%errorlevel%
if "%backuperrorlevel%"=="0" (goto end) else (goto fehler)
:fehler
echo. >> %logfile%
echo. >> %logfile%
echo ______________________________ >> %logfile%
echo ****************************** >> %logfile%
echo ****************************** >> %logfile%
echo Ein Fehler ist aufgetreten!! >> %logfile%
echo ****************************** >> %logfile%
echo ****************************** >> %logfile%
echo Errorlevel: %backuperrorlevel% >> %logfile%
echo. >> %logfile%
echo. >> %logfile%
:: Batch Mailer
:: http://hannes-schurig.de/23/06/2011/batch-mailer-email-aus-batch-script-schicken/
:: sendet eine Mail an und meldet fehlgeschlagenes Backup
start "iexplore" "https://stuff.it-stack.de/mailer.php?******&contactname=.%IPb4% %computername%&subject=Backup fehlgeschlagen &email=***@***.***&message=Das woechentliche automatische Backup auf: .%IPb4% "%computername%" ist fehlgeschlagen || Errorlevel: %backuperrorlevel%&mailto=%mailto%"
::20 Sekunden warten und Internet Explorer Fenster schließen
ping 127.0.0.1 -n 20
taskkill /im "iexplore.exe"
ping 127.0.0.1 -n 5
:end
echo. >> %logfile%
echo ########################## %computername%: %date% - %time% >> %logfile%
echo ########################### Errorlevel: %backuperrorlevel% >> %logfile%
echo. >> %logfile%
exit
To-Do: Logdatei beim Fehler als E-Mail Anhang mitschicken. Keine Ahnung, wie ich das mache. Ideen?
Java 8 ist mittlerweile bei Update 25 angekommen und ein Upgrade von 7u67 auf 8u25 ist sicher eine gute Idee. Also wollte ich mein bestehendes Verteilungsscript für Java im Unternehmen auf die neue Version umstellen. Das war jedoch nicht so einfach und die Verteilung musste umgebaut werden. Demnach hier das Update der Verteilung.
exe Installer
Die .exe Installer, die auf der Java Homepage zur Verfügung stehen, funktionieren gut für die Verteilung:
Sollte eine Verteilung über MSI gewünscht werden, geht das natürlich auch. Dazu einfach den .exe Installer per Doppelklick starten und die MSI aus dem Ordner AppData\LocalLow\Sun\Java\[Version] ziehen.
Das MSI Paket muss jedoch erst angepasst werden, es werden sonst verschiedene 16XX msiexec Fehlercodes zurückgeliefert. Hier sind zwei Seiten, mit denen ich gearbeitet habe: diese Seite und diese Seite. Da sollten keine Fragen offen bleiben.
Den fertigen Installer kann man jetzt mit folgender Zeile verscripten:
Die aktuellen Parameter für die 8er Version findet ihr hier.
Alte Versionen aufräumen
Neu in meinem Script ist die Deinstallation alter Versionen. Dies ist mit 3 Methoden machbar: über WMIC (Windows Management Instrumentation Commandline), einen generellen
msiexec /x{GUID}
Befehl oder mit der Installations-MSI.
WMIC:
Über den WMIC-Befehl
wmic product where "[filter product]" call uninstall" können Programme gezielt deinstalliert werden. Folgender Code deinstalliert Java-Produkte:
[crayon-5851b00cbfa96616214862 lang="shell" ]
wmic product where "name like 'Java %%'" call uninstall /nointeractive
wmic product where "name like 'Java%%'" call uninstall /nointeractive
wmic product where "name like 'Java(tm) %%'" call uninstall /nointeractive
wmic product where "name like 'J2SE Runtime Environment%%'" call uninstall /nointeractive
Mittlerweile setze ich ausschließlich auf die WMIC Variante, da diese zuverlässig und einfacher zu warten ist als die anderen Methoden.
Man kann aus der Registry auf jeden Fall die aktuellste Version auslesen, HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment. Problem: hier steht nur die aktuellste Version drin. Ich habe beispielsweise 7u71 und 8u25 installiert, da drin ist nur die 8er gelistet. Ist also schonmal riskant damit zu arbeiten. Alternativ könnte man im Windows Uninstall Key (HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall) nach Java Versionsnummern suchen, hier wird es erklärt. Aber auch hier müsste man alle Versionsnummern durchprobieren und auf Funde reagieren. Es gibt bereits ein Script, das mit dieser Uninstall Key Methode sucht und deinstalliert. Ist zwar vbs, aber egal. Hier auf IT-Ninja gleich das erste. Außerdem gibt es auch weitere Java Uninstaller/Cleanup Tools wie z.B. JavaRA (mehr dazu). Die Möglichkeiten sind also vielseitig.
Noch ein paar grundlegende Hinweise zur Installation und Deinstallation von Java per MSI auf dieser aktuellen Hilfeseite oder aus der (veralteten) Java Hilfe.
Deployment Script
Die neue Variable
cleanup
ermöglicht das Überspringen der Deinstallation der alten Java-Versionen.
cleanup=1
räumt dagegen alle Versionen (auch die aktuell installierte) einmal auf und installiert frisch. Das Cleanup ist standardmäßig deaktiviert. Update: 16.08.2016: Version 8u101 getestet und läuft. Info: Das im Skript verwendete Programm VersionCompare ist eine Eigenprogrammierung und hier als Download verfügbar.
Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.
@echo on && color 9f && setlocal
set wd=\\lea\Deployment\Software\Java
set tools=\\lea\Deployment\Sonstiges\tools
set cleanup=0
set versionEL=9
set javaEL32=9
set javaEL64=9
set javaregEL32=9
set javaregEL64=9
set retry=0
set instversion=0
set uninst=x
set pa=%processor_architecture%
REM:: ### HIER VERSION NACH UPDATE ANPASSEN ###
set main=8
set update=101
REM:: ############
set version=%main%u%update%
set alllog=%wd%\java-all.log
REM:: Clientfilter: nur die Computer aus der allowedPCs.txt dürfen installieren
REM::for /f %%f in (%wd%\allowedPCs.txt) do if "%computername%"=="%%f" goto check
REM::goto end
REM:: Clientfilter: die Computer aus der deniedPCs.txt dürfen nicht installieren
for /f %%f in (%wd%\deniedPCs.txt) do if "%computername%"=="%%f" goto end
:check
REM:: alte Kontrollen: Registry, Programmordner
REM:: 1) for /f "tokens=1,2,3 delims= " %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment" /v "Java7FamilyVersion"^|findstr "Java7FamilyVersion"') do set instversion=%%c
REM:: if not "%instversion%"=="1.%main%.0_%update%" goto cleanup
REM:: 2) if not exist "%programfiles%\Java\jre1.%main%.0_%update%" goto install
REM:: Aktuelle Kontrolle: Version aus java -version entnehmen und mit VersionCompare vergleichen
for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"') do set instversion=%%g
if "%instversion%" == "0" goto check2
if "%instversion%" == "" goto check2
set instversion=%instversion:~1,-1%
for /f "delims=._ tokens=1-4" %%v in ("%instversion%") do (
set instmain=%%w
set instupdate=%%y
)
goto compare
:check2
REM:: workaround if java -version check doesn't work
echo %date% %time:~0,8% - %computername% kann die Version nicht durch java -version bestimmen >> %alllog%
for /f "tokens=1-3" %%i in ('%tools%\sigcheck %ProgramData%\Oracle\Java\javapath\java.exe') do ( if "%%i %%j"=="File version:" set instversion=%%k )
if "%instversion%" == "0" set cleanup=1 & goto cleanup
if "%instversion%" == "" set cleanup=1 & goto cleanup
set instversion=%instversion: =%
set instversion=%instversion:~0,6%
for /f "delims=. tokens=1-4" %%v in ("%instversion%") do (
set instmain=%%v
set instupdate=%%x
)
goto compare
:compare
echo %date% %time:~0,8% - %computername% hat %instmain%.%instupdate% (%instversion%) installiert >> %alllog%
REM:: compare installed and desired versions now
%tools%\VersionCompare.exe "%instmain%.%instupdate%" "%main%.%update%"
set versionEL=%errorlevel%
if "%versionEL%"=="-1" goto cleanup
if "%versionEL%"=="0" echo %date% %time:~0,8% - %computername% hat bereits %instversion% installiert >> %alllog% & goto end
if "%versionEL%"=="1" echo %date% %time:~0,8% - %computername% hat bereits %instversion% (neuer) installiert >> %alllog% & goto end
goto end
:cleanup
if "%cleanup%"=="0" goto install
REM:: Deinstalliere 8er Versionen
taskkill /F /IM iexplorer.exe
taskkill /F /IM iexplore.exe
taskkill /F /IM firefox.exe
taskkill /F /IM chrome.exe
taskkill /F /IM jusched.exe
taskkill /F /IM jp2launcher.exe
taskkill /F /IM java.exe
taskkill /F /IM javaw.exe
taskkill /F /IM jqs.exe
wmic product where "name like 'Java %%'" call uninstall /nointeractive
wmic product where "name like 'Java%%'" call uninstall /nointeractive
wmic product where "name like 'Java(tm) %%'" call uninstall /nointeractive
wmic product where "name like 'J2SE Runtime Environment%%'" call uninstall /nointeractive
goto install
:install
if "%processor_architecture%"=="AMD64" goto inst64
REM:: .exe format: [version]u[update]-32/-64.exe, Beispiel: 7u45-32.exe, 7u45-64.exe
start /w %wd%\%version%-32.exe /s WEB_JAVA=1 SPONSORS=0 EULA=1 AUTO_UPDATE=0 INSTALL_SILENT=1 WEB_ANALYTICS=0
REM:: MSI INSTALLER CMD LINE: msiexec /i %wd%\%version%-32.msi /qn INSTALL_SILENT=1 WEB_ANALYTICS=0 EULA=0 REBOOT=0 SPONSORS=0
set javaEL32=%errorlevel%
:inst64
start /w %wd%\%version%-64.exe /s WEB_JAVA=1 SPONSORS=0 EULA=1 AUTO_UPDATE=0 INSTALL_SILENT=1 WEB_ANALYTICS=0
REM:: MSI INSTALLER CMD LINE: msiexec /i %wd%\%version%-64.msi /qn INSTALL_SILENT=1 WEB_ANALYTICS=0 EULA=0 REBOOT=0 SPONSORS=0
set javaEL64=%errorlevel%
REM:: 10 Sekunden Pause nach der Installation
ping localhost -n 10 >> nul
:verfication
REM:: existieren die Java Reg-Keys nach der Installation?
REM:: reg query "HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment" /f "1.%main%.0_%update%" /k
REM:: set javaregEL32=%errorlevel%
REM:: reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\JavaSoft\Java Runtime Environment" /f "1.%main%.0_%update%" /k
REM:: set javaregEL64=%errorlevel%
echo %date% %time:~0,8% - %computername%: %version%, install-errorlevel: 32: %javaEL32%, 64: %javaEL64% >> %alllog%
REM:: Error-Handling, Reaktion auf die 3 häufigsten msiexec Fehlercodes
if %javaEL32%==1618 goto retry REM:: msiexec process in use, installation already in progress
if %javaEL32%==1602 goto retry REM:: user canceled installation
if %javaEL32%==1603 goto retry REM:: fatal error, some use it for "already installed" (eg. java)
if %javaEL64%==1618 goto retry REM:: msiexec process in use, installation already in progress
if %javaEL64%==1602 goto retry REM:: user canceled installation
if %javaEL64%==1603 goto retry REM:: fatal error, some use it for "already installed" (eg. java)
goto end
:retry
if %retry%==1 goto retryfailed
echo %date% %time:~0,8% - %computername% hat nicht Errorlevel 00 erreicht, retry in 150Sek... >> %alllog%
set retry=1
REM:: 5 Minuten warten
ping localhost -n 150 > nul
goto install
:retryfailed
echo _!_ %date% %time:~0,8% - %computername% hat die Installation abgebrochen, RETRY FAILED! >> %alllog%
goto end
:end
endlocal
exit
Das funktioniert immernoch problemlos: (Errorcode 9 bei 32bit heißt, dass auf dem System keine 32bit Installation gefunden und diese übersprungen wurde)
Ich poste mal eben ein kleines Update meines Server Backup Scripts. Nichts spannendes, aber der Start des Scripts ist suboptimal. Dabei kann noch einiges schief gehen und ein Laufwerksbuchstaben zu verbinden ist für Scripts, die mit der Aufgabenplanung ausgeführt werden, besonders sinnlos.
Vorher:
if not exist Z: net use Z: \\server\*** /user:***
Ziel ist das Verbinden des Backup Shares, ein Schreibtest und Logging aller Fehlercodes. Besser:
set nas=\\serverip\Backup
REM delete and reconnect backup share
net use %nas% /delete
echo %date% %time:~0,8% net use delete %errorlevel% >> %log%
net use %nas% /u:user password
echo %date% %time:~0,8% net use %errorlevel% >> %log%
REM verify share write access
md %nas%\writeaccesstest
set tmpel=%errorlevel%
echo %date% %time:~0,8% test %tmpel% >> %log%
if %tmpel%==0 goto backup
set err=backup destination write access error && goto err
:backup
rd %nas%\%backupdest%\writeaccesstest
...
Ich hatte letzte Woche mit einem eigenartigen Problem zu kämpfen. Die 2 nagelneuen Drucker auf Arbeit – beides HP Laserjet Pro 8600 Plus via Druckerserver – hingen sich regelmäßig, ja fast täglich, an irgendwelchen Dokumenten auf. Dieses Dokument kann dann auch auf keinem Wege abgebrochen werden.
Das Problem trat bei uns fast zur selben Zeit an beiden Druckern auf.
Fehlersymptome:
Ein Dokument in der Druckerwarteschlange wird einfach nicht gedruckt. Alle weiteren Dokumente reihen sich ein, werden aber nicht gedruckt weil dieses Dokumente die Warteschlange blockiert.
Dieses dann aus der Druckerwarteschlange zu löschen funktioniert nicht. Es wird „Wird gelöscht…“ angezeigt und nichts passiert.
Drucker aus- und wieder anschalten löscht weder die Dokumente noch setzt es den Druck fort.
net stop spooler und net start spooler brachte nichts.
Drucker per LAN statt WLAN anschließen ändert auch nichts daran.
Am Druckerserver konnte man den Druckauftrag ebenfalls nicht erfolgreich entfernen. Druckerwarteschlange öffnen -> Drucker -> Alle Druckaufträge abbrechen zeigte ebenfalls keine Wirkung.
Auch das Anhalten des Druckers am Server und das Wiederholen der obigen Schritte bewirkte nichts.
Am Ende half nur eins: Neustart der Druckerserverrolle in Verbindung mit Drucker und PC, auf dem das verklemmte Dokument gedruckt wurde. Das ist natürlich keine Lösung.
Lösung
Grundsätzlicher Tipp: Firmware- und Treiberupdate, hilft oftmals schon. Falls nicht: Öffnet die Druckereigenschaften am Druckerserver und ändert folgende Einstellungen:
Freigabe -> „Druckauftragsbearbeitung auf Clientcomputern durchführen“ deaktivieren
Erweitert -> „Drucken nachdem die letzte Seite gespoolt wurde“ und „Fehlerhafte Druckaufträge anhalten“ aktivieren
Falls das Problem noch besteht, Anschlüsse -> „Bidirektionale Unterstützung aktivieren“ deaktivieren
Dies kann vielleicht zulasten der Dauer gehen, die benötigt wird bis ein Dokument vom PC über den Server auf den Drucker gelangt, aber dabei handelt es sich vermutlich um Millisekunden oder sehr wenige Sekunden. Bei uns trat das oben beschriebene Problem seit dem nicht mehr auf.
Flash ist eine weitere Standardsoftware auf den meisten Windows PCs, die regelmäßig aktualisiert werden muss. Also wieder ein Fall für eine Verteilung im Netzwerk. Nach den letzten Deployments [Skype, Java, Reader (Update), Firefox/Thunderbird (Update)] ist die Verteilung von Flash fast ein Kinderspiel.
Anmerkungen
Wie üblich wird zuerst die Version aus der Registry gelesen, überprüft und schlussendlich erfolgt die Installation .exe Dateien:
Achtung: Flash muss in 2 verschiedenen Ausführungen installiert werden. Auf der Downloadseite ist die Rede vom Internet Explorer und „Plug-In basierten Browsern“; also praktisch allen anderen Browsern. Daher 2 aufeinanderfolgende Installationen. In 99% der Fälle bereitet die Installation keine Probleme. Für die restlichen 1% habe ich auch in diese Verteilung Fehlererkennung und ein Retry eingebaut. Die Fehler 1618, 1602 und 1603 resultieren in einem erneuten Installationsversuch 5 Minuten später.
Konfiguration
Nach der Installation wird noch eine Konfigdatei kopiert, die Flash mit einigen wenigen Einstellungen versieht. mms.cfg:
Die Datei könnt ihr natürlich so anpassen, wie ihr die Einstellungen wollt.
Deployment
Update 19.09.2016: Version 23.0 getestet und läuft. Info: Das im Skript verwendete Programm VersionCompare ist eine Eigenprogrammierung und hier als Download verfügbar.
flash-installer.bat:
@echo off & Color 9f & setlocal
set wd=\\server\Deployment\Software\Flash
set log=%wd%\flash-log.txt
REM:: --- Version hier ändern ---
set version=23.0
REM:: ---------------------------
set tools=\\lea\Deployment\Sonstiges\tools
set flashieEL=999
set flashplEL=999
set combinedEL=999
set versionEL=999
set instversion=000
set retry=0
REM:: Clientfilter: nur die Computer aus der allowedPCs.txt dürfen installieren
::for /f %%f in (%wd%\allowedPCs.txt) do if "%computername%"=="%%f" goto check
::goto end
REM:: Clientfilter: die Computer aus der deniedPCs.txt dürfen nicht installieren
for /f %%f in (%wd%\deniedPCs.txt) do if "%computername%"=="%%f" goto end
:check
REM:: check installed version
for /f "tokens=1,2,3 delims= " %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Macromedia\FlashPlayerPlugin" /v "Version"^|findstr "Version"') do set instversion=%%c
if "%instversion%"=="000" goto install
%tools%\VersionCompare.exe %instversion% %version%
set versionEL=%errorlevel%
if "%versionEL%"=="-1" goto install
if "%versionEL%"=="0" echo %date% %time:~0,8% - %computername% hat bereits %instversion% installiert >> %log% & goto end
if "%versionEL%"=="1" echo %date% %time:~0,8% - %computername% hat bereits %instversion% (neu) installiert >> %log% & goto end
:install
echo %date% %time:~0,8% - %computername% (%instversion%) startet die Installation... >> %log%
start /w %wd%\flash-%version%_IE.exe -install
set flashieEL=%errorlevel%
start /w %wd%\flash-%version%_OTHER.exe -install
set flashplEL=%errorlevel%
if %flashieEL%==1618 goto retry REM:: msiexec process in use, installation already in progress
if %flashieEL%==1602 goto retry REM:: user canceled installation
if %flashieEL%==1603 goto retry REM:: fatal error, some use it for "already installed" (eg. java)
if %flashplEL%==1618 goto retry REM:: msiexec process in use, installation already in progress
if %flashplEL%==1602 goto retry REM:: user canceled installation
if %flashplEL%==1603 goto retry REM:: fatal error, some use it for "already installed" (eg. java)
if %flashieEL%==1041 echo %date% %time:~0,8% - %computername% strange 1041 open browser fail, end >> %log% & goto end
if %flashplEL%==1041 echo %date% %time:~0,8% - %computername% strange 1041 open browser fail, end >> %log% & goto end
set combinedEL=%flashieEL%%flashplEL%
echo %date% %time:~0,8% - %computername% hat die Installation von %version% abgeschlossen, errorlevel: %combinedEL% >> %log%
goto finish
:retry
if %retry%==1 goto retryfailed
echo %date% %time:~0,8% - %computername% hat nicht Errorlevel 00 erreicht, retry in 200Sek... >> %log%
set retry=1
ping localhost -n 200 > nul
goto install
:retryfailed
echo _!_ %date% %time:~0,8% - %computername% hat die Installation abgebrochen, RETRY FAILED! EL: %flashieEL% %flashplEL% >> %log%
goto end
:finish
REM:: copy flash config file for silent background updates
if "%processor_architecture%"=="x86" xcopy "%wd%\mms.cfg" "%systemroot%\System32\Macromed\Flash" /y & goto end
xcopy "%wd%\mms.cfg" "%systemroot%\SysWOW64\Macromed\Flash" /y
xcopy "%wd%\mms.cfg" "%systemroot%\System32\Macromed\Flash" /y
goto end
:end
endlocal
exit
Anpassungen
In dem Script tragt ihr in Zeile 8 immer die gewünschte Version ein und benennt die Installationsdateien nach folgendem Schema um: flash-[Version]_IE.exe (z.B. flash-21.0_IE.exe) flash-[Version]_OTHER.exe (z.B. flash-21.0_OTHER.exe) Die Verteilung besteht wie üblich aus den üblichen Verteilungsdateien, eurer angepassten Konfigurationsdatei mms.cfg und den umbenannten Installationsdateien.