Server werden per Registry-Wert in Klassen einsortiert – ändert sich der Wert, bleiben sie trotzdem in der alten Klasse. Wie SCOM Objekte wieder „vergisst“ und was dafür nötig ist.
Ein Community-Mitglied hatte mehrere Klassen-Discoveries geschrieben, die Server anhand eines Registry-Werts gruppieren. Das Problem: War ein Server einmal in einer Klasse, blieb er dort – auch nachdem sich der Registry-Wert geändert hatte und er eigentlich zu einer anderen Klasse gehörte. Nach einem Monat erfolgloser Fehlersuche war die Frustration entsprechend groß.
Wie SCOM Objekte entfernt
Operations Manager entfernt ein erkanntes Objekt nur dann automatisch, wenn dieselbe Discovery, die es erstellt hat, bei einem späteren Durchlauf Discovery-Daten ohne dieses Objekt zurückmeldet. Man spricht von Snapshot-Semantik: Jede Discovery liefert den vollständigen aktuellen Stand ihrer Objekte.
Daraus ergeben sich typische Fallstricke:
- Skript-Discoveries, die bei „kein Treffer“ nichts zurückgeben: Bricht ein Skript ab oder gibt es kein Discovery-Datenobjekt zurück, ändert SCOM nichts – das alte Objekt bleibt. Richtig ist, auch bei keinem Treffer ein leeres Discovery-Datenobjekt zurückzugeben.
- Lange Intervalle: Läuft die Discovery nur einmal täglich, dauert es entsprechend, bis eine Änderung sichtbar wird.
- Mehrere Discoveries für dieselbe Klasse: Hat eine andere Discovery das Objekt ebenfalls gemeldet, bleibt es bestehen, solange diese es weiter meldet.
- Deaktivierte Discovery: Wird eine Discovery deaktiviert, meldet sie gar nichts mehr – die Objekte bleiben, bis
Remove-SCOMDisabledClassInstanceausgeführt wird.
Skript-Discovery richtig gebaut
param($SourceId, $ManagedEntityId, $ComputerName)
$api = New-Object -ComObject 'MOM.ScriptAPI'
$data = $api.CreateDiscoveryData(0, $SourceId, $ManagedEntityId)
$value = (Get-ItemProperty 'HKLM:\SOFTWARE\Firma\Rolle' -ErrorAction SilentlyContinue).Typ
if ($value -eq 'Web') {
$inst = $data.CreateClassInstance('$MPElement[Name="Firma.Server.Web"]$')
$inst.AddProperty('$MPElement[Name="Windows!Microsoft.Windows.Computer"]/PrincipalName$', $ComputerName)
$data.AddInstance($inst)
}
# Immer zurückgeben – auch leer. Nur so kann SCOM Objekte wieder entfernen.
$data
Bei Registry-Discoveries mit dem gefilterten Registry-Provider sorgt der Provider selbst für die Snapshot-Semantik: Passt der Filter nicht mehr, wird beim nächsten Durchlauf ein leerer Snapshot gemeldet und die Instanz entfernt.
Alternative für reine Gruppierung
Geht es nur um das Gruppieren von Servern (für Overrides, Ansichten oder Berechtigungen), ist eine eigene Klasse oft gar nicht nötig. Eine Gruppe mit dynamischer Mitgliedschaft auf Basis einer erkannten Eigenschaft – etwa eines Registry-Attributs, das als Eigenschaft einer erweiterten Windows-Computer-Klasse erfasst wird – ist einfacher zu pflegen.
Heute
Das Discovery-Verhalten ist in allen Operations-Manager-Versionen gleich. Die leere Rückgabe bei Skript-Discoveries ist einer der häufigsten Fehler in selbst entwickelten Management Packs.