.NET 3.5以降を使用している場合は、新しいSystem.DirectoryServices.AccountManagement
(S.DS.AM)名前空間を使用できます。これにより、これが以前よりもはるかに簡単になります。
すべてについては、こちらをお読みください:.NET Framework 3.5でのディレクトリセキュリティプリンシパルの管理
更新:残念ながら、MSDNマガジンの古い記事はもうオンラインではありません。2008年1月のMSDNマガジンのCHMを Microsoft からダウンロードし、そこで記事を読む必要があります。
基本的に、「プリンシパルコンテキスト」(通常はドメイン)、ユーザープリンシパルが必要であり、そのグループを非常に簡単に取得できます。
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;
}
それだけです!これで、ユーザーが属している許可グループの結果(リスト)が表示されます-それらを繰り返し、それらの名前を印刷するか、必要なことを何でも行います。
更新:UserPrincipal
オブジェクトに表示されない特定のプロパティにアクセスするには、基になるものを掘り下げる必要があります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;
}
更新#2:これらの2つのコードスニペットをまとめるのはそれほど難しくないと思われます。
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
-取得方法については、私の最新の回答を参照してください。