ActiveDirectory auslesen mit DirectoryEntry und DirectorySearcher

29/10/2007 - 14:36 von Rainhard Mösl | Report spam
Ich lese mit nachfolgendem Code eine Gruppe aus dem Active Directory aus und
hole mir aus der Gruppe alle User. (Diese werden dann einer ArrayList
hinzugefügt, von der aus ich die gefundenen Elemente also User-Namen
verwende.)
Der Code funktioniert - lokal!!!
Rufe ich die Seite vom Server aus auf, tritt folgender Fehler auf:

"[COMException (0x80072020): Es ist ein Fehler bei der Ausführung
aufgetreten."
und zwar in Zeile 37
Zeile 35: src.SearchRoot = de;
Zeile 36: src.SearchScope = SearchScope.Subtree;
Zeile 37: foreach (SearchResult res in src.FindAll())
Zeile 38: {
Zeile 39: if (res.Properties["CN"].Count > 0 &&
(res.Properties["CN"][0].ToString() == searchedGroup))


Das Problem kann zwar umgangen werden indem ich meine Credetials hard coded
angebe
also:
DirectoryEntry de = new DirectoryEntry(ldapServerAdress +
"/DC=abc,DC=asdf,DC=at");
//de.AuthenticationType = AuthenticationTypes.Secure;
//de.Username = "User";
//de.Password = "xxx";

, das ist aber nicht Sinn der Sache.

Es sollten die Credentials von Windows-Anmeldung übernommen werden!
In der Web.config steht daher:
<authentication mode="Windows"/>
<identity impersonate="true"/>

Coding:

public static ArrayList getAllowedUsers()
{
if (datasource == null)
{
datasource = new ArrayList();
string ldapServerAdress = "LDAP://abc.asdf.at";
string searchedGroup = "myGroup";

DirectoryEntry de = new DirectoryEntry(ldapServerAdress +
"/DC=abc,DC=asdf,DC=at");
//de.AuthenticationType = AuthenticationTypes.Secure;
//de.Username = "User";
//de.Password = "xxx";

DirectorySearcher src = new
DirectorySearcher("(objectClass=group)", new string[] { "CN", "member" });

src.SearchRoot = de;
src.SearchScope = SearchScope.Subtree;
foreach (SearchResult res in src.FindAll())
{
if (res.Properties["CN"].Count > 0 &&
(res.Properties["CN"][0].ToString() == searchedGroup))
{
ResultPropertyValueCollection col =
res.Properties["member"];
foreach (string target in col)
{
de = new DirectoryEntry(ldapServerAdress + "/" +
target);
//de.AuthenticationType = AuthenticationTypes.Secure;
//de.Username = "User";
//de.Password = "xxx";
System.DirectoryServices.PropertyCollection pcol =
de.Properties;
foreach (object o in
((object[])pcol["objectClass"].Value))
{
if (o.ToString() == "user")
{
datasource.Add(new
ListItem(pcol["CN"].Value.ToString(), pcol["CN"].Value.ToString()));
}
}
}
}
}
}
return datasource;
}
 

Lesen sie die antworten

#1 Rainhard Mösl
31/10/2007 - 15:36 | Warnen spam
Zur Info:
Mit folgendem Link sollte das Problem zu lösen sein:
http://support.microsoft.com/?scid=...0572&x&y=9

Aber Achtung! Wartet vielleicht noch kurz ab. Es kann eine Weile dauern bis
die Einstellung vom Server "trusted for delegation" wirklich aktiv
wird!!!!!!!!!!!!!!!!!!!!! (dann müsst ihr das Problem nicht vorschnell
posten, obwohl schon alle Einstellungen gemacht wurden, damit es
funktioniert!!! *ggg*)

Ähnliche fragen