Benutzer mit den meisten Antworten
Fehler bei Verwendung von System.DirectoryServices.AccountManagement.PrincipalCollection

Frage
-
Hallo,
für ein kleines Tool hole ich u.a. eine Liste der Windows-Benutzergruppen (GroupPrincipal) und will zu jeder Gruppe die Mitgliederliste bekommen (GroupPrincipal.Members) als PrincipalCollection. Das geht auch, aber bei einigen Gruppen (bei mir Admisistratoren und Remotedesktopbenutzer) bekomme ich beim Zugriff auf die Collection einen Fehler: "Fehler (1332) beim Auflisten der Gruppenmitgliedschaft. Die SID des Members konnte nicht aufgelöst werden."
Seltsamerweise funktioniert der Zugriff per "For Each" für die ersten Members, bis er auf den Fehler läuft. Deshalb wollte ich stattdessen "For i=0 to .Count-1" nehmen, aber schon der Zugriff auf Count der Collection wirft eine Exception. Selbst in der Schnellüberwachung des Debuggers wird beim Count-Element der Fehler angezeigt.
Wie kommt sowas zustande und was kann ich tun?
Gruß,
Winfried
Antworten
-
Hallo Winfried,
in der Tat lässt das Ticket bei Connect wenig hoffen. :(
Den von Dir beschrieben Fehler sowie die PrincipalOperationException aus dem AccountManagement-Namespace konnte ich reproduzieren.
Um die User zu enumerieren, konnte mir auf die Schnelle mit WMI behelfen. Nicht schön aber zum Beispiel kommst Du mit dem ManagementObjectSearcher aus System.Management sowie auch mit Hilfe des System.DirectoryServices.DirectoryEntry-Objektes an die gewünschte Auflistung, ohne den Fehler zu erzeugen.
Auch wenn damit nicht Sinn oder Unsinn der Frage hinter dem als "By Design" geschlossenen Ticket geklärt ist, hoffe ich, dass dieser Ansatz Dir bei der Lösung des ursprünglichen Problems hilft.
Schöne Grüße,
Thomas- Als Antwort markiert WiWo Sonntag, 5. Oktober 2014 09:31
Alle Antworten
-
Hallo Winfried,
ich vermute es handelt sich um verwaiste Elemente, zu denen die Auflösung des Account Name nicht mehr möglich ist. Probiere doch mal im Code-Block Deines For Each die zum Fehler spezifische Exception (evtl. IdentityNotMappedException?) mit einem Try Catch zu behandeln.
Bei Bedarf kannst Du dabei die betreffenden Elemente zusätzlich in einer Liste sammeln, um später aufräumen zu können.
Viel Erfolg,
Thomas -
Hallo Thomas,
ein Try/Catch innerhalb der For/Each-Schleife bringt leider nichts, da der Fehler schon in der For/Each-Anweisung selber auftritt, also auch bei einer leeren For/Each-Schleife. In meinem Schleifencode sammle ich schon alles, was ich kriegen kann, weiß aber nicht, ob nach dem Fehler eigentlich noch weitere Daten kommen könnten, da die Schleife dann ja abgebrochen ist.
Bei meiner Suche im Web zu dem Fehler, der wohl nicht ganz unbekannt ist, bin ich auf
gestoßen; das Ticket wurde schon 2009 geschlossen mit dem Versprechen des MS-Mitarbeiters, an der API was zu ändern. Die Ursache des Fehlers sind verwaiste ActiveDirectory-Einträge. Die sollte man löschen. Was ich dazu im Netz gefunden hab, bezog sich aber alles auf Server in Domänen; bei mir tritt das Problem aber auf einem Win81-System im Workgroup-Netzt auf. Am liebsten würde ich solche verwaisten Einträge sowieso im eigenen Programm anzeigen und löschen können.
Gruß,
Winfried
-
Hallo Winfried,
in der Tat lässt das Ticket bei Connect wenig hoffen. :(
Den von Dir beschrieben Fehler sowie die PrincipalOperationException aus dem AccountManagement-Namespace konnte ich reproduzieren.
Um die User zu enumerieren, konnte mir auf die Schnelle mit WMI behelfen. Nicht schön aber zum Beispiel kommst Du mit dem ManagementObjectSearcher aus System.Management sowie auch mit Hilfe des System.DirectoryServices.DirectoryEntry-Objektes an die gewünschte Auflistung, ohne den Fehler zu erzeugen.
Auch wenn damit nicht Sinn oder Unsinn der Frage hinter dem als "By Design" geschlossenen Ticket geklärt ist, hoffe ich, dass dieser Ansatz Dir bei der Lösung des ursprünglichen Problems hilft.
Schöne Grüße,
Thomas- Als Antwort markiert WiWo Sonntag, 5. Oktober 2014 09:31
-
Danke für Deine Hilfe.
Ich kann für das Problem im Moment leider nicht mehr viel Zeit investieren und so habe ich es auch noch nicht mit WMI probiert. Allerdings habe ich per DirectoryServices.DirectoryEntry die User auch bekommen. Braucht aber viel länger (vielleicht wird per Netzwerk-Broadcast die Domäne durchsucht) und liefert nicht soviel Daten. Versuchsweise habe ich dabei auch mal den Maschinennamen benutzt, den mein Rechner ganz am Anfang hatte (ich hab ihn mal umbenannt) und siehe da, dort gibt es noch die alte User-Liste. Alle Versuche, die zu löschen, scheiterten aber an irgendwelchen Rechten. Keiner der Beispiele dazu, die ich im Internet gefunden habe, funktionierte. Wo diese User gespeichert sind, habe ich leider auch nicht gefunden; wohl nicht in der Registry.
Das Programm, für das ich die Liste der Windows-User (auch von Fremd-Rechnern im Netz) brauche, soll eigentlich die User-Verwaltung von SQL-Servern vereinfachen, da das SQL-Management-Studio zu komplex ist und auch nur bestimmte Einsatz-Szenarien berücksichtigt werden sollen. Das ist selber schon ein recht schwieriges Thema, wird aber durch die komplizierte Rechte-Verwaltung im Windows-Netz noch dramatischer. Normalerweise überlasse ich Server-Administration gerne den Fachleuten, aber eigentlich hab ich noch niemals irgendwen in meiner beruflichen Laufbahn getroffen, von dem ich den Eindruck hatte, er hätte den vollen Durchblick als Administrator, grade was die Rechte-Verwaltung angeht.
Gruß,
Winfried