Wiederholte Alarme bei Ãœberwachung von SCCM 2007 SP2 mit SCOM 2007 R2
Mittwoch, 29. September 2010, 22:41
Abgelegt unter: Erkenntnisse | Tags: , , , ,

Schon vor längerer Zeit habe ich einmal in unsere SCOM-Installation das „Microsoft System Center Configuration Manager 2007 SP2 Management Pack for Microsoft System Center Operations Manager 2007 R2“ (Version 6.0.6000.2) importiert, um damit unsere Configuration Manager Umgebung zu überwachen.  Denn wieso soll ich z.B. regelmässig selber manuell den Site Status unserer Sites kontrollieren, wenn das der Operations Manager für mich tun kann?

Doch an diesem Management-Pack hatte ich keine Freude. Zwar funktionierte die Erkennung von Fehlern recht zuverlässig:

  • Ein Paket konnte nicht auf einen Distribution Point bereitgestellt werden. Alert von SCOM!
  • Ein Site Backup konnte nicht erstellt werden. Alert von SCOM!
  • Der SMS Executive crashte auf einem Server. Alert von SCOM!
  • usw.

Die entsprechenden Fehler wurden behoben und die Alerts geschlossen. Alles bestens, oder?

Nein, leider nicht ganz, denn kurz darauf:

  • Alert von SCOM: Ein Paket konnte nicht auf einem Distribution Point bereitgestellt werden!
  • Alert von SCOM: Ein Site Backup konnte nicht erstellt werden!
  • Alert von SCOM: Der SMS Executive crashte auf einem Server!
  • usw.

Was schon wieder? Tatsächlich: SCOM rapportierte dieselben Ereignisse nochmals. Ja, exakt „dieselben Ereignisse“ nochmals, obwohl der Fehler längst behoben war! Egal, wieviele Male man die betreffenden Alerts schloss, kurz darauf waren sie wieder erneut da. Dies natürlich immer mitsamt Generierung der entsprechenden Alert-Mails usw. Erst am Tag darauf kehrte wieder Ruhe ein.

Vor allem als uns etwa vor einem Monat die Verbindung zum Datenbankserver tauchte, herrschte nachher reger Mailverkehr in meiner Mailbox. Und die SCOM-Konsole war komplett unübersichtlich: Unzählige Alerts wurden da aufgelistet und man verlor völlig den Ãœberblick. Und egal wieviele Male man diese Alerts schloss, um wieder eine aufgeräumte Konsole zu erhalten, füllte sich diese innert weniger Minuten erneut. Und die Mailbox dazu…

Ich war kurz davor, das Management-Pack wegen „völliger Unbrauchbarkeit“ zu entsorgen. Und dann las ich den Blogbeitrag „Want to drastically quiet down your ConfigMgr 2007 MP?“ von Kevin Holman, publiziert am 1. September 2010.

Dieser Blogbeitrag beschreibt genau dieses Phänomen und nennt die Ursache dieser wiederholten Alarme. So schreibt Kevin Holman über die sog. „Consolidation Rules“, die noch von MOM 2005 her stammen:

„What happens is – this consolidation rule causes the alert to continuously repeat, even if the status message is no longer in the database!  If you resolve the condition, close the alert, the alert will be regenerated within a few minutes from the Healthservice that loaded this converted consolidation rule.  The purpose behind these consolidation rules was to control a burst of status messages that occur within a short period of time.  However – they aren’t working as designed today, and furthermore are the cause of the massive repeat counts and re-alerting on old conditions.“

Kevin Holman nennt dann auch die simple Lösung für das Problem: „Consolidation Rules“ deaktivieren! Und netterweise liefert er auch mit seinem Beitrag noch ein „Addendum Management Pack“ mit, das genau diese Aufgabe übernimmt.

Tatsächlich: Seit ich dieses (in seinem Blogbeitrag verlinkte) „Addendum Management Pack“ importiert habe, funktioniert die Ãœberwachung genau so wie ich mir das vorstelle:

  • Problem in SCCM, Alert in SCOM
  • SCCM-Problem gefixt, SCOM-Alert geschlossen.
  • Problem doch nicht erfolgreich gefixt, Alert wieder da…
  • SCCM-Problem erfolgreich gefixt. Kein erneuter Alert mehr.

Mit dem „Addendum Management Pack“ von Kevin Holman wird das „SCCM 2007 SP2 Management Pack“ tatsächlich brauchbar!

Thank you very much, Mr. Holman!



Zugriff aus Powershell via WMI auf System Center Configuration Manager
Donnerstag, 9. September 2010, 09:19
Abgelegt unter: Anleitungen | Tags: , , ,

Während den letzten Tagen habe ich mich etwas intensiver mit der Powershell 2.0 befasst und ich habe mich gefragt, ob und wie ich bestimmte Daten mit Hilfe eines Powershell-Skriptes aus SCCM auslesen kann. So habe ich mir vorgenommen, ein Skript zu schreiben, das mir eine Liste aller vorhanden Clients ausgibt und dabei die Info aus SCCM mitliefert, welcher Benutzer letztmals an diesem Client angemeldet war und wann die letzte Kommunikation des Agent mit dem SCCM-Site Server erfolgte.

Konkret interessierte ich mich also für folgende drei Feldwerte aus den Eigenschaften eines Computerobjektes:

  • Name
  • Last Logon User Name
  • Agent Time (neuester Eintrag)

Der erste Teil des Skriptes war einfacher zu realisieren, als ich dies zuerst vermutete:

$query = New-Object System.Management.ObjectQuery
$query.QueryString = "Select * from SMS_R_System order by Name" $searcher = New-Object`
System.Management.ManagementObjectSearcher($query)
$searcher.Scope.Path = "\\<siteserver>\root\sms\site_<sitecode>"
$result=$searcher.Get()

Ich verwende also die ObjectQuery-Klasse aus dem .NET-Framework, setze die entsprechende Query (die natürlich die gewünschten Felder zielgerichteter auslesen könnte, als mit dem simplen „Select *“), und benutze dann die ManagementObjectSearcher-Klasse, um die Abfrage der gewünschten Informationen basierend auf der definierten Query durchzuführen. Hierzu muss natürlich noch definiert werden, wo genau die Daten gelesen werden sollen, wozu in der vierten Zeile <siteserver> durch den Namen des entsprechenden SCCM-Siteservers und <sitecode> durch den dazu passenden Sitecode zu ersetzen ist. Nun noch die Suche gestartet, und schon stehen die gewünschten Daten in $result.

Bis ich nun die Daten als passend formatierte Tabelle in der Powershell lesen konnte, musste ich deutlich länger suchen (und einem Kollegen auf den Wecker gehen). Schlussendlich führte folgende Codezeile – man beachte die unzähligen Backticks „`“ für die Fortsetzung der Zeile auf einer neuen Linie – zum Ziel:


$result | `
format-table `
@{label="Computername";`
expression={$_.Name.tolower()};`
width=16},`
@{label="Letzter Benutzer";`
expression={$_.LastLogonUserName};`
width=20},`
@{label="Letzte Agent-Kommunikation";`
expression={(([WMI] "").ConvertToDateTime(`
$($_.AgentTime | Sort-Object | Select-Object -Last 1)`
)).tostring("dd.MM.yyyy HH:mm:ss")};`
width=20}

Der Anfang dieser Zeile – ja es ist eine einzige Zeile! – ist nicht besonders schwierig zu verstehen. Der Inhalt von $result wird an den Befehl format-table übergeben, der dann die drei Datenfelder formatiert ausgibt, wobei die Definition eines Datenfeldes jeweils beim @ beginnt.

Bei den beiden ersten Spalten sind keine grossen Besonderheiten zu finden: Ich setze jeweils die gewünschte Spaltenüberschrift (label) und gebe mit dem jeweiligen Ausdruck (expression) den aktuellen ($_) Inhalt des jeweiligen Feldes aus, wobei ich noch die gewünschte Breite der Spalte (width) festlege. Beim Computernamen verwende ich zusätzlich noch die Funktion tolower(), da ich eine Liste mit Computernamen in Kleinbuchstaben lesbarer finde.

Die Expression für das Datum der letzten Kommunikation ist jedoch nicht mehr ganz so trivial; Ursache dafür ist die Tatsache, dass alle Zeitstempel im Format „yyyymmddHHMMSS.mmmmmmsUUU“ geliefert werden. Ich benutze deshalb die Funktion ConvertToDateTime, um daraus eine „brauchbare“ Zeit zu machen, die dann mit tostring("dd.MM.yyyy HH:mm:ss") in die gewünschte Darstellung umgewandelt wird.

Bleibt also noch die Zeile „$($_.AgentTime | Sort-Object | Select-Object -Last 1)“ zu erläutern: In SCCM ist AgentTime ein mehrwertiges Feld, d.h. es werden mehrere Zeitstempel gespeichert, wann ein Client mit dem Server gesprochen hat. Die gespeicherten Werte werden deshalb per Pipe an den Sortierer geschickt und dann der letzte (d.h. der neueste) Wert ausgewählt.

Klar: Dieses Skript ist nichts besonderes; es gibt in SCCM vordefinierte Reports, welche dieselbe Informationen (und noch mehr dazu) mit Hilfe weniger Mausklicks liefern können. Doch dieses Skript zeigt exemplarisch, wie so eine Query in Powershell realisiert werden könnte, womit diese auch als Basis für komplexere Abfragen dienen könnte.

Komplette Skriptdatei: computersystems.ps1 (zip)