it4baer
Goto Top

Filter LDAP mit mehreren Kriterien auf ein Feld

Hallo,

ich würde gerne für den LDAP eine suche in C# bauen <- soll eine "einfache" suche für den internen Adressstamm sein.

                using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
                {

                    string name = "*Norbert*";   

                    UserPrincipal qbeUser = new UserPrincipal(context);
                    qbeUser.Name = name;

vom Prinzip funktioniert das auch (wie oben im Code), jetzt gibt es aber den Norbert 50 mal im Unternehmen und sein Nachname Li ist auch keine Hilfe <- weil wenn ich jetzt nach Li suche, finde ich alle "Lisas" <- okay ich könnte 2 Felder machen und trennen zwischen Vorname und Nachname und dann eben beide Felder befüllen, aber irgendwie soll die Usability natürlich nicht leiden...

im Feld Name steht also "Li, Norbert"

wenn ich jetzt nach "Norbert Li" suche, finde ich also nichts, ebenso "Li Norbert" findet nichts, da dass Komma noch im weg ist, also muss ich Programmtechnisch das Feld Name sowohl nach Begriff 1 ALSAUCH nach Begriff 2 Filtern,...

wie kann ich das machen?

qbeUser.Name = name;
qbeUser.Name = name[1];
<- überschreibt der 2. Begriff den 1.

Vielen Dank

Content-ID: 364726

Url: https://administrator.de/contentid/364726

Ausgedruckt am: 22.11.2024 um 10:11 Uhr

135333
Lösung 135333 14.02.2018 aktualisiert um 09:17:23 Uhr
Goto Top
Machs mit einem DirectorySearcher und einer LDAP Query da kannst du nach Belieben mit "und" oder "or" Verknüpfen
DirectoryEntry rootEntry = new DirectoryEntry("LDAP://some.ldap.server.com");  
rootEntry.AuthenticationType = AuthenticationTypes.None; //Or whatever it need be
DirectorySearcher searcher = new DirectorySearcher(rootEntry);
searcher.Filter = "(&(objectClass=user)(objectCategory=person)(cn=*some_user_name*)(cn=*otherpart*))";  
foreach(SearchResult result in searcher.FindAll()) 
{
    Console.WriteLine("account name: {0}", result.Properties["samaccountname"].Count > 0 ? result.Properties["samaccountname"] : string.Empty);  
    Console.WriteLine("common name: {0}", result.Properties["cn"].Count > 0 ? result.Properties["cn"] : string.Empty);  
}
Zur LDAP Query Syntax siehe
https://technet.microsoft.com/de-de/library/aa996205(v=exchg.65).aspx
it4baer
it4baer 14.02.2018 aktualisiert um 09:08:56 Uhr
Goto Top
bei mir kommt der Fehler:

System.NotSupportedException: "The provider does not support searching and cannot search
foreach (SearchResult result in searcher.FindAll())


der PrincipalSearcher kann aber auf meinen
DirectoryEntry rootDSE = new DirectoryEntry("LDAP://RootDSE");

zugreifen...
was mach ich Falsch?

Edit:
und wenn ich statt RootDSE die eigentliche Domain angebe, dann kommt der fehler, dass der search filter falsch ist:
System.ArgumentException: "The (&(objectClass=user)(objectCategory=person)(cn=*Test*) search filter is invalid."
135333
135333 14.02.2018 aktualisiert um 09:19:26 Uhr
Goto Top
Dir fehlt die abschließende Klammer im Filter!
Deswegen hatte ich dir ja die Syntax verlinkt, das du dir da zumindest die Basics aneignest oder müssen wir hier jetzt wieder Kindergarten spielen?
it4baer
it4baer 14.02.2018 um 09:21:25 Uhr
Goto Top
nein, sorry...

ich habe den Fehler bereits gefunden und wollte gerade antworten...
"Danke"

jetzt muss ich noch herausfinden wie ich das schaffe, dass es "allgemein" funktioniert und man nicht die eigentliche Domain angeben muss...
=> aber das versuch ich erstmal selbst!

Danke soweit
135333
Lösung 135333 14.02.2018 aktualisiert um 09:27:39 Uhr
Goto Top