基本的に、私がやろうとしているのは、コンピューター/ユーザーをグループに追加することです。オブジェクトをグループに追加した後、オブジェクトのグループにクエリを実行して、それらが何を持っているかを確認したいと考えています。
GetGroups メソッドの更新速度が不十分のようです。私のテストはいつも失敗するようです。VS にいくつかのブレークポイントを設定すると、十分に待機すれば実行されます。
私は AccounManagement 名前空間で遊ぶのが初めてです (.net 3.5 以前のコードをたくさん使用しました)。コードを数回ループできると思いますが、他の人がこれについて提案しているかどうかを確認しています。
私は次の単体テストを行いました
[Test]
public void Check()
{
string distinguishedName = "ComputerDistinguishedName";
string groupDN = "GroupDistinguished name";
// Remove the identity from the group so it does crashes if it's already part of it.
GroupCtrl.RemoveIdentityFromGroup(groupDN, distinguishedName);
using (var ctx = new PrincipalContext(ContextType.Domain))
{
var group = GroupPrincipal.FindByIdentity(ctx, groupDN);
Console.WriteLine(group.Members.Count);
if (!group.Members.Contains(ctx, IdentityType.DistinguishedName, distinguishedName))
{
group.Members.Add(ctx, IdentityType.DistinguishedName, distinguishedName);
group.Save();
}
foreach (var item in group.Members)
{
Console.WriteLine(item.DistinguishedName);
}
Console.WriteLine(group.Members.Count);
}
var isMemberOf = false;
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
var found = Principal.FindByIdentity(ctx, IdentityType.DistinguishedName, distinguishedName);
if (found != null)
{
Console.WriteLine(found.DistinguishedName);
foreach (var item in found.GetGroups())
{
Console.WriteLine(item.DistinguishedName);
if (item.DistinguishedName == groupDN)
{
isMemberOf = true;
}
}
}
Assert.AreEqual(true, isMemberOf);
}
// Reset our group membership to run the test again.
GroupCtrl.RemoveIdentityFromGroup(groupDN, distinguishedName);
}
編集1:
だから私は2つの異なるアプローチを試しました
1 -
getUnderlyingObject を取得してから、 memberOf プロパティをループしてみました (同じ結果)
2 -
AccountManagement コードを避け、DirectorySearcher を使用して memberOf プロパティをループすると、毎回表示されます。ため息