none
Active Directory search.Filter mit Variable RRS feed

  • Allgemeine Diskussion

  • Guten Tag liebes Forum,

    Ich habe meine Ausbildung zur Fachinformatikerin erst im September angefangen und beschäftige mich mit C#. Meine Aufgabe ist ein Programm zu schreiben das den angemeldeten Benutzer ausließt und in der AD die untergerodneten Benutzer (die im manager-Attribut den angemeldeten Benutzer stehen haben) sucht und in einer listBox anzeigt. Jetzt gibt es natürich tolle Beispiele wie man die search.Filter Funktion benutzen kann, aber keines der Beispiele beinhaltet den Gebrauch von einer Variable - und da scheitert es bei mir.

    search.Filter = "(manager=CN=Name Nachname,OU=Benutzer,OU=Debitorenbuchhaltung,OU=Kaufmännischer Service,OU=Abteilungen,DC=XXX-XX,DC=XXX)"; // <- funktioniert!

    Mit dieser Zeile würde das Programm funktionieren, so sehen Attribut und Wert aus.

    search.Filter = "(manager=*"+username+"*)"; //funktioniert nicht

    So sieht meine Zeile aus, wobei 'username' eine variable ist die nur den Nachnamen des momentan angemeldeten Benutzers enthält. Was muss ich tun damit mein Programm in dem ganzen Wert der im Manager-Attribut steht nur nach dem username sucht und dabei den Rest ignoriert?

    Ich hoffe ihr könnt mir helfen und entschuldige mich für meine (noch) Unwissenheit.

    Grüße

    Tician

    Donnerstag, 15. Oktober 2015 12:45

Alle Antworten

  • Hallo Tician90,

    Sieh Dir folgende Artikel an:

    http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-Directory-via-C

    Dort findest Du viele Beispiele. Hier gibt es auch interessante Informationen.

    Gruß

    Aleksander


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht,  kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Freitag, 16. Oktober 2015 08:36
  • Hi Aleksander,

    danke für die Hilfe, ich habe mir beide Links angesehen und es sind auch Beispiele mit Variablen dabei, aber weiterhelfen tut mir das leider doch nicht, da in dem Attribut "manager" nicht nur der Name steht sondern weitaus mehr (siehe oben) bräuchte ich auch noch das Sternchen (*) irgendwie als Zeichen dafür das ich nur nach dem Namen suche, egal was davor und dahinter steht.

    Aber egal wo ich die * hinsetze ich kriege entweder Fehler oder es funktioniert nicht, ich schätze mal weil das * nicht so wie ich will als Zeichen das da noch Etwas davor und danach kommt gesehen wird, sondern als Multiplikations-Zeichen?

    Hier nochmal der gesamte Code:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.DirectoryServices;
    using System.DirectoryServices.ActiveDirectory;
    using System.DirectoryServices.AccountManagement;
    
    namespace ActiveDirectoryBla
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
    
                textBox1.Enabled = false;
    
                textBox2.PasswordChar = '#';
            }
    
            private void textBox1_TextChanged(object sender, EventArgs e)
            {
            }
    
            private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                string usernamead = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
                string username = System.IO.Path.GetFileNameWithoutExtension(usernamead);
                textBox1.Text = username;
    
                string password = textBox2.Text;
    
                DirectoryEntry dir = new DirectoryEntry("LDAP://xx.xx.xx.xx");
    
                DirectorySearcher search = new DirectorySearcher(dir); 
                search.Filter = "(manager=*"+username+"*)"; //funktioniert nicht
                //search.Filter = "(objectClass=user)"; //<-- funktioniert!
                //search.Filter = "(manager=Hand Paul,OU=Benutzer,OU=Debitorenbuchhaltung,OU=Kaufmännischer Service,OU=Abteilungen,DC=xxxx,DC=xxx)"; // <- funktioniert!
    
                SearchResultCollection searchresult = search.FindAll(); //Hier in "searchresult" kommt alles rein was meine Suche findet
    
                if (searchresult != null) //wenn meine Suche nicht Ergebnislos ist dann...
                {
                    foreach (SearchResult result in searchresult) //Für jedes Ergebnis...
                    {
                        /*var tmpResult = result;
                        var tmpDirEntry = result.GetDirectoryEntry();
                        var tmpProperties = tmpDirEntry.Properties;
                        var tmpPropSN = tmpProperties["sn"];
                        var tmpValue = tmpPropSN.Value;*/
                        listBox1.Items.Add(result.GetDirectoryEntry().Properties["cn"].Value.ToString());
                    }
                }
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                string listuser = Convert.ToString(listBox1.SelectedIndex);
                try
                {
                    DirectoryEntry user = new DirectoryEntry(listuser);
                    user.Properties["LockOutTime"].Value = 0;
                    user.CommitChanges();
                    user.Close();
                }
                catch (System.DirectoryServices.DirectoryServicesCOMException)
                {
                    MessageBox.Show("Error");
                }
            }
        }
    }
    

    Ich bin noch Programmier-Anfängerin und einige Dinge waren anfänglich schwierig zum Laufen zu bringen, deshalb ist alles Kommentiert - nicht wundern :)

    Gruß

    Tician

    Montag, 19. Oktober 2015 07:08