Wenn Sie mit .NET 3.5 oder höher arbeiten, können Sie das neue verwenden System.DirectoryServices.AccountManagement
höher arbeiten Namespace (S.DS.AM) verwenden, was dies viel einfacher macht als früher.
Lesen Sie hier alles darüber: Verwalten von Verzeichnissicherheitsprinzipalen in .NET Framework 3.5
Update: Ältere Artikel des MSDN-Magazins sind leider nicht mehr online - das müssen Sie das CHM für das MSDN-Magazin vom Januar 2008 von Microsoft herunterladen und den Artikel dort lesen.
Grundsätzlich benötigen Sie einen "Hauptkontext" (normalerweise Ihre Domain), einen Benutzerprinzipal, und dann erhalten Sie seine Gruppen sehr einfach:
public List<GroupPrincipal> GetGroups(string userName)
{
List<GroupPrincipal> result = new List<GroupPrincipal>();
// establish domain context
PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);
// find your user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName);
// if found - grab its groups
if(user != null)
{
PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups();
// iterate over all groups
foreach(Principal p in groups)
{
// make sure to add only group principals
if(p is GroupPrincipal)
{
result.Add((GroupPrincipal)p);
}
}
}
return result;
}
und das ist alles was es gibt! Sie haben jetzt ein Ergebnis (eine Liste) von Berechtigungsgruppen, zu denen der Benutzer gehört - iterieren Sie über sie, drucken Sie ihre Namen aus oder was auch immer Sie tun müssen.
Update: Um auf bestimmte Eigenschaften zuzugreifen, die auf dem UserPrincipal
Objekt nicht angezeigt werden, müssen Sie sich mit dem zugrunde liegenden Objekt befassen DirectoryEntry
:
public string GetDepartment(Principal principal)
{
string result = string.Empty;
DirectoryEntry de = (principal.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
if (de.Properties.Contains("department"))
{
result = de.Properties["department"][0].ToString();
}
}
return result;
}
Update Nr. 2: Es sollte nicht allzu schwierig sein, diese beiden Codeausschnitte zusammenzufügen ... aber ok - hier ist es:
public string GetDepartment(string username)
{
string result = string.Empty;
// if you do repeated domain access, you might want to do this *once* outside this method,
// and pass it in as a second parameter!
PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain);
// find the user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, username);
// if user is found
if(user != null)
{
// get DirectoryEntry underlying it
DirectoryEntry de = (user.GetUnderlyingObject() as DirectoryEntry);
if (de != null)
{
if (de.Properties.Contains("department"))
{
result = de.Properties["department"][0].ToString();
}
}
}
return result;
}
UserPrincipal
- siehe meine aktualisierte Antwort, wie man darauf kommt.