Laden...

Aus AD alle Benutzer ermitteln die gleich heißen oder die Zeichen beinhalten

Erstellt von omega90 vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.440 Views
O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren
Aus AD alle Benutzer ermitteln die gleich heißen oder die Zeichen beinhalten

Hallo

Ich bin gerade dabei eine ASP.NET Anwendung zu erstellen, jedoch habe ich nicht mit ASP.NEt Probleme sondern mit der Programmierung selbst. Mein Ziel ist es eine aspx Seite zu bauen, wo Ich in ein Eingabe Feld zum beispiel "han" eingeben kann und dann über einen Button mir alle benutzer aus dem Active Directory anzeigen lassen kann die so heißen oder diese Zeichen beinhalten.

Ich lasse mir Benutzer in einer ListBox anzeigen und erzeuge dann bei jedem User der gefunden wurde eine ListItem mit dem Namen.

Nun hab Ich es geschafft einen Benutzer anzeigen zu lassen z.B. Auch wenn ich nur han eingebe findet er diesen.

Ich habe meinen Code ein wenig umgebaut und frage mich nun warum das nicht geht und wie es gehen muss 😕

protected void btnBenutzerSuchen_Click(object sender, EventArgs e)
        {
            DirectoryEntry Entry = null;
            DirectorySearcher Searcher = null;
            SearchResult result = null;

            string filter = "(&(objectClass=user)(objectCategory=person)(cn=" + txtBenutzer.Text + "*))";

            //SearchResult result = GetEntryOfLDAP("Domain", txtBenutzer.Text);

            
            try
            {
                string User = GetProperty(result, "givenName");

                 Entry = new DirectoryEntry("LDAP://" + "LWDOMAIN");
                 Searcher = new DirectorySearcher(Entry, filter);

                     using (SearchResultCollection results = Searcher.FindAll())
                     {
                         foreach (SearchResult sr in results)
                         {

                           User =  GetProperty(sr, "givenName");

                           lboxBenutzer.Items.Add(new ListItem(User));
                            
                         }
                     }

            }
            catch (Exception)
            {
                lblBenutzer.Text = "Benutzer nicht gefunden";               
            }
            finally
            {
                result = null; 
            }

            
        }
public static string GetProperty(SearchResult searchResult, string PropertyName)
        {
            
                if (searchResult.Properties.Contains(PropertyName))
                {
                    return searchResult.Properties[PropertyName][0].ToString();
                }
                else
                { 
                    return string.Empty;
                }
        
        }

Was mache Ich falsch ...vllt bin Ich auch einfach nur Blind und sehe denn Fehler nicht 😦

Gruß W.T 🙂

G
538 Beiträge seit 2008
vor 11 Jahren

Hallo,

kurz eine Sache zum Design: lagere das was du dort tust in eine Funktion aus und mach es nicht direkt im Eventhandler 😉

Ansosnten:


string filter = "(&(objectClass=user)(objectCategory=person)(cn=" + txtBenutzer.Text + "*))";
//Das heißt soviel wie: cn endet mit txtBenutzer.Text
string filter = "(&(objectClass=user)(objectCategory=person)(cn=*" + txtBenutzer.Text + "*))";
//Das heißt cn beinhaltet txtBenutzer.Text

im übrigen vermute ich, dass du statt cn lieber samaccountName (= Windows-Anmeldename) nehmen möchtest oder sn (= Nachname)

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

Das Codedesign wird noch mal so oder so überarbeitet, nur wenn ich etwas neues mache mach Ich das dann immer erst direkt und später baue ich das in extra Funktionen um bzw bau diese Funktionen in meine eigene Klassenbibliothek rein^^

Ich weiss jetzt was Ich falsch gemacht hatte 😛

Hier meine Lösung:

protected void btnBenutzerSuchen_Click(object sender, EventArgs e)
        {
            lboxBenutzer.Items.Clear(); 
          
           DirectoryEntry Entry =  new DirectoryEntry("LDAP://" + "Domain");

           string filter = "(&(objectClass=user)(objectCategory=person)(cn=" + txtBenutzer.Text + "*))";

          DirectorySearcher Searcher = new DirectorySearcher(Entry, filter);

          foreach (SearchResult res in Searcher.FindAll())
          {
              string Benutzer = GetProperty(res, "sAMAccountName");
              string eMail = GetProperty(res, "mail");
              string Vorname = GetProperty(res, "givenName");
              string Nachname = GetProperty(res, "sn");
             string Telefon = GetProperty(res, "telephoneNumber");

              lboxBenutzer.Items.Add(new ListItem(eMail + " | " + Benutzer + " | " + Nachname + ", " + Vorname + " | " + Telefon));
          }

Wie gesagt das Design wird noch geändert...Ich muss nur noch paar Sachen testen 😃

Ich schau mir gerade die ListView Klasse an 😛

trotzdem danke 😃

Gruß W.T 🙂

4.221 Beiträge seit 2005
vor 11 Jahren

kurz eine Sache zum Design: lagere das was du dort tust in eine Funktion aus und mach es nicht direkt im Eventhandler 😉

Dies macht aber nur Sinn, wenn man den enthaltenen Code wiederverwenden will... ansonsten für einfachere Sachen kann der Code ohne weiteres direkt im EventHandler erstellt werden.

(Jedenfalls mache ich das schon seit Jahren so).

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

16.806 Beiträge seit 2008
vor 11 Jahren

Dein Code ist, so kurios es klingt, anfällig für "Active Directory Injection" bzw. Code Injection.

Inbesondere diese Zeile hier:


string filter = "(&(objectClass=user)(objectCategory=person)(cn=" + txtBenutzer.Text + "*))";

Der Anwender könnte mit dem Wissen dieser Lücke und genug Rechten das Active Directory manipulieren; und zwar kräftig.

Ohnehin sollte man auf die von Dir verwendete, veraltete Variante vom AD über den DirectoryEntry völlig verzichten und stattdessen den System.DirectoryServices.AccountManagement-Namespace nutzen.
Er ist nicht nur performanter, sondern auch sicherer, und einfacher zu implementieren.

Die Suche wäre hier nur noch


var principal = new UserPrincipal( myAdContext ) { Name = "*name*" };

var result = new PrincipalSearcher {QueryFilter = principal }.FindAll( );

G
538 Beiträge seit 2008
vor 11 Jahren

Der Anwender könnte mit dem Wissen dieser Lücke und genug Rechten das Active Directory manipulieren; und zwar kräftig.

Ich will ja nix sagen, aber mit genug Rechten muss er nichtmal etwas von der Lücke wissen - dann kann er es eh 😉){gray}

Der Vorteil der Klugheit liegt darin, dass man sich dumm stellen kann - umgekehrt ist das schon schwieriger (K. Tucholsky)
Das Problem mit Internet-Zitaten ist, dass sie oftmals zu unrecht als authentisch angenommen werden. (K. Adenauer)

16.806 Beiträge seit 2008
vor 11 Jahren

...heißt ja nicht, dass er der einzige Anwender dieser Applikation ist.
Und "Flickschustereien" halten sich bekanntlich am längsten. Ein mal unbedacht den Code in was offenes kopiert - und zack ist die Lücke für Jedermann nutzbar.

O
omega90 Themenstarter:in
51 Beiträge seit 2012
vor 11 Jahren

Der Anwender könnte mit dem Wissen dieser Lücke und genug Rechten das Active Directory manipulieren; und zwar kräftig.

Ohnehin sollte man auf die von Dir verwendete, veraltete Variante vom AD über den DirectoryEntry völlig verzichten und stattdessen den System.DirectoryServices.AccountManagement-Namespace nutzen.
Er ist nicht nur performanter, sondern auch sicherer, und einfacher zu implementieren.

Danke Ich werde mir das mal anschauen 😃

Gruß W.T 🙂