Hi Freunde,
ich sitze an einem kleinen Programm, dass mir helfen soll User aus dem AD auszulesen und zurückzuschreiben. Ich scheitere aber leider schon bei der LDAP Verbindung.
Mein AD ist auf einer VM und sehr klein, also nur 3 User. Die VM ist Testserver.kai.test und ich habe einige OUs angelegt, angelehnt an eine echte Umgebung.
Mein Testuser Bob liegt also in:
CN=Bob BT. Test,OU=Users,OU=HAM,OU=DE,OU=Kai-Global,DC=kai,DC=test
und ich möchte gerne eine LDap verbindung ins AD aufbauen und diesen User bzw seine Attribute auslesen. Dabei sollen nicht nur die Users in HAM sondern alle die unter Kai-Global liegen durchsucht werden.
Für meinen Testlauf suche ich nur nach dem Vornamen - Bob - der bis dato im AD eindeutig ist. Sprich also givenName = Bob.
Ich habe eine Klasse
public List<String> GetUser(string SearchValue)
{
List<String> GUArray = new List<String>();
String sDebug = "";
try
{
DirectoryEntry myLdapConnection = createDirectoryEntry();
DirectorySearcher search = new DirectorySearcher(myLdapConnection);
search.Filter = "(&(givenName = " + SearchValue + "))";
search.SearchRoot = myLdapConnection;
SearchResult result = search.FindOne();
sDebug = myLdapConnection.Path.ToString() + " " + myLdapConnection.Name + " " + search.Filter.ToString();
if (result != null)
{
// user exists, cycle through LDAP fields (cn, telephonenumber etc.)
ResultPropertyCollection fields = result.Properties;
foreach (String ldapField in fields.PropertyNames)
{
// cycle through objects in each field e.g. group membership
// (for many fields there will only be one object such as name)
foreach (Object myCollection in fields[ldapField])
{
GUArray.Add(myCollection.ToString());
}
}
if (GUArray.Count < 1)
{
GUArray.Add(sDebug + " 1");
}
return GUArray;
}
else
{
if (GUArray.Count < 1)
{
GUArray.Add(sDebug + " 2");
}
return GUArray;
}
}
catch (Exception e)
{
GUArray.Add(e.ToString());
return GUArray;
}
}
static DirectoryEntry createDirectoryEntry()
{
// create and return new LDAP connection with desired settings
DirectoryEntry ldapConnection = new DirectoryEntry("LDAP://Testserver.kai.test", "Administrator","Start123");
//CN=Bob BT. Test,OU=Users,OU=ZEN,OU=DE,OU=Kai-Global,DC=kai,DC=test
ldapConnection.Path = "LDAP://OU=Kai-Global,DC=kai,DC=test";
ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
return ldapConnection;
}
Jedoch ist die Variable "Result" immer null.
wenn ich also meine Klasse benutze
private void button1_Click(object sender, EventArgs e)
{
ADHelper ahelper = new ADHelper();
List<String> myReturn = ahelper.GetUser(comboBox1.Text);
richTextBox1.Text = myReturn[0].ToString();
}
Kommt immer nur mein Debugstring zurück:
LDAP://OU=Kai-Global,DC=kai,DC=test OU=Kai-Global (&(givenName = Bob)) 2
Könnt ihr mir helfen? Wo liegt der Fehler in meinem LDAP Query?
Danke schonmal!
Dein DirectoryEntry-Pfad sieht falsch aus.
LDAP-Pfade sollten so aussehen: LDAP://DC=onecity,DC=corp,DC=fabrikam,DC=com
weiß nicht, ob die Uri-Variante hier überhaupt gültig ist. Spontan nichts gefunden.
Und: verwende Principals, zb PrincipalContext.
Ist um längen einfacher zu programmieren; dazu musst Du nicht im Entry rumwursteln, sondern nimmst einfach den aktuellen Context der Domain. Macht vieles einfacher.
Cool, vielen dank schonmal!
Aber ich brauch leider auch Einträge wie EmployeeID und so, die man wie ich gelesen habe nicht mit dem Principal auslesen kann?
Naja ich habe mein Problem glaube ich gerade eben gelöst:
Es war anscheinend alles so weit richtig, aber im Search waren zuviele leerzeichen...
Ich hatte "(givenName = Bob)"
nun habe ich
search.Filter = "(givenName=" + SearchValue + ")";
also "(givenName=Bob)"...
und scho klappts.
*grummel*
Doch kann man - mach ich auch problemlos 😉
a) ist EmployeeId eine Property von UserPrincipal und b) problemlos CustomFields auslesen.
Ah, super. Dann nochmal vielen Dank 😉 Werde mich mal damit auseinandersetzen 😄
Hm @Abt ich hab da doch nochmal ne Frage.
Ich habe nun wie du gesagt hast meinen gesamten Code auf die Verwendung von UserPrincipal etc umgestellt. Nun habe ich aber das Problem das ich das Department auslesen und setzen muss und die Property in der UserPrincipal Klasse nicht drin ist.
Was mache ich denn nun? 😦
Hi,
du kannst UserPrincipal einfach erweitern mit Hilfe von ExtensionGet und ExtensionSet.
Folgende Doku sollte dir helfen Prinzipalerweiterungen
Großartig, vielen Dank!