Der Zugriff auf Informationen von WSUS-Servern und ihre Steuerung ist auf verschiedene Weisen möglich. Von Microsoft mitgeliefert wird das WSUS-MMC-SnapIn, also die altbekannte WSUS-Konsole, die auf dem WSUS-Server automatisch mitinstalliert wird (und auf weiteren Rechnern bei Bedarf nachinstalliert werden kann).
Ausserdem möglich ist der Zugriff über die Windows PowerShell; Skripte hierzu finden sich einige in diesem Forum.
Weiterhin lässt sich dank des .NET Frameworks von Microsoft auch mit Hochsprachen wie Visual C# auf WSUS-Server zugreifen. Wie dies funktioniert, möchte ich hier kurz beispielhaft zeigen.
Benötigt wird:
- Microsoft Visual C# - aktuell ist Version 2008 SP1 (deutsch), in der Express Edition kostenlos bei Microsoft herunterzuladen
- Microsoft Report Viewer Redistributable 2008 - aktuelle Version ist SP1, gibt es (in deutsch) ebenfalls kostenlos bei Microsoft
- Microsoft WSUS 3.0 SP2 - aus diesem Programmpaket muss auf dem Entwicklungsrechner die WSUS-Konsole installiert werden
- .NET Framework - die aktuelle Version (3.5 SP1) sollte ebenfalls installiert sein
Ist dies alles installiert, kann im Visual Studio ein neues Projekt gestartet werden - in diesem Beispiel habe ich eine normale
Windows Forms-Anwendung erstellt.
Noch kennt die Anwendung allerdings keinerlei WSUS-Funktionalitäten. Um auf diese zugreifen zu können, muss ein Verweis auf die entsprechende Bibliothek eingefügt werden.
Geht dazu im Menü
Projekt auf
Verweis hinzufügen.... Es werden alle installierten Bibliotheken aufgelistet, das kann einen Moment dauern. Die WSUS-Bibliothek allerdings wird nicht aufgelistet, diese müsst ihr manuell hinzufügen. Geht dazu auf den Reiter
Durchsuchen und klickt euch durch zum Installationspfad der WSUS-Konsole (standardmässig:
C:\Programme\Update Services).
Im Unterordner
Api liegt die Datei
Microsoft.UpdateServices.Administration.dll - wählt diese aus und klickt
OK.
Die Bibliothek ist nun verknüpft - ihr könnt nun auf ihre Klassen und Funktionen zugreifen.
Gleichzeitig wird die erstellte Anwendung aber nur auf Rechnern laufen, die diese Bibliothek kennen, also die WSUS-Konsole installiert haben.
Um nicht immer den vollen Namen der Assembly eingeben zu müssen, wenn ihr auf ihre Klassen zugreifen wollt, solltet ihr in den Kopfteil eurer Quellcode-Datei folgende Zeile einfügen:
using Microsoft.UpdateServices.Administration;
Eure Anwendung ist nun startklar.
Als Beispiel möchte ich nun einige Informationen vom WSUS-Server abrufen. Dazu habe ich (quick and dirty) einen Button und eine TextBox (MultiLine = true) auf die Anwendung gezogen und dem OnClick-Event des Buttons folgenden Code hinzugefügt:
// wird später in der TextBox ausgegeben
List<string> output = new List<string>();
// SERVERNAME durch den Hostnamen eures WSUS-Servers ersetzen
// SSL auf true setzen, wenn ihr eine gesicherte Verbindung nutzt, sonst auf false
// PORT entsprechend einstellen, z.B. 80 (ohne SSL) oder 443 (mit SSL)
IUpdateServer wsus = AdminProxy.GetUpdateServer("SERVERNAME", SSL, PORT);
// generelle Status-Informationen
UpdateServerStatus status = wsus.GetStatus();
output.Add("Total Computers: " + status.ComputerTargetCount);
// benötigte Updates
ComputerTargetScope scope = new ComputerTargetScope();
scope.IncludedInstallationStates =
UpdateInstallationStates.NotInstalled |
UpdateInstallationStates.InstalledPendingReboot |
UpdateInstallationStates.Downloaded;
scope.ExcludedInstallationStates = UpdateInstallationStates.Failed;
output.Add("Computers Needing Updates: " + wsus.GetComputerTargetCount(scope));
// Fehler
scope = new ComputerTargetScope();
scope.IncludedInstallationStates = UpdateInstallationStates.Failed;
output.Add("Computers With Errors: " + wsus.GetComputerTargetCount(scope));
// Ausgabe
textBox1.Lines = output.ToArray();
Diese Anwendung kann nun kompiliert und gestartet werden. Beim Klick auf den Button habe ich jedoch eine Exception erhalten - weil der Benutzer, unter dem ich bei Windows angemeldet ist, (natürlich) kein Administrator ist und somit seine Rechte nicht ausreichen, um auf den WSUS-Server zuzugreifen. Als Administrator ausgeführt zeigt die Anwendung jedoch die gewünschte Information an.
Bei "richtigen" Anwendungen, die produktiv eingesetzt werden sollen, muss diese Exception (eine System.Security.SecurityException) natürlich, wie jede andere Exception auch, abgefangen und behandelt werden.
Eure Anwendung kann nun die von Microsoft bereitgestellten Funktionalitäten zur Administrierung des WSUS-Servers nutzen. Damit lassen sich nicht nur Informationen auslesen, sondern ihr könnt alles machen, was auch in Microsofts WSUS-Konsole möglich ist - Updates freigeben, Computer in Gruppen verschieben, etc. pp.
Die nötige
Klassenreferenz könnt ihr hier nachlesen:
(Du musst Dich Einloggen oder Registrieren um Multimediadateien oder Links zu sehen).Viel Spaß beim Entwickeln und Testen!
Feedback und Kritik sind wie immer gern gesehen. Vielleicht nutzt ja der ein oder andere auch schon diese Möglichkeiten und möchte seinen Code mit uns teilen.