Jika Anda menggunakan .NET 3.5 atau lebih tinggi, Anda dapat menggunakan System.DirectoryServices.AccountManagement
namespace (S.DS.AM) baru yang membuat ini jauh lebih mudah daripada sebelumnya.
Baca semuanya di sini: Mengelola Prinsip Keamanan Direktori di .NET Framework 3.5
Pembaruan: Sayangnya, artikel majalah MSDN lama tidak lagi online - Anda harus mengunduh CHM untuk majalah MSDN Januari 2008 dari Microsoft dan membaca artikel di sana.
Pada dasarnya, Anda perlu memiliki "konteks utama" (biasanya domain Anda), prinsip pengguna, dan kemudian Anda mendapatkan grupnya dengan sangat mudah:
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;
}
dan hanya itu yang ada! Anda sekarang memiliki hasil (daftar) dari grup otorisasi milik pengguna - mengulanginya, mencetak nama mereka atau apa pun yang perlu Anda lakukan.
Pembaruan: Untuk mengakses properti tertentu, yang tidak muncul pada UserPrincipal
objek, Anda perlu menggali yang mendasarinya 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;
}
Pembaruan # 2: tampaknya seharusnya tidak terlalu sulit untuk menyatukan kedua cuplikan kode ini .... tapi ok - ini dia:
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
- lihat jawaban saya yang diperbarui untuk mengetahui cara mendapatkannya.