Fix BizTalk catalog collection and diagnostics
Build und Test / build (push) Has been cancelled

This commit is contained in:
2026-07-28 09:29:57 +02:00
parent 53fcfb84a4
commit 6db6e60121
7 changed files with 683 additions and 148 deletions
+101 -30
View File
@@ -21,7 +21,7 @@ ACC und PROD besitzen jeweils einen lokalen BizTalk Server 2020. Ein Prozess auf
```text
ACC BizTalk Server PROD BizTalk Server
| |
| lokales WMI | lokales WMI
| WMI + ExplorerOM | WMI + ExplorerOM
v v
ACC JSON + lokale XLSX PROD JSON + lokale XLSX
\ /
@@ -42,10 +42,9 @@ CommandLineOptions
+-- validiert lokalen Modus oder Merge-Modus
BizTalkWmiCollector
+-- MSBTS_Application
+-- MSBTS_ReceivePort
+-- MSBTS_SendPort
+-- MSBTS_ReceiveLocation
+-- lokales MSBTS_GroupSetting per WMI
+-- lädt Microsoft.BizTalk.ExplorerOM aus GAC/Installationspfad
+-- Anwendungen und Ports per BtsCatalogExplorer
SnapshotStore
+-- normalisiert je Anwendung Adapterzählungen
@@ -58,37 +57,83 @@ XlsxReportWriter
+-- Titel, Filter, Freeze Pane und Summenzeile
```
## 4. WMI-Datenmodell
## 4. Datenzugriff
### 4.1 Anwendungen
### 4.1 Ursache des Fehlers `Invalid class`
`MSBTS_Application` ist die Pflichtquelle der Anwendungsliste. Verwendet wird nur `Name` beziehungsweise `ApplicationName`.
Die ursprüngliche Implementierung führte als erste Abfrage
`SELECT * FROM MSBTS_Application` im Namespace
`root\MicrosoftBizTalkServer` aus. Das von BizTalk Server dokumentierte WMI-Schema
enthält keine Klasse `MSBTS_Application`. WMI antwortet deshalb unabhängig von
einer administrativ gestarteten Konsole mit `Invalid class`.
Die Abfrage muss mindestens eine Anwendung liefern. Andernfalls ist der lokale Lauf unvollständig.
Auch die WMI-Portklassen bilden die fachliche Anwendungshierarchie nicht so
vollständig ab, dass damit Anwendungen ohne Ports zuverlässig erfasst werden
könnten. Der Fehler wird daher nicht nur abgefangen; der ungeeignete Zugriffsweg
wurde ersetzt.
### 4.2 Receive-Endpunkte
### 4.2 Lokale Gruppenermittlung per WMI
Eine `MSBTS_ReceiveLocation` zählt als ein Endpunkt. Der Adapter wird defensiv aus `AdapterName`, `TransportType` oder `PTTransportType` gelesen.
Verwendeter Namespace:
Da eine Receive Location abhängig vom WMI-Provider keine direkte `ApplicationName` liefern kann, wird vorher `MSBTS_ReceivePort` gelesen. Über `ReceivePortName` wird die Anwendung aufgelöst. Ein Receive Port zählt selbst nicht als Endpunkt.
```text
\\.\root\MicrosoftBizTalkServer
```
### 4.3 Send-Endpunkte
Verwendete Abfrage:
Bei `MSBTS_SendPort` zählt die primäre Transportkonfiguration als ein Endpunkt. Ist eine sekundäre Transportkonfiguration vorhanden, zählt sie als zusätzlicher Endpunkt.
```sql
SELECT Name, MgmtDbServerName, MgmtDbName FROM MSBTS_GroupSetting
```
Primärer Adapter:
Der Punkt im Namespace erzwingt den lokalen Computer. Die Abfrage liefert den
BizTalk-Gruppennamen und das Ziel der Management-Datenbank. Der konfigurierte
WMI-Timeout wird angewendet. Kennwörter werden weder benötigt noch protokolliert.
- `PTTransportType`
- Fallback `PrimaryTransportType`
- Fallback `AdapterName`
- Fallback `TransportType`
### 4.3 Kataloglesung per Explorer Object Model
Sekundärer Adapter:
Die Assembly `Microsoft.BizTalk.ExplorerOM.dll` wird zur Laufzeit geladen. Dadurch
bleibt das Quellprojekt auf einem Build-Rechner ohne BizTalk-Assembly kompilierbar;
für den echten Inventarlauf müssen die BizTalk-Verwaltungskomponenten lokal
installiert sein.
- `STTransportType`
- Fallback `SecondaryTransportType`
Ladestrategie:
Fehlt ein gelieferter Adaptername, wird `Unbekannt` verwendet. Ein Endpunkt ohne Anwendungszuordnung macht den Lauf unvollständig, weil er sonst in der Anwendungssicht verloren ginge.
1. normale Typauflösung der bereits verfügbaren Assembly
2. Laden aus dem Global Assembly Cache
3. kompatible GAC-Auflösung ohne fest verdrahtete Assemblyversion
4. bekannte BizTalk-Installationsverzeichnisse unter `Program Files`
`BtsCatalogExplorer.ConnectionString` verwendet ausschließlich integrierte
Windows-Authentifizierung. Die Anwendung ruft weder `SaveChanges` noch eine andere
ändernde ExplorerOM-Methode auf.
Die Eigenschaft `Applications` liefert auch Anwendungen ohne Ports. Pro Anwendung
werden nur folgende Eigenschaften gelesen:
- `Name`
- `SendPorts`
- `SendPort.PrimaryTransport.TransportType.Name`
- `SendPort.SecondaryTransport.TransportType.Name`
- `ReceivePorts`
- `ReceivePort.ReceiveLocations`
- `ReceiveLocation.TransportType.Name`
### 4.4 Receive-Endpunkte
Eine Receive Location zählt als ein Endpunkt. Der Adaptername stammt aus
`ReceiveLocation.TransportType.Name`. Ein Receive Port ist nur ein Container und
zählt selbst nicht als Endpunkt.
### 4.5 Send-Endpunkte
Bei einem Send Port zählt die primäre Transportkonfiguration als ein Endpunkt. Ist
eine sekundäre Transportkonfiguration vorhanden, zählt sie als zusätzlicher
Endpunkt.
Fehlt ein Adaptername, wird `Unbekannt` verwendet. Die Anwendung ist durch die
Iteration innerhalb von `Application.SendPorts` beziehungsweise
`Application.ReceivePorts` eindeutig vorgegeben.
## 5. Snapshot-Format
@@ -170,7 +215,8 @@ Der Filter umfasst nur Kopf- und Datenzeilen, nicht die Summenzeile. Die ersten
## 8. Fehlerverhalten
Alle vier WMI-Abfragen bilden einen Pflichtabschnitt. Ein Fehler führt zu:
Die WMI-Gruppenermittlung und die vollständige ExplorerOM-Kataloglesung bilden
gemeinsam einen Pflichtabschnitt. Ein Fehler führt zu:
- Exitcode `1`
- Logeintrag
@@ -181,11 +227,33 @@ Der Merge lehnt einen solchen JSON-Snapshot ab. Dadurch werden technische Lücke
Ungültige Parameter, fehlende Dateien, fehlerhaftes JSON und Schreibfehler liefern Exitcode `2`.
### 8.1 Diagnosedaten
Fortschrittsmeldungen werden gleichzeitig auf die Konsole und in eine
UTF-8-Logdatei geschrieben. Die Detailprotokollierung umfasst:
- Laufzeit-, Betriebssystem- und Prozessarchitektur
- Windows-Identität und Administratorstatus
- WMI-Namespace und Timeout
- vollständige WQL-Anweisung, Laufzeit und Datensatzanzahl
- BizTalk-Gruppe sowie Management-DB-Server und -Name
- ExplorerOM-Assemblyname, Version und Dateipfad
- jede gelesene Anwendung und jeden gezählten Endpunkt mit Adaptertyp
- Gesamtzahlen für Anwendungen, Send Ports, sekundäre Transporte, Receive Ports
und Receive Locations
Eine Ausnahme wird mit Typ, Meldung, HRESULT in Hexadezimalschreibweise,
`ManagementException.ErrorCode`, inneren Ausnahmen und Stacktrace ausgegeben.
`TargetInvocationException` wird dabei bis zur eigentlichen Provider- oder
Datenbankausnahme aufgelöst.
## 9. Sicherheit
- ausschließlich lesende lokale WMI-Abfragen
- keine Änderungen an BizTalk-Konfiguration oder Runtime
- keine SQL-Abfragen
- ausschließlich lesende Katalogabfragen über das lokale BizTalk Explorer Object Model
- keine Aufrufe von `SaveChanges` oder ändernden BizTalk-Methoden
- keine selbst formulierten SQL-Abfragen; ExplorerOM liest die Management-Datenbank
über integrierte Windows-Authentifizierung
- keine Endpunktadressen
- keine Binding-Exporte
- keine Credentials, Secrets oder Tokens
@@ -203,6 +271,7 @@ Baseline:
- C# 7.3
- keine NuGet-Pakete
- kein .NET SDK erforderlich
- keine compile-time-Referenz auf `Microsoft.BizTalk.ExplorerOM.dll`
```cmd
scripts\build-release.cmd
@@ -227,10 +296,12 @@ Je Umgebung:
1. `--self-test` erfolgreich ausführen.
2. Lokalen Lauf in administrativer `cmd.exe` starten.
3. Exitcode `0` und Log prüfen.
4. Anwendungsgesamtzahl mit der BizTalk Administration Console vergleichen.
5. Send Ports, sekundäre Transporte und Receive Locations stichprobenartig zählen.
6. Nur die vollständige JSON-Datei für den Merge verwenden.
3. Im Log die erfolgreiche WMI-Abfrage `MSBTS_GroupSetting` prüfen.
4. Im Log Assemblyname, Version und Pfad von ExplorerOM prüfen.
5. Exitcode `0` und `IsComplete: true` prüfen.
6. Anwendungsgesamtzahl mit der BizTalk Administration Console vergleichen.
7. Send Ports, sekundäre Transporte und Receive Locations stichprobenartig zählen.
8. Nur die vollständige JSON-Datei für den Merge verwenden.
Nach dem Merge: