のDirectoryEntryの「グループ」プロパティを使用して、2つの既知の問題があります。
- それはあなたのユーザーは、(一般的に「ユーザー」)にある「既定のグループ」を表示されません
ユーザーがグループAのメンバーであり、そのグループはその後、今度はグループBのメンバーである場合
- 、それはあなたのネストされたグループが表示されませんが
だから、メンバーシップ、そしてWindowsで、これはユーザーでもあることを意味しメンバーただし、DirectoryEntryはネストされたグループメンバシップを表示しません。
これは、私がストレートActive Directory(Exchangeなし)について知っている2つの唯一の制限です。
デフォルトグループの取得には少し時間がかかりますが、そのためのコードサンプルがあります。ネストされたグループを取得
private string GetPrimaryGroup(DirectoryEntry aEntry, DirectoryEntry aDomainEntry)
{
int primaryGroupID = (int)aEntry.Properties["primaryGroupID"].Value;
byte[] objectSid = (byte[])aEntry.Properties["objectSid"].Value;
StringBuilder escapedGroupSid = new StringBuilder();
// Copy over everything but the last four bytes(sub-authority)
// Doing so gives us the RID of the domain
for(uint i = 0; i < objectSid.Length - 4; i++)
{
escapedGroupSid.AppendFormat("\\{0:x2}", objectSid[i]);
}
//Add the primaryGroupID to the escape string to build the SID of the primaryGroup
for(uint i = 0; i < 4; i++)
{
escapedGroupSid.AppendFormat("\\{0:x2}", (primaryGroupID & 0xFF));
primaryGroupID >>= 8;
}
//Search the directory for a group with this SID
DirectorySearcher searcher = new DirectorySearcher();
if(aDomainEntry != null)
{
searcher.SearchRoot = aDomainEntry;
}
searcher.Filter = "(&(objectCategory=Group)(objectSID=" + escapedGroupSid.ToString() + "))";
searcher.PropertiesToLoad.Add("distinguishedName");
return searcher.FindOne().Properties["distinguishedName"][0].ToString();
}
もいくつかの手順を取り、私はそれが問題だ場合、その1つの解決策を捜す必要があります。
マルク・
PS:サイドノートとして - なぜ地球上であなたは "DirectoryEntry.Invoke行っている(" グループ "は、null)" と呼んで?なぜ複数値(複数の値を含む)で、グループのDN(識別名)を持つDirectoryEntry.Properties ["memberOf"]プロパティを列挙しないのですか?
foreach(string groupDN in myUser.Properties["memberOf"])
{
string groupName = groupDN;
}
.NET 3.5の場合は、新しいセキュリティプリンシパルクラスをS.DS.AccountManagementで使用できます。そのうちの1つは "UserPrincipal"です。このメソッドは "GetAuthorizationGroups()"というメソッドを持っています。
優れたMSDN articleを参照してください。これらの新しい.NET 3.5 S.DSの機能について説明しています。
これらを良い提案であり、あなたはMSDNの記事について正しいです、私は開始する前にそれを読んでいたはずです。私がなぜinvokeメソッドを使用したかについては、この例では必要なのはグループ名だけでしたが、これは情報を取得する効率的な方法のようでした。私はActive Directoryに対して非常に多くのプログラミングを行っていないので、進歩するための最善の方法を学んでいます。 1.1以降、この分野で.NETがどの程度進化したのか興味深い! – HeathenWorld
何も問題はありません。Invoke()アプローチを使用する特別な理由があったのかどうか不思議です。そして、ちょっと - それはStackOverflowのすべてです - ツリーのためにフォレストが表示されないときにあなたを助けます:-) –
リンクされたMSDN記事の+1、はるかに容易に3.5 – tbone