Entwickler-Ecke

ASP.NET und Web - "Benutzerpfad" des ActiveDirectory auslesen


ebber - Do 07.05.09 17:36
Titel: "Benutzerpfad" des ActiveDirectory auslesen
Hallo,

ich habe eine ASP.Net C# Seite. Diese ist auf einem Server und kann nur von Menschen angeschaut werden, die sich am Server über die Windows Authentifizierung angemeldet haben.

Über:

C#-Quelltext
1:
User.Identity.Name;                    

kann ich den Benutzernamen des angemeldeten Benutzers auslesen.

Wie ich herausgefunden habe sind die Benutzer im ActiveDirectory gespeichert. Und zwar in einer Baumstruktur, die ungefähr so aussieht:

Quelltext
1:
Benutzer/ÜbergreifendeGruppe/Gruppe/SpezielleGruppe/"User.Identity.Name"                    


Genau diesen "Pfad" möchte ich haben. Ich kenne mich leider mit ActiveDirectory überhaupt nicht aus. Ist sowas ohne weiteres möglich?

MfG


UGrohne - Fr 08.05.09 08:19

Das Active Directory ist ein LDAP-Speicher und damit werden solche "Pfadangaben" eigentlich als DSN (Distinguished Names) angegeben, in Deinem Fall z.B.
CN=User.Identity.Name,OU=SpezielleGruppe,OU=Gruppe,OU=ÜbergreifendeGruppe,OU=Benutzer,DC=domaene,DC=de. Damit sollte ein Systemadministrator eigentlich auch zurechtkommen ;).

Den Pfad kannst Du über die DirectoryServices von .NET bekommen. Dazu musst Du allerdings die Assembly "System.DirectoryServices" referenzieren.

Hier [http://www.codeproject.com/KB/system/everythingInAD.aspx#27] gibt es zu den einzelnen Tasks Beispielcode, hab jetzt direkt auf das DirectorySearchen verwiesen. Folgenden Code habe ich der zum Verständnis auf de für Dich relevanten Teile gekürzt:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
        public string GetObjectDistinguishedName(string objectName, string LdapDomain)
        {
            string distinguishedName = string.Empty;
            string connectionPrefix = "LDAP://" + LdapDomain;
            DirectoryEntry entry = new DirectoryEntry(connectionPrefix);
            DirectorySearcher mySearcher = new DirectorySearcher(entry);

            mySearcher.Filter = "(&(objectClass=user)(|(cn=" + objectName + ")(sAMAccountName=" + objectName + ")))";
            SearchResult result = mySearcher.FindOne();

            if (result == null)
            {
                throw new NullReferenceException
                ("unable to locate the distinguishedName for the object " +
                objectName + " in the " + LdapDomain + " domain");
            }
            DirectoryEntry directoryObject = result.GetDirectoryEntry();
            distinguishedName = "LDAP://" + directoryObject.Properties["distinguishedName"].Value;
            entry.Close();
            entry.Dispose();
            mySearcher.Dispose();
            return distinguishedName;
        }

Diese Methode übergibst Du den Benutzernamen und den Domänennamen und solltest den DSN dann erhalten.

//EDIT: Kleine Anmerkung: Prüfe, ob Du von Identity.User den Benutzernamen inkl. Domänennamen (z.B. domaene\benutzer) erhältst. Wenn ja, musst Du den Domänenteil vorher entfernen.


ebber - Fr 08.05.09 18:50

user profile iconUGrohne hat folgendes geschrieben Zum zitierten Posting springen:

Kleine Anmerkung: Prüfe, ob Du von Identity.User den Benutzernamen inkl. Domänennamen (z.B. domaene\benutzer) erhältst.

Ja das ist so.

Danke mal für die Antwort. Ich kann das leider erst am Montag testen. Dann melde ich mich nochmal, ob es funktioniert hat.

MfG

Edit: Es funktioniert :)