基本上我想要做的是将一台计算机/用户添加到一个组中。将对象添加到组后,我想查询对象的组以查看它们有什么。
GetGroups 方法似乎更新得不够快。我的测试似乎总是失败。如果我在 VS 中放置一些断点,如果我等待足够多,它将运行。
我是使用 AccounManagement 命名空间的新手(我使用了很多 pre .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:
所以我尝试了两种不同的方法
1 -
我尝试获取 getUnderlyingObject,然后遍历 memberOf 属性(结果相同)
2 -
我避免使用 AccountManagement 代码并使用 DirectorySearcher 并遍历 memberOf 属性,并且每次都会出现。叹息