Donnerstag, 30. April 2015

Windows Server Update Services 3.0 SP2 (WSUS) aufräumen

Heute habe ich mich dem WSUS auf einem Windows Small Business Server 2011 gewidmet. Prinzipiell funktionierte die Bereitstellung der Updates, jedoch sind mir einige unschöne Dinge aufgefallen:
  1. Es werden nicht alle Updates durch WSUS bereitgestellt. Ursache unklar.
  2. Der WSUS selbst braucht ebenfalls ein Update auf den aktuellen Build
  3. Die Übersicht in der WSUS Konsole begrüßt mit der Meldung, dass über 7000 Updates auf Genehmigung warten. Da stimmt was nicht.
  4. Bereinigungsassistent lief ewig und hat scheinbar nichts mehr gemacht. Wurde vom Kunden gekillt und der Server rebootet.

Nach Recherche und Rücksprache mit einem Kollegen stehen folgende Dinge auf der Agenda:
  1. Update des WSUS auf den aktuellen Stand
  2. Server reboot
  3. Reindex der SUSDB mit Hilfe des Skripts WsusDBMaintenance.sql
  4. Ausführen des WSUS Bereinigungsassistenten
  5. Schauen, ob das was gebracht hat

Update WSUS auf aktuellen Build


Für den WSUS - also den Update Dienst selbst - gibt es natürlich auch Updates. Diese kommen im Idealfall über die Updates am Server mit aber in meinem Fall nicht.
Die ausgelieferten Patches und den aktuellen Stand für den WSUS 3.0 SP2 findet man hier:

http://www.wsus.de/faq   (Scrollen zu Frage 44)

Stand 30.4.2015: WSUS 3.0 (SP2) + KB2938066: Build 3.2.7600.274

Auf dem Patienten war Build 256 installiert, d.h. die Updates auf 262 und 274 fehlten. Da es sich um kumulative Patches handelt, reicht es KB2938066 zu installieren und man hat direkt Build 274.

Den Patch einfach anhand der Nummer über die Suchmaschine der Wahl finden und herunterladen. In meinem Fall:

https://www.microsoft.com/de-de/download/details.aspx?id=43633

Ich bin mit dem Download erst nicht so recht klar gekommen. Button drücken, Architektur auswählen und "Next" klicken. Wenn wie in meinem Fall nach 30 Sekunden nichts passiert auf "Klicken Sie hier" klicken und dann erscheinen in der Übersicht direkte Download Links.

Nach Download des Patches diesen einfach doppelt anklicken. Die Installation hat ca. 20 Minuten gedauert und zwischenzeitlich hatte man den Eindruck, dass nichts mehr passiert. Es geht aber weiter also einfach warten.
Zum Abschluß kommt die Meldung zum Neustart - also Reboot.

Nachdem der Server wieder oben ist die WSUS Admin Console starten und die WSUS Version checken - siehe Screenshot FAQ (Frage 44) , Link oben.

Hat geklappt - gut kann man sich schonmal freuen. Weiter geht es.

Synchronisierung starten


Es wird empfohlen, nach dem Update eine Synchronisierung zu starten, d.h. den WSUS mit Windows Update abzugleichen. Dazu in der WSUS Konsole beim entsprechenden Host auf Optionen klicken. In der Mitte geht dann eine Liste auf und dort klickt man "Synchronisierungen". Rechts gibt es den Befehl "Jetzt synchronisieren". Draufklicken und warten bis die Synchronisierung fertig ist.

Reindexing der SUSDB


Wie hier zu lesen ist,
https://support.microsoft.com/en-us/kb/2938066

wird empfohlen, monatlich ein Reindexing der SUSDB durchzuführen. Den Sinn hinterfrage ich nicht - ich mache es einfach.

Das im Link genannte Skript WsusDBMaintenance.sql findet man hier:
https://gallery.technet.microsoft.com/scriptcenter/6f8cde49-5c52-4abd-9820-f1d270ddea61

Man kann es aber nicht herunterladen sondern muss es per STRG+C in einen Editor kopieren und abspeichern. Ich habe es wie im ersten Link beschrieben in das Binn Verzeichnis des SQLServers gelegt.

Also hier:
C:\Program Files\Microsoft SQL Server\100\Tools\Binn

Danach folgendes machen:

  1. CMD als Admin aufrufen (also Rechtsklick => als Admin ausführen)
  2. cd C:\Program Files\Microsoft SQL Server\100\Tools\Binn
  3. sqlcmd -I -i WsusDBMaintenance.sql -S \\.\pipe\MSSQL$MICROSOFT##SSEE\sql\query

Das SQL-Skript muss man natürlich vorher wie beschrieben dort abgespeichert haben. Die Ausgabe des Skripts zeigt an, dass ein Rebuild von Indexes gemacht wird. Fehler kamen bei mir nicht. Nach ca. 5 Minuten war das Skript durch.

Serverbereinigung


Jetzt ist es Zeit, nochmal die Serverbereinigung anzuwerfen. Neuester  Build, SUSDB reindexed ... wenn es jetzt nicht geht, dann .... geht es nie ;)

Also WSUS Konsole -> beim entsprechenden Host auf Optionen. In der Liste in der Mitte wählt man "Assistent für Serverbereinigung".

Im ersten Schritt fragt der Assistent was er tun soll. Ich habe alle Haken drin gelassen und das Ding gestartet. Während ich diesen Artikel schreibe läuft der Assistent vor sich hin. Er steht beim Schritt "Nicht verwendete Updates werden gelöscht". Der Taskmanager zeigt permanant ca. 50% CPU-Last an. Manchmal geht es auch gegen 100%. Da passiert also was.
In der Prozessliste sind der SQL Server und der IIS als aktiv zu erkennen. Jetzt hilft nur warten.

Ich lasse den Assistent jetzt einfach weitermachen. Morgen ist "Tag der Arbeit"  - also Feiertag und dann kommt das Wochenende. Der Assistent hat also ein paar Tage Zeit, um alles schön aufzuräumen. Ich bin gespannt ...


Was hats gebracht?

Leider nicht viel. Nachdem ich unter Optionen-Produkte und Klassifierungen im Reiter Klassifizierungen zusätzlich noch Updates angehakt habe (damit auch optionale Updates über den WSUS kommen) hat sich die Lage zugespitzt.
Prinzipiell schien der WSUS noch irgendwie zu funktionieren aber praktisch war er tot. Die Verwaltungskonsole hat ständig den Fehler "Die Verbindung wurde zurückgesetzt" gemeldet und konnte nur benutzt werden, nachdem der Update Service unter Dienste angehalten wurde.

Neuinstallation

Nach Rücksprache mit dem Kunden wurde der WSUS deinstalliert. Dies ging einfach über die Serververwaltungskonsole durch Entfernen der entsprechenden Rolle. Der Assistent fragt ob die SUSDB auch gelöscht werden soll. Natürlich JA!

Die Neuinstallation gestaltete sich nicht ganz so einfach wobei ich nicht am gesamten Prozess beteiligt war. Wichtig ist, dass man zunächst eine leere SUSDB im SQL-Server erstellt und diese bei der Installation des WSUS auswählt.

Nachdem der WSUS lief erschienen realtiv schnell die Clients und Server in der Verwaltung, nur Updaten wollte diese nicht.
Es lag am Ende daran, dass beim neu installierten WSUS noch keine Updates gemacht wurden (Build 226). Ich habe also wieder auf Build 276 gepatch und dann ging es weiter.
Wichtig ist, dass man vor der Erstsynchronisierung bei Produkte und Klassifizierungen die Produkte abschaltet, die man nicht im Einsatz hat. Das sind im Normalfall eine ganze Menge. In der Folge werden diese Updates gar nicht erst in die Datenbank geladen.


FAZIT: Wenn eine WSUS Installation nach ein paar Jahren immer träger wird und man mit schnellen Maßnahmen wie dem Bereinigungsassistenten keinen Erfolg hat, sollte man gleich eine Neuinstallation machen.

Ein guter Leitfaden für Installation und Ersteinrichtung findet sich hier:
http://www-pc.uni-regensburg.de/systemsw/wsus/3/WSUS30SP2StepbyStep.pdf



Montag, 13. April 2015

PDF Inhalte zusammenführen mit Apache PDFBox (merge content)

In einem Kundenprojekt gab es folgende Ausgangssituation:

  • Erzeugung Druckversion Ausgangsrechnung mit Apache FOP
  • Papierdruck der Rechnungen auf Papier mit Kopfbogen, d.h. Firmenlogo und Footer sind bereits auf dem Papier und werden nicht gedruckt.

Mit der Einführung eines digitalen Dokumenten Managements geht die Ausgangsrechnung bei der Erstellung automatisch als PDF aus der Warenwirtschaft in das DMS und wird dort archiviert. Damit entfällt die Ablage einer Papierkopie.

Um zukünftig Ausgangsrechnungen als PDF digital versenden zu können, musste eine Möglichkeit geschaffen werden, die Rechnung als PDF mit hinterlegtem Kopfbogen abzurufen. Die Ablage im DMS soll dann ebenfalls mit Kopfbogen erfolgen.
Dazu wurde von der Werbeagentur ein PDF mit dem Kopfbogen zur Verfügung gestellt.

Im Projekt  wird bereits die Apache PDFBox Bibliothek verwendet, so dass dies erstmal die erste Wahl war.
Nach einigem Kopfzerbrechen habe ich eine einfache Lösung gefunden:

org.apache.pdfbox.util.Overlay

Diese Klasse stellt die entsprechende Funktionalität bereit und kann sogar noch einiges mehr.

Overlay overlay = new Overlay();

overlay.setDefaultOverlayPDF(PDDocument.load(
   new File("/home/peter/kopfbogen.pdf")));

// Quell PDF
overlay.setInputPDF(PDDocument.load(
   new File("/home/peter/quell_dokument.pdf")));

// Zielpfad
overlay.setOutputFile("/home/peter/Downloads/ziel_dokument.pdf");

// Overlay ausfuehren und Output erzeugen
overlay.overlay(new HashMap<Integer, String>());

Im Beispiel wird die Datei kopfbogen.pdf hinter jede Seite des Dokuments quell_dokument.pdf gelegt. Das Resultat wird in ziel_dokument.pdf gespeichert.

Damit wird genau die Anforderung erfüllt und das Ziel-PDF hat das selbe Erscheinungsbild wie die ausgedruckte Rechnung auf Briefpapier.


Die Klasse Overlay bietet noch weitere Möglichkeiten:

  • Unterschiedliche Overlays für gerade und ungerade Seiten (odd/even)
  • Spezielle Overlays für einzelne Seiten. Diese werden in der Map<Integer,String> an die Methode overlay() übergeben. Im Beiepiel wird einfach eine leere Map übergeben.


Für mein Projekt habe ich nun noch das Problem, dass ich das Ziel in einen Stream schreiben muss. Dies unterstützt Overlay erstmal nicht, da der Output nur als Pfad gesetzt werden kann. Im Zweifel muss ich dazu die komplette overlay() Methode überschreiben und entsprechend anpassen.

HINWEIS: Das Beispiel nutzt bereits die PDFBox 2.0. In der 1.8er gestaltet sich das API geringfügig anderes.

Donnerstag, 9. April 2015

MSExchange CmdletLogs Get-User failed

Wartung eines Kundenservers: SBS 2011 Standard. Als Linuxer schaut man mal die Logs durch und dort gibt es u.a. den MSExchange Management Log

In diesem befinden sich 98.117 offenbar identische Ereignisse:

Fehler  MSExchange CmdletLogs   Get-User NT-AUTORITÄT\SYSTEM wurde nicht gefunden.

Die Meldung kommt alle 30 Minuten. Im Protokoll ist eine Größe von 150MB eingestellt. Man kann jetzt ausrechnen wie viel Speicher eine Logmeldung braucht - immerhin ;)

Eine Recherche zu diesem Fehler führte mich hierhin:
http://support.microsoft.com/en-us/kb/2483007

Etwa in der Mitte des Artikels wird dieser Fehler beschrieben. Dazu steht dann lapidar:

Resolution: The error is benign and may be safely ignored.

Auf Deutsch - Lösung: Dieser Fehler ist gutartig und kann ohne Risiken ignoriert werden ;)

Wie man das abstellt steht dort leider nicht. Der Artikel ist von Juli 2011 - also knapp 4 Jahre alt. Auf dem Server sind alle Updates installiert.

Im Grunde ist der Log dadurch unbrauchbar weil andere Fehler darin völlig untergehen.

In diesem Sinne - weitermachen!

Montag, 6. April 2015

Was mal aufwändig war ist einfach kein Thema mehr

Als ich heute den Geschirrspüler eingeräumt habe sind mir Parallelen aufgefallen: Ich bin alt genug um mich zu erinnern wie es war als der Normalbürger noch von Hand im Spülbecken abgewaschen hat.
Das kann man sich heute in einer 4-köpfigen Familie kaum noch vorstellen.

Digitales Dokument Management in einer transparenten und einfachen Form bringt ähnliche Effekte: Was mal aufwändig war ist einfach kein Thema mehr.

Den Schreibtisch frei halten, die aktuellen Dokumente auf dem Schirm behalten und bei Bedarf das gewünschte schnell finden - alles machbar!




DigitalPaper ist schon wieder ein paar kleine Schritte weiter als im Video zu sehen ist.