Add initial WF GetDataAreas findings

This commit is contained in:
Meik
2026-03-16 13:56:55 +01:00
parent ece7fd8e7c
commit 537754f6bc

View File

@@ -0,0 +1,354 @@
# LIAM WF GetDataAreas - Auffaelligkeiten und moegliche Fixes (initial)
## Ziel des Dokuments
Dieses Dokument betrachtet ausschliesslich den Stand `initial` (`f563d78417c8183ac0934beaa11d0f258b7537bf`).
Es bewertet die Rueckfrage, warum `WF Get DataAreas` in einer betroffenen Situation nicht mehr hunderte Datenbereiche, sondern nur noch sehr wenige Eintraege, beispielsweise `3`, zurueckliefern kann.
Ausdruecklich nicht im Fokus stehen hier:
- geaenderte `MaxDepth`
- geaenderte Naming-Conventions
- spaetere Aenderungen im aktuellen Hauptstand
Im Fokus stehen stattdessen nur moegliche Ursachen, die bereits im `initial`-Stand zu so einem Verhalten fuehren konnten:
- geaenderte Ordnerstruktur
- geaenderte Rechte auf Shares oder Ordnern
- geaenderte ACL-Situation
- geaenderte AD-Erreichbarkeit oder AD-Berechtigungen
- geaenderte DFS-Erreichbarkeit
- Logging-Luecken und stille Teilergebnisse
## Kurzfazit
Im `initial`-Stand ist das geschilderte Verhalten grundsaetzlich moeglich.
Die plausibelsten Ursachen fuer `frueher viele, jetzt nur noch wenige` sind im Altstand:
- geaenderte sichtbare Ordnerstruktur unterhalb des konfigurierten `RootPath`
- geaenderte Leserechte auf Teilbaeumen des Dateisystems
- Probleme beim rekursiven Traversieren, die im Code als Teilergebnis statt als klarer Fehler enden
- Probleme bei der Erreichbarkeit des Root-Pfads selbst, insbesondere bei UNC-/DFS-Pfaden
Reine AD-Probleme sind im `initial`-Stand fuer genau das Muster `es kommen noch 3 zurueck` deutlich weniger plausibel.
Wenn AD im `initial`-Stand wirklich nicht funktioniert, fuehrt das eher zu einem Fehlschlag des Logons und damit zu `null` oder zu einem kompletten Fehlerbild, nicht zu einer kleinen aber formal erfolgreichen Teilmenge.
Wichtig ist auch: Der `initial`-Stand verwendet fuer `GetDataAreas` noch keine explizite DFS-Klassifikation und keine Share-Enumeration. DFS-Probleme koennen also nur indirekt ueber den UNC-Pfad und dessen Dateisystemerreichbarkeit wirken, nicht ueber die spaetere Root-/DFS-Logik des heutigen Stands.
## Gepruefter Umfang
Fuer diese Einschaetzung wurden im `initial`-Stand insbesondere diese Dateien betrachtet:
- `LiamWorkflowActivities/C4IT.LIAM.WorkflowActivities.cs`
- `LiamWorkflowActivities/C4IT.LIAM.WorkflowactivityBase.cs`
- `LiamNtfs/C4IT.LIAM.Ntfs.cs`
- `LiamNtfs/cNtfsBase.cs`
- `LiamNtfs/cActiveDirectoryBase.cs`
- `LiamNtfs/C4IT_IAM_SET/cNetworkConnection.cs`
## Workflow-Verhalten im initial-Stand
Workflow-seitig ist der `initial`-Stand sehr duenn.
Die damalige Methode `getDataAreasFromProvider(Guid ProviderConfigClassID)` ruft den Provider direkt mit `ProviderEntry.Provider.getDataAreasAsync(ProviderEntry.Provider.MaxDepth)` auf und behandelt `null` oder `Count <= 0` pauschal als `No data areas found`.
Das bedeutet:
- Es gibt keine Unterscheidung zwischen technischem Fehler, Teilergebnis und wirklich leerem Bestand.
- Es gibt keine strukturierte Fehlerdiagnose fuer die Discovery.
- Es wird nicht protokolliert, wie viele Ordner theoretisch erreichbar gewesen waeren oder wo die Traversierung abgebrochen ist.
Damit ist bereits auf Workflow-Ebene erklaert, warum im Log oft nur wenig Aussagekraeftiges sichtbar ist.
## Discovery-Logik im initial-Stand
Die eigentliche Discovery sitzt in `cLiamProviderNtfs.getDataAreasAsync(int Depth = -1)`.
Die Logik ist im `initial`-Stand im Kern:
1. Lizenz pruefen
2. `LogonAsync()` ausfuehren
3. `RootPath` auf Leerwert pruefen
4. Root-Typ ueber die Anzahl der UNC-Segmente herleiten
5. `ntfsBase.RequestFoldersListAsync(this.RootPath, Depth)` aufrufen
6. alle zurueckgelieferten Ordner in `DataAreas` uebernehmen
Entscheidend ist:
- Es gibt im `initial`-Stand keine explizite DFS-Metadatenpruefung.
- Es gibt keine Share-Enumeration fuer den Root.
- Es wird direkt versucht, unterhalb des konfigurierten `RootPath` Dateisystemordner zu enumerieren.
Dadurch reagieren Ergebniszahl und Ergebnisqualitaet im `initial`-Stand primaer auf Dateisystemsichtbarkeit und Traversierungsrechte.
## Priorisierte Auffaelligkeiten im initial-Stand
### 1. Hoch: Zugriffsprobleme in der Ordnerrekursion werden als Teilergebnis zurueckgegeben
Das kritischste Verhalten fuer das geschilderte Fehlerbild steckt in `cNtfsBase.privRequestFoldersListAsync(DirectoryInfo rootPath, int depth, cNtfsResultFolder parent = null)`.
Wenn waehrend `rootPath.GetDirectories()` oder in tieferen Rekursionsstufen ein Fehler auftritt, landet der Code in einem allgemeinen `catch` und gibt einfach die bis dahin gesammelte Liste `folders` zurueck.
Das bedeutet fachlich:
- Ein Zugriff auf den Root kann funktionieren.
- Die Traversierung kann auf tieferen Ebenen an einzelnen Ordnern scheitern.
- Statt eines klaren Fehlers wird aber nur die bis dahin gefundene Teilmenge zurueckgegeben.
Genau dieses Verhalten passt sehr gut zu:
- `frueher hunderte`
- `jetzt noch 3`
- `im Log sehe ich nichts`
Wenn sich zwischenzeitlich Leserechte oder effektive Traversierungsrechte auf Teilbaeumen geaendert haben, kann der `initial`-Stand damit sehr gut nur noch wenige erreichbare Ordner zurueckliefern.
Das ist im `initial`-Stand keine theoretische Ecke, sondern ein reales stilles Fehlerbild.
### 2. Hoch: Aenderungen an der Ordnerstruktur wirken im initial-Stand direkt auf die Rueckgabemenge
Da der `initial`-Stand keine Root-Klassifikation ueber DFS-/Share-Metadaten macht, sondern schlicht rekursiv unterhalb von `RootPath` liest, haengt die Rueckgabemenge unmittelbar von der sichtbaren Ordnerstruktur ab.
Wenn beispielsweise:
- Unterordner entfernt wurden
- Verzeichnisstrukturen verschoben wurden
- Junctions oder Weiterleitungen anders wirken
- der konfigurierte Root heute auf einen kleineren Teilbaum zeigt
dann sinkt die Anzahl der gefundenen DataAreas direkt.
Im `initial`-Stand gibt es keine zusaetzliche semantische Schicht, die das noch abfedert oder klarer diagnostiziert.
### 3. Hoch: Der Root selbst muss erreichbar sein, sonst scheitert der gesamte Call
Vor dem eigentlichen Lesen fuehrt der Provider `LogonAsync()` aus.
Darin werden sowohl `ntfsBase.LogonAsync(LI)` als auch `activeDirectoryBase.LogonAsync(LI)` aufgerufen.
Das bedeutet:
- Der technische Benutzer muss den UNC-Root grundsaetzlich erreichen.
- Der AD-Login muss ebenfalls gelingen.
Wenn bereits der UNC-Zugriff auf `RootPath` scheitert, kommt es eher zu einem harten Fehlerbild.
Fuer das Muster `nur noch 3` ist deshalb weniger der komplette Ausfall des Root-Zugriffs interessant, sondern eher der Fall:
- Root erreichbar
- einige Unterordner oder Teilbaeume nicht mehr sauber lesbar
Genau dann greift wieder das stille Teilergebnis aus der Rekursion.
### 4. Mittel-Hoch: DFS-Probleme koennen im initial-Stand indirekt wirken
Im `initial`-Stand wird DFS fuer `GetDataAreas` nicht explizit ausgewertet.
Es gibt dort:
- keine DFS-Namespace-Klassifikation
- keine DFS-Link-Erkennung
- keine Nutzung von `NetDfsGetInfo()` im Discovery-Pfad
Das ist wichtig, weil dadurch spaetere Ursachen aus dem aktuellen Stand hier gerade nicht gelten.
Trotzdem kann DFS im `initial`-Stand indirekt relevant sein, wenn `RootPath` ein DFS-Pfad ist.
Dann wirken DFS-Probleme nicht ueber Metadatenklassifikation, sondern ueber die schlichte Tatsache, dass `DirectoryInfo(rootPath).GetDirectories()` auf diesem UNC-Pfad heute vielleicht nur noch teilweise oder gar nicht mehr funktioniert.
Moegliche Folgen:
- DFS-Ziel aktuell nicht sauber erreichbar
- Name oder Ziel nicht mehr korrekt aufloesbar
- technische Session landet auf anderem oder reduziertem Ziel
- Traversierung liefert nur eine kleine Teilmenge
Damit ist DFS im `initial`-Stand als indirekter Infrastrukturhebel durchaus plausibel, aber nicht ueber denselben Mechanismus wie im heutigen Stand.
### 5. Mittel: AD-Probleme erklaeren eher harte Fehler als kleine Treffermengen
Der `initial`-Stand koppelt NTFS- und AD-Logon eng zusammen.
Wenn `activeDirectoryBase.LogonAsync(LI)` scheitert, wird das gesamte `LogonAsync()` des Providers `false`, und `getDataAreasAsync()` gibt `null` zurueck.
Das spricht gegen AD als primaere Ursache fuer eine kleine, aber noch erfolgreiche Trefferliste.
Reine AD-Erreichbarkeitsprobleme passen im `initial`-Stand eher zu:
- kompletter Fehler
- keine DataAreas
- harter Ausfall beim Providerzugriff
Teilprobleme in AD koennen spaeter fuer Zusatzinformationen relevant sein, aber nicht besonders gut fuer `nur noch 3 DataAreas`.
### 6. Mittel: ACL-/Gruppenaufloesung beeinflusst eher Zusatzdaten als die Anzahl
Die ACL-Leselogik sitzt in `cActiveDirectoryBase.GetAccessControlList(string path)`.
Wenn dort auf einem Ordner die ACL nicht gelesen werden kann, wird `null` geliefert.
In der weiteren Verarbeitung fuehrt das eher dazu, dass zu einer bereits gefundenen DataArea Gruppeninformationen oder Owner-/Read-/Write-Zuordnungen fehlen.
Das reduziert im `initial`-Stand typischerweise nicht die Anzahl der gefundenen DataAreas selbst.
Darum gilt fuer die Fragestellung:
- geaenderte ACLs koennen die Zahl der DataAreas reduzieren, wenn sie die Ordner-Traversierung blockieren
- geaenderte ACLs erklaeren die reduzierte Zahl eher nicht, wenn nur die spaetere Permission-Group-Aufloesung betroffen ist
### 7. Mittel: `Depth = 0` ist im initial-Stand fachlich fehlerhaft
Im `initial`-Stand liefert `RequestFoldersListAsync(string rootPath, int depth)` bei `depth == 0` `null`.
Dadurch wird spaeter im Provider `DAL == null` als Fehler interpretiert und das bereits erzeugte Root-Objekt geht verloren.
Das ist ein echter Bug im Altstand.
Fuer die vorliegende Rueckfrage ist er aber nur dann relevant, wenn die betroffene Konfiguration wirklich `MaxDepth = 0` verwendet haette.
Da Konfigurationsaenderungen hier bewusst ausgeschlossen werden sollen, ist dieser Punkt eher nachrangig, aber als Code-Auffaelligkeit im `initial`-Stand trotzdem wichtig.
## Bewertung der konkret genannten Umweltfaktoren fuer initial
### Aenderungen an der Ordnerstruktur
Sehr plausibel.
Im `initial`-Stand wird direkt rekursiv unterhalb von `RootPath` gelesen. Wenn sich die effektive Struktur des Teilbaums geaendert hat, aendert sich die Anzahl der DataAreas unmittelbar.
### Aenderungen an der Rechtesituation auf Ordnern oder Teilbaeumen
Sehr plausibel.
Das ist sogar einer der staerksten Kandidaten, weil die Rekursion bei Fehlern nicht klar scheitert, sondern mit Teilergebnissen weiterarbeitet.
Wenn der technische Benutzer bestimmte Unterordner nicht mehr listen kann, koennen ganze Teilbaeume verschwinden, ohne dass das Ergebnis als Fehler gekennzeichnet wird.
### Aenderungen an ACLs
Teilweise plausibel.
Wenn ACL-Aenderungen die Ordner-Traversierung selbst beeinflussen, dann ja, sehr plausibel.
Wenn ACL-Aenderungen nur die spaetere Permission-Group-Aufloesung betreffen, dann eher nicht als Erklaerung fuer `nur noch 3`.
### Aenderungen an AD-Rechten oder AD-Erreichbarkeit
Eher als Primaerursache unplausibel fuer dieses konkrete Muster.
Im `initial`-Stand fuehren ernsthafte AD-Probleme eher zum kompletten Logon-Fehler als zu einer kleinen Restliste.
### Aenderungen an DFS-Erreichbarkeit
Plausibel, aber indirekt.
Im `initial`-Stand wirkt DFS nur ueber den UNC-Pfad und dessen praktische Erreichbarkeit. Wenn ein DFS-Pfad nicht mehr stabil oder nicht mehr gleich aufgeloest wird, kann das Lesen des Dateisystembaums reduziert oder unvollstaendig werden.
## Warum man im initial-Log wenig sieht
Der `initial`-Stand hat mehrere Diagnoseprobleme gleichzeitig:
- Workflow-seitig gibt es nur pauschale Aussagen wie `No data areas found`
- in der Ordnerrekursion gibt es ein stilles `catch` ohne strukturierte Diagnose
- es gibt keine Statistik ueber erkannte, verworfene oder fehlgeschlagene Unterbaeume
- es gibt keine Kennzeichnung von Teilergebnissen
Dadurch kann ein fachlich stark reduziertes Ergebnis technisch wie ein normaler erfolgreicher Call aussehen.
## Moegliche Fixes fuer den initial-Stand
### 1. Rekursive Traversierung darf Fehler nicht still in Teilergebnisse umwandeln
Empfohlene Aenderung:
- Das innere `catch` in `privRequestFoldersListAsync()` sollte nicht kommentarlos `folders` zurueckgeben.
- Stattdessen muss mindestens geloggt werden, an welchem Pfad die Traversierung abgebrochen ist.
- Besser waere ein Ergebnisobjekt, das `Success`, `PartialResult` und `FailedPaths` sauber trennt.
Nutzen:
- Berechtigungs- oder Infrastrukturfehler auf Teilbaeumen werden endlich sichtbar.
- Der Unterschied zwischen `wirklich nur 3 vorhanden` und `nur 3 erreichbar` wird nachvollziehbar.
### 2. Teilergebnisse im Workflow explizit kennzeichnen
Empfohlene Aenderung:
- Workflow-seitig nicht nur `null` oder `Count <= 0` behandeln.
- Discovery-Ergebnis um Diagnosedaten erweitern, etwa:
- `IsPartial`
- `FailedPathCount`
- `LastTraversalError`
Nutzen:
- Die Workflow-Schicht bekommt eine belastbare Grundlage fuer Support und Betrieb.
### 3. RootPath und Traversierungsstatistik mitloggen
Empfohlene Aenderung:
Pro Call mindestens loggen:
- `RootPath`
- `Depth`
- Anzahl direkt gefundener Ordner
- Anzahl rekursiv gefundener Ordner
- Anzahl abgebrochener Teilbaeume
Nutzen:
- Schon ein einzelner Logauszug reicht spaeter fuer eine deutlich bessere Einordnung.
### 4. AD-Login fuer reine Discovery vom ACL-/Gruppenmapping entkoppeln
Empfohlene Aenderung:
- Fuer die reine Ordnerdiscovery sollte die NTFS-Erreichbarkeit ausschlaggebend sein.
- AD-Fehler sollten die spaetere Zusatzdatenaufloesung beeintraechtigen koennen, aber nicht zwingend die gesamte Discovery blockieren.
Nutzen:
- Reine AD-Stoerungen fuehren nicht mehr automatisch dazu, dass Discovery unnoetig komplett scheitert.
- Die Ursachenanalyse wird klarer getrennt.
### 5. Diagnosemodus fuer den Dateibaum einfuehren
Empfohlene Aenderung:
- Optionaler Diagnosemodus, der je Traversierungsebene protokolliert:
- welcher Pfad gelesen wurde
- wie viele Unterordner gefunden wurden
- an welchem Pfad ein Fehler auftrat
Nutzen:
- Gerade fuer sporadische Infrastrukturprobleme ist das deutlich hilfreicher als das bisherige allgemeine Fehlerbild.
## Praktische Pruefungen fuer den betroffenen initial-Fall
Wenn der Fehler im `initial`-Stand analysiert werden soll, sind diese Pruefungen am wahrscheinlichsten zielfuehrend:
1. Den exakten `RootPath` der betroffenen Konfiguration pruefen.
2. Mit dem technischen Benutzer denselben UNC-Pfad ausserhalb des Workflows rekursiv lesen.
3. Pruefen, ob auf tieferen Teilbaeumen Leserechte oder Traversierungsrechte geaendert wurden.
4. Falls der `RootPath` ein DFS-Pfad ist, pruefen, ob dieser im betroffenen Zeitraum noch auf dasselbe Ziel und mit derselben Erreichbarkeit aufgeloest wurde.
5. AD-Probleme nur dann priorisieren, wenn es Indizien fuer generelle Logon-Fehler oder komplett fehlgeschlagene Providerinitialisierung gibt.
## Schlussbewertung
Nur fuer den Stand `initial` betrachtet, sind die wahrscheinlichsten Ursachen fuer `statt hunderten nur noch 3 DataAreas`:
- geaenderte sichtbare Ordnerstruktur
- geaenderte Leserechte auf Unterordnern oder Teilbaeumen
- indirekte DFS-/UNC-Erreichbarkeitsprobleme auf dem verwendeten Root-Pfad
Deutlich weniger wahrscheinlich als primaere Ursache sind:
- reine AD-Rechteprobleme
- reine ACL-/Gruppenmapping-Probleme nach erfolgreicher Discovery
Die wichtigste technische Auffaelligkeit im `initial`-Stand ist, dass Fehler in der Ordnerrekursion still zu Teilergebnissen werden koennen. Genau das kann das beobachtete Verhalten sehr gut erklaeren, ohne dass im Log ein klarer Fehler sichtbar wird.