Eine Discovery soll Server anhand eines DWORD-Werts in der Registry einer Klasse zuordnen – doch es wird nichts gefunden. Datentypen, Pfadtyp und die ClassId sind die üblichen Verdächtigen.
Beim Entwickeln eines Management Packs für eine Anwendung sollte eine Discovery Server einer Klasse „Standby-Server“ zuordnen, wenn ein bestimmter Registry-Wert den Wert 2 hat:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\AppServer\Parameters\HotStandBy]
"MQHotStandBy_Mode"=dword:00000002
Die übergeordnete Klasse wurde korrekt erkannt – die Standby-Klasse aber nie. Ein genauer Blick auf das XML zeigt gleich mehrere typische Fehlerquellen.
Der Aufbau einer Registry-Discovery
Die Datenquelle Microsoft.Windows.FilteredRegistryDiscoveryProvider liest einen oder mehrere Registry-Werte, filtert sie mit einem Ausdruck und erzeugt bei einem Treffer eine Instanz:
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.FilteredRegistryDiscoveryProvider">
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<RegistryAttributeDefinitions>
<RegistryAttributeDefinition>
<AttributeName>HotStandBy</AttributeName>
<Path>SYSTEM\CurrentControlSet\services\AppServer\Parameters\HotStandBy\MQHotStandBy_Mode</Path>
<PathType>1</PathType> <!-- 0 = Schlüssel, 1 = Wert -->
<AttributeType>2</AttributeType> <!-- 0 = Boolean (existiert), 1 = String, 2 = Integer -->
</RegistryAttributeDefinition>
</RegistryAttributeDefinitions>
<Frequency>3600</Frequency>
<ClassId>$MPElement[Name="App.ServerRole.Standby"]$</ClassId>
<InstanceSettings>...</InstanceSettings>
<Expression>
<SimpleExpression>
<ValueExpression><XPathQuery Type="Integer">Values/HotStandBy</XPathQuery></ValueExpression>
<Operator>Equal</Operator>
<ValueExpression><Value Type="Integer">2</Value></ValueExpression>
</SimpleExpression>
</Expression>
</DataSource>
Die drei häufigsten Fehler
1. Falsche ClassId ClassId muss die Klasse sein, die entdeckt werden soll – also dieselbe wie unter DiscoveryTypes. Im ursprünglichen Beispiel stand dort die übergeordnete Klasse, auf die die Discovery zielt. SCOM versucht dann, eine Instanz der falschen Klasse anzulegen.
2. Datentypen passen nicht zusammen Ein DWORD wird mit AttributeType 2 als Integer gelesen. Wird im Ausdruck anschließend mit Type="String" verglichen, schlägt der Vergleich je nach Situation fehl. Verwenden Sie für XPath-Abfrage und Vergleichswert konsistent Integer.
3. Schlüsseleigenschaften fehlen Unter InstanceSettings müssen alle Schlüsseleigenschaften der neuen Klasse und ihrer Hostklasse gesetzt werden – bei einer auf dem Computer gehosteten Klasse mindestens der PrincipalName des Computers. Fehlt eine Schlüsseleigenschaft, wird die Instanz verworfen.
Testen
- Die Discovery-Frequenz zum Testen kurz halten (z. B. 300 Sekunden) und später erhöhen.
- Im Ereignisprotokoll Operations Manager des Agenten auf Fehler beim Verarbeiten der Discovery-Daten achten.
- Mit dem Workflow-Analyzer bzw. der Ablaufverfolgung prüfen, welche Werte die Datenquelle tatsächlich liefert.
Heute
Die Registry-Discovery funktioniert in allen Operations-Manager-Versionen gleich. Mit den Visual Studio Authoring Extensions lassen sich solche Fehler durch Vorlagen und Schema-Validierung deutlich früher erkennen.