Laden...

Ermitteln aller Active Directory Benutzereigenschaften

Erstellt von netsport vor 7 Jahren Letzter Beitrag vor 7 Jahren 3.081 Views
N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren
Ermitteln aller Active Directory Benutzereigenschaften

Hallo,

ich möchte mit der AccountManagement Klasse alle Eigenschaften der AD Benutzerkonten abfragen.
Dazu habe ich folgenden Code gefunden.

PrincipalContext dc = new PrincipalContext(ContextType.Domain,Domain.GetCurrentDomain().ToString());

UserPrincipal user = new UserPrincipal(dc);
user.Name = "*";

PrincipalSearcher pS = new PrincipalSearcher();

pS.QueryFilter = user;

PrincipalSearchResult<Principal> results = pS.FindAll();

Wenn ich diesen ausführe, enthält results nicht alle Eigenschaften der AD Benutzerkonten.
Gibt es ein Möglichkeit, die fehlenden Eigenschaften zu bekommen? Ich habe u.a. über eine Schemaerweiterung zusätzliche Eigenschaften erstellt, die ich nun benötige.

Vielen Dank.

Grüsse
netsport

Hinweis von Coffeebean vor 7 Jahren

Bitte benutze die Code-Tags [Hinweis] Wie poste ich richtig?

16.807 Beiträge seit 2008
vor 7 Jahren

Gar nicht, das kann dieser Namespace nicht.

Das geht nur über die DirectoryEntry-Klasse.
Ein DirectoryEntry-Objekt hat eine Properties Eigenschaft, hinter der eine PropertyValueCollection steckt.
Darüber bekommst Du alle Eigenschaften eines Directory Entry-Objekts; auch den User.

Wenn Du die Eigenschaften bereits namentlich kennst, dann schreib Dir ne Erweiterungsmethode.

    public static class AccountManagementExtensions
    {

        public static string GetPropertyByName (this Principal principal, string propertyName )
        {
            DirectoryEntry directoryEntry = principal.GetUnderlyingObject( ) as DirectoryEntry;

            if ( directoryEntry.Properties.Contains( propertyName ) )
            {
               return directoryEntry.Properties[ propertyName ].Value.ToString();
            }
            
            return null;
        }

        public static string GetCompany( this Principal principal )
        {
            return principal.GetPropertyByName( "company" );
        }
   }
N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

Hi,

vielen Dank für die umfangreiche Antwort.
Ich habe im Inet folgenden Link zu dem Thema gefunden.

Prinzipalerweiterungen

Könntest Du bitte bei Gelegenheit mal drübersehen, ob ich anhand dieses Beispiels ebenso die zusätzlichen Eigenschaften der AD User abfragen kann?

Grüsse
netsport

16.807 Beiträge seit 2008
vor 7 Jahren

Wieso probierst Du es nicht einfach aus...? 🤔

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

Hi,

weil ich gerade dabei bin, mit C# anzufangen. Habe viele Jahre mit Perl und Powershell gescriptet, habe aber nun Anforderungen, die mit Scripten nur sehr umständlich umzusetzen sind.
Seit einer Woche ziehe ich mir nun den Get Sharper Now Webcast rein und lese C# 6 mit VS 2015. Quasi Druckbetankung 😉
Da ich zu denen gehöre, die nicht nur mit Copy/Paste gegoogelten Quelltext verwenden, sondern verstehen möchte, was der Autor macht, bin ich aktuell dabei, zu verstehen, was der verlinkte MS QUelltext macht. In den Webcast und Büchern werden ja meist "einfache" Beispiele vorgetragen. Die MSDN Doku stellt für mich zur Zeit auch noch eine Hürde dar, da ich vom Scripten gewohnt war, mir Beispiele anzusehen und daraus zu lernen. In der MSDN stosse ich zur Zeit leider nur auf wenige Beispiele.

Aus diesen Gründen kann ich es zur Zeit nur bedingt selbst ausprobieren.

Grüsse
netsport

16.807 Beiträge seit 2008
vor 7 Jahren

Wir helfen Dir bei konkreten Problemen. Wir werden Dir aber nicht Deine Software schreiben oder evaluieren. Wir erwarten auch von Hilfesuchenden Eigeninitiative und selbst investierte Zeit.
Wir haben auch alle Jobs und Verpflichtungen. Wir machen das hier unentgeltlich und in unserer Freizeit. Danke fürs Verständnis.

Du willst Entwickler sein; und zu einem Entwickler gehört auch dazu, Quellcode auszuprobieren und Dokumentationen zu lesen. Es gibt auch mehr als nur die MSDN.
Du bittest genau das Gegenteil: dass jemand im Forum für Dich ein Snippet ausprobiert und sagt, ob es geht.
So funktioniert ein Forum nicht 😉

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

Hi,

entschuldige bitte, dass ich Dir offensichtlich nicht klar mitgeteilt habe, was mein Anliegen ist.
Selbstverständlich erwarte ich nicht, dass hier irgend jemand Software für mich schreibt. Ich möchte es ja selbst lernen.
Beim konkreten Quelltext (Link) war mein Anliegen, ob Du bei Gelegenheit drüberschaust, ob es überhaupt das Richtige für mein Problem ist. Du solltest es weder ausprobieren, noch irgendwas für mich entwickeln. Einfach nur mitteilen, ob die Richtung stimmt. Vergleichbar mit wenn jmd aus Frankfurt nach München möchte und fragt, ob man dazu wirklich nach Süden fahren muss. Es geht nicht um den konkreten Weg, sondern nur um die Richtung.
Ich bin davon ausgegangen, dass Du als Profi die Zeilen recht schnell verstehst und mir sagen könntest, ob diese grundsätzlich für die Lösung meines Problems zu gebrauchen sind. Das Testen und Anpassen sehe ich natürlich als meine Aufgabe.

Ich bin sicher nicht so anmassend, mich als Entwickler zu bezeichnen. Darüber denke ich mal in ein paar Jahren nach, wenn ich C# beherrsche 😃

Grüsse
netsport

16.807 Beiträge seit 2008
vor 7 Jahren

Beim konkreten Quelltext (Link) war mein Anliegen, ob Du bei Gelegenheit drüberschaust, ob es überhaupt das Richtige für mein Problem ist.

Sowohl mein Vorschlag (ich versteh nicht, wieso Du ihn ignorierst) wie auch das Sample (das Du einfach ausprobieren kannst) sind ein gangbarer Weg.

Ich würde das ganze nicht mit einer Fahrt von Frankfurt nach München vergleichen, sondern mit einem Schloss und einem Schlüsselbund.
Wenn Du nicht weißt, ob ein Schlüssel passt, dann versuchst Du doch auch die einzelnen Schlüssel aus, oder rufst Du ein Schlüsseldienst? 😉

Du wirst nicht sehr weit kommen bzw. sehr langsam sein, wenn Du nicht einfach auch mal Code ausprobierst.
Die meiste Zeit wirst Du die Entscheidung treffen müssen, ob Quellcode so funktionieren kann oder nicht 😉

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

Hi,

Dein Vergleich ist passender 😉

Deinen Vorschlag mit der System.DirectoryServices.DirectoryEntry Klasse habe ich mir schon angesehen. Habe im Vorfeld bereits mit der Klasse ausprobiert. Allerdings habe ich mich auf die System.DirectoryServices.AccountManagement Klasse eingeschossen, da diese "neuer" ist und deren Handling/Coding einfacher sein soll.

Ich konnte leider bis jetzt zu den Zeilen

[DirectoryRdnPrefix("CN")]
[DirectoryObjectClass("inetOrgPerson")]

leider nichts googlen, da ich nicht weiss, nach welchem Stichwort ich suchen muss.
Kannst Du mir bitte ein Suchstichwort nennen, mit dem ich herausfinden kann, was "Zeichen" in [...] bedeuten? Es geht hier nicht um den geposteten Inhalt der [...], sondern um das c# Sprachelement [...].

Vielen Dank.

Grüsse
netsport

P
1.090 Beiträge seit 2011
vor 7 Jahren

In dem Fall sind das Klassen Attribute.

Reinwerk C# :Kapitel 22 Attribute

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

16.807 Beiträge seit 2008
vor 7 Jahren

Die Principal-Klasse ist macht inhaltlich nichts anderes als DirectoryEntry.
Dir bringt eine "neuere" Klasse nichts, wenn sie Deine Anforderung nicht erfüllt. Sie kann sogar Nachteile haben, denn die Principal-Klasse cached enorm viel, was nicht immer erwünscht ist (weswegen ich sie auch meide).

N
netsport Themenstarter:in
27 Beiträge seit 2016
vor 7 Jahren

Hi,

ich benutze nun doch die DirectoryEntry Klasse 😃

Die SearchResults bearbeite ich mit einer foreach Schleife und erhalte dadurch die Properties.
Da es Properties gibt, die mehrere Values besitzen, verwende ich eine weitere foreach Schleife.

Nun möchte ich die Properties/Values speichern, um dann damit zu arbeiten.
Dazu habe ich mir die NameValueCollection Klasse ausgesucht. Es funktioniert damit.
Ist meine Wahl für diese Aufgabe richtig oder gibt es eine bessere (sinnvollere, effizientere,...) Methode, die Properties/Values zu speichern?

Danke und Grüsse
netsport