Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Aus AD alle Benutzer ermitteln die gleich heißen oder die Zeichen beinhalten
omega90
myCSharp.de - Member



Dabei seit:
Beiträge: 55
Herkunft: Wetzlar

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers
omega90
myCSharp.de - Member



Dabei seit:
Beiträge: 55
Herkunft: Wetzlar

Themenstarter:

beantworten | zitieren | melden

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 :P

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 :P

trotzdem danke :)
Gruß W.T
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4318
Herkunft: Zentralschweiz

beantworten | zitieren | melden

Zitat von Grumbler85
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...
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16103

beantworten | zitieren | melden

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( );
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Grumbler85
myCSharp.de - Member



Dabei seit:
Beiträge: 550
Herkunft: Rheingau Taunus

beantworten | zitieren | melden

Zitat
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 ;-)
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)
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16103

beantworten | zitieren | melden

...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.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
omega90
myCSharp.de - Member



Dabei seit:
Beiträge: 55
Herkunft: Wetzlar

Themenstarter:

beantworten | zitieren | melden

Zitat
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
private Nachricht | Beiträge des Benutzers