Google scannt die meisten Webseiten täglich mehrmals. Wenn dabei Malware gefunden wird, wird diese Webseite auf eine Blacklist gesetzt, auf die alle größeren Browser zugreifen. So kann es schnell passieren, dass die eiene Seite bzw. eine bestimmte Unterseite so aussieht:
website-von-google-malware-warnung-befreien-warnung

Wenn nicht die komplette Webseite sondern nur eine Unterseite betroffen ist, sieht die detaillierte Google Malware Warnung vielleicht so aus:
website-von-google-malware-warnung-befreien-detaillierte-warnung

[…] 131 Seiten der Webseite überprüft. Dabei haben wir auf 1 Seite(n) festgestellt, dass Malware […]

Natürlich hat das Bereinigen der Seite, Entfernen von Schadcode und Schließen von Sicherheitslücken die oberste Priorität. Sollte das aber länger dauern oder die Unterseite muss am besten sofort wieder ohne Malware-Warnung erreichbar sein, muss eine schnelle Alternative her.

In diesem Fall ist es eventuell möglich die Malware Meldung mit einem Trick zu umgehen, ohne dass der Nutzer das merkt und ohne ihn zu gefährden.

How-To

1) Erstellt eine Kopie der Unterseite, also eine neue Seite mit exakt den gleichen Inhalten. Diese Seite sieht nun genauso aus wie die Malware-betroffene Seite, ist Malware-frei (wenn tatsächlich nur die eine Unterseite und nicht alle Seiten von der Malware betroffen war), allerdings unter einer anderen URL erreichbar.

2) Richtet eine Weierleitung der URL der beschädigten Seite zur URL der neuen Seite ein. Nutzt dazu entweder die Möglichkeiten eures CMS, eures DNS/Domain-Anbieters oder benutzt .htaccess Weiterleitungen:

Redirect 301 /about /z-portable

Dies würde die Kontaktseite meines Blogs direkt auf die Z-Portable Seite umleiten, mit dem HTTP Statuscode 301.

3) Nun wird der Besucher bei Eingabe der üblichen Malware-URL auf die Malware-freie Seite geleitet. Der Nutzer merkt das nur noch an der falschen URL, das verwirrt natürlich. Also sollte man noch die URL anpassen, damit für den Nutzer nicht mehr ersichtlich ist, dass er auf der Kopie-Seite befindet.
Am einfachsten geht das mit der Browser history API, um genau zu sein

history.pushState

:

// URL Fake
if(window.location.pathname=="/neue-url/") history.pushState({id: 'SOME ID'}, '', '/alte-url');

Damit wird, wenn im Browser die URL domain.tld/neu-url aufgerufn wird, die URL in domain.tld/alte-url in die URL Zeile gepackt. Nun ist nur noch mit Tools ersichtlich, dass eine andere URL aufgerufen wurde.

Beispiel

Die Unterseite meines Blogs /about/, also die Über Mich Seite, wurde von Malware infiziert; jedoch nur diese Unterseite.
Ich erstelle eine Kopie dieser Seite (exemplarisch nehme ich jetzt die Z-Portable Seite als „Kopie“) und leite die About Seite per htaccess darauf um. Nach einem Klick auf „About“ im Menü muss der Inhalt der Z-Portable Seite erscheinen, jedoch muss in der URL /about/ stehen, nicht /z-portable/.
website-von-google-malware-warnung-befreien-trick
Sichtbar ist ein anderer Inhalt, die URL passt.

Anschließen kann man über die Google Webmaster Tools die Neubewertung der Seite initiieren und sollte spätestens 12 Stunden später eigentlich diese Meldung erhalten:

Congratulations! Google has received and processed your malware review request. We did not detect any malware on your site.

Hier noch ein Guide zum Thema Google Malware Warnung: Link.

java7-java8u25-upgrade-silent-deployment-msiJava 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:

start /w %wd%\%version%-64.exe /s WEB_JAVA=1 REBOOT=REALLYSUPPRESS /norestart REBOOT=SUPPRESS

MSI Installer

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.
java-8-update-cmd-ordner-msi

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:

msiexec /i %wd%\%version%-32.msi /qn INSTALL_SILENT=1 WEB_ANALYTICS=0 EULA=0 REBOOT=0

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.

GUID:

msiexec /x{26A24AE4-039D-4CA4-87B4-2F83217055FF} /qn /norestart

Wobei die GUID dieses Format hat:
[/crayon]

{26A24AE4-039D-4CA4-87B4-2F8YY1XXXXFF}

wobei YY die Prozessorbits sind (32/64) und XXXX die Versionsnummer: 7065 für 7u65 oder 8011 für 8u11.

Die GUIDs aller 7er und 8er Versionen, inklusive Batchbefehle, findet ihr auf dieser IT-Ninja Seite (ganz unten).
Hier wäre die aufgeräumte Variante:

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

REM 7er Versionen
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217067FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417067FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217065FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417065FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217060FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417060FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217055FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417055FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217051FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417051FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217045FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417045FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217040FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417040FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217025FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417025FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217021FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417021FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217017FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417017FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217015FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417015FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217013FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417013FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217011FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417011FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217010FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417010FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217009FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417009FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217007FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417007FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417006FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217006FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417005FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217005FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417004FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217004FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417003FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217003FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417002FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217002FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417001FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217001FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86417000FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83217000FF}

REM 8er Versionen (Update: 17.03.2016, Uninstall bis Update 71, aktuell ist 73)
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218071F0}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418071FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218066F0}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418066FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218065F0}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418065FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218060F0}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418060FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218051F0}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418051FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218045F0}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418045FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218040F0}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418040FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218031F0}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418031FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218020F0}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418020FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218011FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418011FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218005FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418005FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F83218000FF}
msiexec.exe /qn /norestart /X{26A24AE4-039D-4CA4-87B4-2F86418000FF}
REM ... usw

MSI:

Die MSIs erhaltet ihr aus dem AppData\LocalLow\Sun\Java\[Version] Ordner.
java-8-update-cmd-ordner
Damit dann:

msiexec /x "%wd%\uninstall\jre1.7.0_67\jre1.7.0_67.msi" /qn /norestart

Alternative Deinstallationen / Uninstaller

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:
java7-java8u73-upgrade-silent-deployment-msi-log
(Errorcode 9 bei 32bit heißt, dass auf dem System keine 32bit Installation gefunden und diese übersprungen wurde)

server-backup-bannerIch 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
...

Der Import von Datenbankdateien oder Dumps in eine MySQL Datenbank ist nicht unbedingt problematisch.

mysql.exe -u USERNAME -p PASSWORD DATABASENAME < MYDATABASE.sql


Ohne Shell Zugriff muss das anders laufen.
MySQL wird eigentlich immer mit einer Adminoberfläche installiert, in den meisten Fällen phpMyAdmin. phpMyAdmin ist aber oftmals an verschiedenste Limitierungen gebunden und generell gibt es viele Gründe, warum ein Datenbankimport scheitern kann: PHP Dateigrößen-Limit, phpMyAdmin Dateigrößen-Limit, Timeouts vom Server oder vom Client, sowas.
große-datenbanken-importieren-bigdump-phpmyadmin-limit
8MB Maximum? Nicht besonders viel.

Per FTP Zugriff, je nachdem wie eingeschränkt der Zugriffsbereich ist, können diese Probleme aber umgangen werden.
Server Vollzugriff:
Entweder könnt ihr auf die php.ini des Servers zugreifen und dort ein paar Einschränkungen lockern um den Import anschließend über die phpMyAdmin Oberfläche erneut probieren:

php_value upload_max_filesize 120M //file size
php_value post_max_size 120M
php_value max_execution_time 200
php_value max_input_time 200

Eingeschränkter Zugriff (shared hoster):
Häufig ist der Zugriff jedoch auf den html/public Bereich beschränkt, hier geht ihr folgendermaßen vor:
Wenn ihr von dem Hoster bereits eine leere Datenbank und einen User bekommen habt, was in den meisten Fällen so passiert, überspringt ihr den folgenden Satz einfach. Falls nicht erstellt ihr euch über die phpMyAdmin Oberfläche eine neue leere Datenbank und einen Datenbanknutzer, der auf diese Datenbank Vollzugriff/All Privileges hat.
Anschließend zieht ihr euch das nützliche Tool BigDump. Das ist im Endeffekt nur eine .php Datei.
Die öffnet ihr mit einem Editor und füllt die paar Zeilen aus: Server (bei shared so gut wie immer localhost), Datenbankname, Username, Userpasswort und der Dateiname der zu importierenden Datei. Die Kodierung ist meistens utf8 bei SQL Exports, passt das falls nötig auch noch an.
große-datenbanken-importieren-bigdump-config

Dann müsst ihr diese Datei zusammen mit dem Datenbankbackup auf den Server laden, am besten einfach in das Root html Verzeichnis. Im Anschluss die .php Datei im Browser aufrufen und mit „Start Import“ geht’s los. Eine 30MB SQL Datei wurde bei mir in etwa 1 Sekunde importiert.
große-datenbanken-importieren-bigdump-process-startgroße-datenbanken-importieren-bigdump-process-finished

Erledigt. Nicht vergessen danach die 2 Dateien wieder vom Server zu löschen.

Es gibt bestimmt noch andere Tools, die diesen Job erledigen. Solltet ihr jedoch Probleme mit diesen Workarounds haben, fragt doch vielleicht einfach mal euren Hoster, ob er nicht den Import übernehmen kann. Vorher die Backup Datei auf den Server laden, die meisten Hoster sind da hilfsbereit und machen das sogar kostenlos.

Quellen:via, via

Allgemeines

Anfang des Jahres habe ich mich schon einmal mit dem Windows Update Fehler 80072EE2 beschäftigen müssen. Dieser trat nur an einem Client des Unternehmens auf, alle anderen Clients arbeiteten einwandfrei mit dem WSUS zusammen. Den Fehler konnte ich damals nicht lösen und musste den PC letztendlich neu installieren.
Seit dem Umzug des WSUS Dienstes auf einen neuen Server kam dieser Fehler nun aber bei jedem Client. Der Fehler 80072EE2 hat also definitiv etwas mit einem fehlerhaft installierten oder konfigurierten WSUS Server zu tun.

Weitere Windows Update Fehler und ihre Lösung findet ihr hier.

Vorbereitung

Bevor ihr den WSUS Server bearbeitet, solltet ihr nochmal mit dem WSUS Check Script oder ähnlichen Tools an eurem Test-Client prüfen, ob alle Einstellungen richtig gesetzt sind.
Falls ja, sollte in eurer Registry unter HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate der Wert von „WUServer“ bzw. „WUStatusServer“ auf euren WSUS Server gesetzt sein, also „http://servername„. Ändert diese beiden Werte mal und hängt den Port 8530 an: „http://servername:8530“.
Anschließend könnt ihr direkt eine neue Update Suche starten und bekommt vermutlich einen anderen Fehler, evtl. den Fehler 800B0001. Auch dieser Fehler weist darauf hin, dass der WSUS Server noch nicht fertig installiert ist.

Lösung

In meinem Fall war die Lösung unerwartet einfach:

  1. Update/Fix KB2720211 (Info) auf dem WSUS Server installieren
  2. Stoppen des WWW Dienstes (services.msc -> „WWW-Publishingdienst“ oder CMD -> „net stop w3svc„)
  3. Stoppen des Update Dienstes (services.msc -> „Update Services“ oder CMD -> „net stop wsusservice„)
  4. Zurücksetzen des IIS Dienstes (CMD -> „iisreset“)
  5. Starten des Update Dienstes (services.msc -> „Update Services“ oder CMD -> „net start wsusservice„)
  6. (Starten des WWW Dienstes – müsste aber bereits vom IIS Reset gestartet worden sein (services.msc -> „WWW-Publishingdienst“ oder CMD -> „net start w3svc„))

Nach der Ausführung der Neustart-Befehle sollte der WSUS Server wieder laufen und relativ schnell die ersten Clientanmeldungen bekommen (je nach Anzahl der Clients im Netzwerk). Ein Serverneustart erspart euch die Befehle und ist auch empfohlen, aber nicht zwingend notwendig.

Hinweis: Stefan, ein Leser, hat mich per Mail darauf hingewiesen, dass bei ihm das Problem durch ein Netzwerkgerät – nämlich durch seinen Router – verursacht wurde. Durch die Verwendung der Offloading Funktion des Routers konnte er das Problem beheben. Schaut in seinen Blogartikel für mehr Infos.

Quellen: via, via, via, via, via, via

Vor längerer Zeit habe ich ja über die Website Monitoring Seite servercheck24.de geschrieben und den Dienst getestet. In diesem Test möchte ich auf den größeren Bruder serverguard24.de eingehen und die zusätzlichen Features testen. Denn serverguard24 bietet einige nette Erweiterungen.

Start, Registrierung, Übersicht

Hier gibt es nicht viel Neues zu sehen. Die Registrierung ist einfach und geht schnell. Einzig bei der Passworteingabe muss ich meckern; heutzutage sollten Passwörter von mindestens 6 Zeichen vorausgesetzt werden und ein Password-Strength-Meter gehört ebenfalls zum guten Ruf und ist leicht einzubauen.
serverguard24-de-test-vergleich-servercheck-signup
Es erfolgt im nächsten Schritt auch wieder die Eingabe der Mobilfunkdaten, damit die SMS Benachrichtigung genutzt werden kann.

Einfaches Uptime Monitoring

Wie auch bei servercheck24 ist eine einfache Seitenüberwachung via HTTP Request schnell eingerichtet und besonders leicht zu verwalten. Die Prüfhäufigkeit wird durch das gekaufte Paket bestimmt. An dieser Stelle bietet serverguard24 jedoch schon erste Erweiterungen. So lassen sich Wartungsintervalle angeben, zu denen keine Uptime Tests stattfinden sollen, weil diese sowieso fehlschlagen würden. Außerdem kann die geografische Region ausgewählt werden, von denen aus die Tests kommen sollen. Der eingerichtete Dienst lässt sich von hier aus auch direkt testen und als Belohnung für eine funktionierende Webseite das serverguard24 Qualitätssiegel einbauen, wenn man das möchte.
serverguard24-de-test-vergleich-servercheck-simple-http-monitoringserverguard24-de-test-vergleich-servercheck-simple-http-monitoring-smsserverguard24-de-test-vergleich-servercheck-simple-http-monitoring-new-features

Transaktionen

Ebenfalls ein zusätzliches Feature sind die Transaktionen. So bezeichnet werden eine Abfolge von Nutzeraktionen auf einer Webseite. Somit lassen sich komplexe Tests, sogar tief in eingeloggten Webseitenbereichen, durchführen.
Es gibt 2 verschiedene Typen von Transaktionen: echte Browser Transaktionen und Request-Transaktionen. Letztere sind relativ typische, modifizierte GET/POST Serveranfragen, die mit verschiedensten HTTP Parametern versehen werden können und damit auch sehr gezielte Tests ermöglichen, wenn die Seite daraufhin programmiert wurde.
Besonders interessant sind jedoch die User-/Browser-Transaktionen, die echtes Userverhalten in einem Browser simulieren können.
Dazu muss auf dem PC – es muss ein Windows PC sein – eine Software namens „ServerGuard24 Transaction Manager“ installiert werden, mit der einmalig diese User-Aktion aufgezeichnet wird:
serverguard24-de-test-vergleich-servercheck-transactions-software
Die Software hat quasi ein Internet Explorer (Version 7 oder 8?) verbaut und überwacht sämtliche Aktionen, die darin gemacht werden. Außerdem lassen sich Pausen, Prüfungen, Wartekonditionen und Parser mit verschiedensten Optionen einbauen. Formulareingaben werden ebenso überwacht wie Klicks auf bestimmte Elemente.
Nachträglich kann diese Abfolge von Browserereignissen kann dann direkt in das serverguard24 Profil gespeichert und getestet werden:
serverguard24-de-test-vergleich-servercheck-transactions-test
An dieser Stelle ist jedoch Kritik nötig: das ganze ist relativ buggy und unhandlich. Der in dieser Software verbaute Browser scheint uralt zu sein (wie gesagt, vermutlich IE 7 oder 8) und verursacht dadurch starke Darstellungsprobleme auf Webseiten, die nicht für diese alten Browser optimiert wurden. Bestimmte Tests sind dadurch vielleicht schon gar nicht mehr möglich. Erstellte Schritte können nicht verschoben werden. Klicks werden nur selten erkannt, vor allem Linkklicks, die auf neue URLs führen, scheinen oftmals nicht als User-Schritt anerkannt zu werden. Zusätzlich stürzte die Software bei meiner ersten Nutzung komplett ab. Und zwar mehrfach, einfach nur indem ich die Software ein paar Minuten lang laufen ließ, ohne sie anzufassen; irgendwann stürzt sie ab. Also die Bedienerfreundlichkeit, Zuverlässigkeit und Stabilität sind hier eher mau.

Android App

Darauf habe ich mich besonders gefreut: mobile Überwachung! Wenn etwas bei Serverüberwachung wichtig ist, dann vor allem immer und von überall via Smartphone die Kontrolle zu haben. Ergebnisse einsehen, Tests auswerten, Dienste aktivieren und deaktivieren, via App, sehr gut. Und genau das bietet die ServerGuard24 Android App auch. Die Bedienung ist sehr einfach und die Visualisierung ziemlich gut. Alle Informationen sind übersichtlich dargestellt und mit Farben und Icons verdeutlicht.
serverguard24-de-test-vergleich-servercheck-android-app-store serverguard24-de-test-vergleich-servercheck-android-app-servers

serverguard24-de-test-vergleich-servercheck-android-app-server-report serverguard24-de-test-vergleich-servercheck-android-app-server-service-details

Einziger Wermutstropfen: die Einstellungen der Tests können nur angezeigt und nicht bearbeitet werden.

Fazit

ServerGuard24 bietet alle wichtigen Funktionen für eine Überwachung der eigenen Server und Webseiten. Zusätzliche können Webmaster mit dem nötigen Wissen sehr umfangreiche Tests bauen und damit die Stabilität der Webseite und einzelner Features bis auf die digitalen Nieren prüfen lassen. Etliche Benachrichtigungsoptionen, vor allem Notfall-SMS, kombiniert mit der Überwachungs-Android-App sorgen dafür, dass man im Falle einer Störung innerhalb kürzester Zeit Bescheid weiß und aktiv werden kann.
Wie auch bei ServerCheck24 braucht es hier eigentlich nur noch kleinere Optimierungen in den einzelnen Features, um diese noch etwas stabiler und benutzerfreundlicher zu gestalten.
Aber das Gesamtpaket kann überzeugen!

Das Passwort von Windows Accounts zu ändern ist eigentlich eine einfache Angelegenheit. Auch in der Konsole gibt es einen sehr einfachen Befehl:

net user [username] [passwort]


Ein sehr simples Skript zum Neusetzen eines Passworts könnte also so aussehen:

@echo off & setlocal & color 9f
set user=user
set newpw=muhuu123!
net user %user% %newpw%
endlocal

Aber an dieser Stelle geht es mir natürlich nicht um das Ändern eines einzelnen Passworts. Es geht um die Massenänderung eines Passworts, beispielsweise eines Administratorpassworts auf jedem Computer eines Netzwerks.
Nun kann es jedoch bei Dutzenden, Hunderten oder Tausenden Nutzern/Computern zu verschiedenen Problemen oder Nebeneffekten kommen. Der Nutzer könnte nicht existieren, deaktiviert sein oder ein Password mit Ablaufdatum besitzen. Diese Faktoren sollten bedacht werden.

Ich habe ein Skript geschrieben, welches alle diese Faktoren berücksichtigt:

@echo off & setlocal & color 9f
set wd=\\lea\Deployment\Sonstiges\change-admin-pw
set log=%wd%\change-admin-pw.log

REM ###### EDIT THIS ######
REM desired local user account
set user=user
REM is it an active directory domain user or a local user account; can be yes, 1, no, 0
set domainuser=no
REM needed if domain user
set domainparam=
REM desired new password, pay attention to password policies if activated
set newpw=my4w3s0mePW!
REM checks if the desired user account is activated on the machine; can be yes, 1, no, 0
set checkactive=yes
REM needed if active check is performed
set active=0
REM if the user is deactivated, should it get activated, can be yes, 1, no, 0
set reactivate=yes
REM checks if the old password has an expiration date, which would also get changed to a newer date; can be yes, 1, no, 0
set checkpwexpire=yes
REM needed if expiration check is performed
set expires=0
REM changes password though it has an expiration date; can be yes, 1, no, 0
set changeanyways=yes

REM check for empty variables
if "%user%"=="" goto end
if "%newpw%"=="" goto end

REM prepare domain usage
if "%domainuser%"=="yes" set domainparam=/domain
if "%domainuser%"=="1" set domainparam=/domain

REM check if user exists
net user %user% %domainparam%
if not %errorlevel%==0 echo %date% %time:~0,8% Nutzer %user% scheint nicht zu existieren >> %log% && goto end
goto active

:active
if "%checkactive%"=="0" goto expires
if "%checkactive%"=="no" goto expires
REM check if user is active
for /f "tokens=1-3" %%i in ('net user %user% %domainparam%') do ( if "%%i %%j"=="Konto aktiv" set active=%%k )
if "%active%"=="Ja" goto expires
if "%active%"=="Yes" goto expires
REM activate the user if wished
if "%reactivate%"=="yes" net user %user% %domainparam% /Active:YES
if "%reactivate%"=="1" net user %user% %domainparam% /Active:YES
echo %date% %time:~0,8% Nutzer %user% ist deaktiviert. Passwort wird trotzdem zurückgesetzt. >> %log%
goto expires

:expires
if "%checkpwexpire%"=="0" goto changepw
if "%checkpwexpire%"=="no" goto changepw
REM check if user password has an expiration date
for /f "tokens=1-4" %%i in ('net user %user% %domainparam%') do ( if "%%i %%j %%k"=="Kennwort läuft ab" set expires=%%l )
if "%expires%"=="Nie" goto changepw
if "%expires%"=="Never" goto changepw
if "%changeanyways%"=="yes" goto changepw
if "%changeanyways%"=="1" goto changepw
echo %date% %time:~0,8% Nutzer %user% hat ein zeitlich limitiertes Passwort, Passwortänderung wird abgebrochen. >> %log%
goto end

:changepw
net user %user% %newpw% %domainparam%
set pwEL=%errorlevel%
if %pwEL%==0 echo %date% %time:~0,8% Passwort geändert. User: %user% - Aktiviert: %active% - PW läuft ab: %expires% >> %log% && goto end
echo %date% %time:~0,8% Fehler beim Ändern des Passworts: %pwEL%. User: %user% - Aktiviert: %active% - PW läuft ab: %expires% >> %log%
REM Errorlevel 2 means that the chosen password doen't meet the password policy guidelines
goto end

:end
endlocal

Erläuterung:
Anhand der Variablen lässt sich das Verhalten des Skriptes in bestimmten Situationen steuern. Die Kommentare sollten eigentlich alles soweit klar machen.
Ich habe das Skript noch nicht ausführlich getestet, es sollte aber eigentlich keine Probleme geben.

Nun gibt es noch ein letztes Problem: ein solches Skript sollte niemals einfach so auf den Netzlaufwerken liegen, schließlich steht das Passwort dort im Klartext. Und die Ordner, in denen die Gruppenrichtlinienskripte liegen, sind oftmals für die Computer- oder Nutzerobjekte der Domäne lesbar. IT-erfahrene Nutzer könnten also das Skript finden und einsehen.

Es ist also wichtig das Passwort oder das komplette Skript zu verschlüsseln. Je nach Firma, Größe, Nutzergruppe, Sicherheitsrichtlinien usw. muss man in diesen Punkt mehr oder weniger Arbeit stecken.
Ich habe an dieser Stelle ein sehr einfaches Tool gefunden, welches Batch Skripte in .exe Dateien kompilieren kann und damit den Inhalt (für die meisten Menschen) unlesbar macht: Bat To Exe Converter von F2KO macht genau das, was der Name sagt. Außerdem kann die .exe Datei mit einem Passwort verschlüsselt, unsichtbar ausgeführt und mit einem Icon sowie vielen Metainformationen versehen werden.
change-reset-local-user-passwords-bat-to-exe-compiler

Also, Nutzer und endgültiges Passwort in das Skript eintragen, kompilieren und die .exe Datei auf das Netzlaufwerk legen und verteilen. Wenig später ist das Passwort überall neu gesetzt.