Nếu bạn đang sử dụng .NET 3.5 trở lên, bạn có thể sử dụng System.DirectoryServices.AccountManagement
không gian tên (S.DS.AM) mới, điều này làm cho việc này dễ dàng hơn rất nhiều so với trước đây.
Đọc tất cả về nó ở đây: Quản lý các nguyên tắc bảo mật thư mục trong .NET Framework 3.5
Cập nhật: các bài báo trên tạp chí MSDN cũ hơn không còn trực tuyến nữa - bạn sẽ cần tải xuống CHM cho tạp chí MSDN tháng 1 năm 2008 từ Microsoft và đọc bài báo trong đó.
Về cơ bản, bạn cần có "ngữ cảnh chính" (thường là miền của bạn), người dùng chính và sau đó bạn có được các nhóm của nó rất dễ dàng:
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;
}
và đó là tất cả! Bây giờ bạn có kết quả (danh sách) các nhóm ủy quyền mà người dùng thuộc về - lặp lại chúng, in ra tên của họ hoặc bất cứ điều gì bạn cần làm.
Cập nhật: Để truy cập các thuộc tính nhất định, không hiển thị trên UserPrincipal
đối tượng, bạn cần phải tìm hiểu sâu cơ bản 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;
}
Cập nhật # 2: Có vẻ như không quá khó để ghép hai đoạn mã này lại với nhau .... nhưng được rồi - đây là:
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
- hãy xem câu trả lời cập nhật của tôi để biết cách truy cập vào nó.