Active Directory Abfrage

  • C#

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von 0ptix.

    Active Directory Abfrage

    Hallo,

    Ich versuche gewisse Properties / Attribute von einem ActiveDirectory Objekt abzufragen.

    mit diesem Code öffne ich die LDAP Verbindung:

    C#-Quellcode

    1. DirectoryEntry entry = new DirectoryEntry("LDAP://my.domain.com/");
    2. DirectorySearcher dSearch = new DirectorySearcher(entry);


    der DirectorySearcher ist auch importiert:

    C#-Quellcode

    1. using System.DirectoryServices;
    2. using System.DirectoryServices.AccountManagement;
    3. using System.DirectoryServices.ActiveDirectory;


    Als nächstes trage ich in eine Textbox den SamAccountName der zu suchenden Person ein.
    Beim Klick auf button1 wird der Wert von textbox1 in den string SAM geschoben.

    C#-Quellcode

    1. string SAM = textBox1.Text;


    Dann frage ich das User Objekt mit diesem Code ab:

    C#-Quellcode

    1. dSearch.Filter = "(SAMAccountName=" + SAM + ")";


    Dann habe ich mir Labels erstellt, also z.b. lblgivenName und versuche, den Text des Labels zu ändern, also den Wert aus der ActiveDirectory abzufragen und diesen dann in das Label zu übertragen

    C#-Quellcode

    1. lblgivenName.text = dSearch.Property["givenName"];


    Aber das funktioniert nicht.

    Was mache ich falsch?

    Und das zweite ist, dass ich diese Properties ändern möchte, also ich frage den givenName ab, schreibe den neuen "givenName" in eine TextBox und möchte diese dann in das ActiveDirectory Objekt einfügen.
    Logischerweise funktioniert das auch nicht, da schon die Abfrage nicht funktioniert. Ich bin wirklich um jede Hilfe dankbar.
    Die Properties sind in einem DirectoryEntry und nicht in dem SearchResult.

    siehe Beispiel hier -> SearchResult Klasse

    VB.NET-Quellcode

    1. Dim oDomain As New DirectoryServices.DirectoryEntry("LDAP://" & Environment.UserDomainName)
    2. Dim search As New DirectoryServices.DirectorySearcher(oDomain)
    3. search.Filter = "(SAMAccountName=" & Environment.UserName & ")"
    4. Dim result As DirectoryServices.SearchResult = search.FindOne()
    5. Dim oUser As DirectoryServices.DirectoryEntry = result.GetDirectoryEntry
    6. Dim objgivenName As String = oUser.Properties("givenName").Value.ToString()
    7. MessageBox.Show(objgivenName)
    Was genau verstehst du nicht?

    Hier etwas ausführlicher und in C#:
    Du schreibst dSearch.Property["givenName"];
    dSearch ist ein DirectorySearcher
    Ein DirectorySearcher hat kein .Property

    Die Properties kannst du aus einem DirectoryEntry auslesen.
    Um dies zu erhalten musst du vom SearchResult das DirectoryEntry hohlen.

    C#-Quellcode

    1. dSearch.Filter = "(SAMAccountName=" + SAM + ")"; //Filter der Suche zuweisen
    2. SearchResult result = dSearch.FindOne(); // Ersten Eintrag suchen
    3. DirectoryEntry oUser = result.GetDirectoryEntry(); //Das DirectoryEntry des Suchresultats hohlen
    4. lblgivenName.Text = oUser.Properties["givenName"].Value.ToString(); // givenName aus den Properties auslesen und in Label schreiben
    Nein, du nimmst oUser.Properties["hier das gewünschte Attribut einsetzen"]
    eine Liste der Attribute findest du zum Beispiel hier: -> Attribute (AD-Schema)

    Das FindOne ist nur dazu da einen Eintrag zu finden.
    Mit FindAll kannst du mehrere Einträge suchen, z.B. wenn man mit dem Filter "(&(objectClass=user)(sn=Müller))" sucht, findet er alle Einträge die "Müller heissen.
    Ah danke! Ich teste mal und gebe Rückmeldung

    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed




    Top, hat soweit geklappt. Das sollte mir dann den neuen "givenName" setzen oder?

    C#-Quellcode

    1. oUser.Properties["givenName"].Value.ToString() = textbox1.text;


    Beiträge zusammengefasst ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Okay, das ist soweit klar. Aber jetzt habe ich das Problem, dass ich einen zweiten Button habe und wenn ich auf diesen Klicke dann soll der "givenName" auf "tralala" geändert werden.
    Mein Problem ist aber dass ich in diesem "neuen" Button keinen zugriff auf oUser.Properties habe weil er das nicht erkennt. Wie kann ich das denn übergeben?

    Also der Ablauf ist quasi
    1. Samaccountname angeben
    2. Klick auf Button1
    3. Text von label zu givenName anzuzeigen
    4. Klick auf Button2
    5. GivenName zu tralala ändern, also in die AD zu schreiben

    Punkt 1 bis 3 geht jetzt (dank der Hilfe :) ) auch problemlos. Nur das zurückschreiben nicht
    Der Name "oUser" ist im aktuellen Kontext nicht vorhanden


    C#-Quellcode

    1. public partial class lblGivenName : Form
    2. {
    3. public lblGivenName()
    4. {
    5. InitializeComponent();
    6. }
    7. private void btnSearch_Click(object sender, EventArgs e)
    8. {
    9. DirectoryEntry entry = new DirectoryEntry("LDAP://my.domain.com");
    10. DirectorySearcher dSearch = new DirectorySearcher(entry);
    11. string SAM = txtBoxSam.Text;
    12. SearchResult result = dSearch.FindOne();
    13. DirectoryEntry oUser = result.GetDirectoryEntry();
    14. lblGiven.Text = oUser.Properties["givenName"].Value.ToString();
    15. }
    16. private void btnSetNewName_Click(object sender, EventArgs e)
    17. {
    18. oUser.Properties["givenName"].Value = txtBoxNewName.Text; // findet hier oUser nicht || Der Name "oUser" ist im aktuellen Kontext nicht vorhanden
    19. }
    20. }

    Am Besten erstellst Du Dir eine Klasse, die die ganze AD Kommunikation behandelt inklusive User holen und zurück schreiben.

    Dein Zurück schreiben wird so eh nicht funktionieren weil Du in dieser Methode keine Verbindung zum AD hast.
    Und ja auch nix zurück schreibst, sondern nur einen Wert zuweist.
    "Hier könnte Ihre Werbung stehen..."
    also ich habe jetzt mal versucht eine neue Klasse zu erstellen mit dem DirectorySearcher.
    Allerdings mit dem ergebnis das in Zeile 15 das "dEntry" nicht gültig ist.

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. using System.DirectoryServices;
    7. using System.DirectoryServices.AccountManagement;
    8. using System.DirectoryServices.ActiveDirectory;
    9. namespace WindowsFormsApp3
    10. {
    11. public class SAMsearch
    12. {
    13. DirectoryEntry dEntry = new DirectoryEntry("LDAP://domain.com");
    14. DirectorySearcher directorySearcher = new DirectorySearcher(dEntry); //"dEntry" wird rot unterringelt => CS0236 Fehler
    15. }
    16. }


    Füge ich es allerdings in Program.cs ein, dann funktioniert es.
    WIe ich prinzipiell die Werte mit Getter und Setter über die Klassen bzw. die Objekte und deren Properties übergeben kann, habe ich herausgefunden.
    Aber ich hab doch den richtigen Denkansatz oder, der directory Searcher muss in der jeweiligen Klasse initiiert werden?!
    hast Du noch nie mit Klassen gearbeitet?
    sowas:

    C#-Quellcode

    1. public class TestClass
    2. {
    3. //private Properties
    4. private DirectoryEntry dEntry;
    5. private DirectorySearcher directorySearcher;
    6. //das ist der Konstruktor
    7. //der wird aufgerufen wenn die Klasse initialisiert wird
    8. public TestClass()
    9. {
    10. //Properties initialisieren
    11. dEntry = new DirectoryEntry("LDAP://domain.com");
    12. directorySearcher = new DirectorySearcher(dEntry);
    13. }
    14. }
    "Hier könnte Ihre Werbung stehen..."