本质上是我想做的是将计算机/用户添加到一个组。将对象添加到组后,我想查询对象的组以查看它们有什么。

似乎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:

所以我尝试了两种不同的方法

1 -

我试过让getunedlyingObject,然后循环通过属性(相同的结果)

2 -

我避免了accounsmanagement代码并使用了DirectorySearcher,并循环通过Memberof属性,并且每次都会循环。sighh

有帮助吗?

解决方案

所以我将代码更改为以下内容。使用DirectorySearch检查Memberof的旧方法每次都运行。我希望仅使用此项目的AccountManagement类。我想知道这个班级的未来版本是否会更好。

    [Test]
    public void Check()
    {
        //var test = new Constructor();
        var test = new AdContextObject();

        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 = test.GetContext())
        {
            var group = GroupPrincipal.FindByIdentity(ctx, groupDN);

            Console.WriteLine(group.Members.Count);

            if (!group.Members.Contains(ctx, IdentityType.DistinguishedName, distinguishedName))
            {
                Console.WriteLine("addGroup");
                group.Members.Add(ctx, IdentityType.DistinguishedName, distinguishedName);
                group.Save();
            }

            foreach (var item in group.Members)
            {
                Console.WriteLine(item.DistinguishedName);
            }

            Console.WriteLine(group.Members.Count);
        }

        DirectoryEntry de = new DirectoryEntry();
        de.Path = "LdapSource";

        DirectorySearcher ser = new DirectorySearcher(de);
        ser.Filter = "(&(ObjectCategory=computer)(name=ComputerName))";
        ser.PropertiesToLoad.Add("name");
        ser.PropertiesToLoad.Add("memberOf");

  var returnValue = ser.FindAll();
        var isMemberOf = false;

        foreach (SearchResult res in returnValue)
        {
            var memberOf = GetMultiValue(res, "MemberOf");

            foreach (var item in memberOf)
            {
                Console.WriteLine(item);
                if (item.Equals(groupDN, StringComparison.OrdinalIgnoreCase))
                {
                    isMemberOf = true;
                }
            }
        }

        Assert.AreEqual(true, isMemberOf);
        Console.WriteLine("old way worked fine");

        isMemberOf = false;
        using (PrincipalContext ctx = test.GetContext())
        {
            var found = Principal.FindByIdentity(ctx, IdentityType.DistinguishedName, distinguishedName);

            if (found != null)
            {
                foreach (var item in found.GetGroups())
                {
                    Console.WriteLine(item.DistinguishedName);

                    if (item.DistinguishedName.Equals(groupDN, StringComparison.OrdinalIgnoreCase))
                    {
                        isMemberOf = true;   
                    }

                }
            }

            Assert.AreEqual(true, isMemberOf);
        }

        // Reset our group membership to run the test again.
        GroupCtrl.RemoveIdentityFromGroup(groupDN, distinguishedName);
    }

    public static string[] GetMultiValue(SearchResult result, string fieldName)
    {
        string[] returnValue = null;

        if (result != null)
        {
            if (result.Properties.Contains(fieldName))
            {
                ResultPropertyValueCollection propertyValue = result.Properties[fieldName];
                if (propertyValue != null)
                {
                    if (propertyValue.Count > 1)
                    {
                        string[] valueArray = new string[propertyValue.Count];
                        for (int i = 0; i < propertyValue.Count; i++)
                        {
                            string valStr = propertyValue[i].ToString();
                            valueArray[i] = valStr;
                        }

                        returnValue = valueArray;
                    }
                    else if (propertyValue.Count == 1)
                    {
                        string[] tempString = new string[] { propertyValue[0].ToString() };
                        returnValue = tempString;
                    }
                    else
                    {
                        string[] tempString = new string[] { };
                        returnValue = tempString;
                    }
                }
            }
        }

        return returnValue;
    }

public class AdContextObject
{
    public PrincipalContext GetContext()
    {
        return new PrincipalContext(ContextType.Domain, "domainStuff", "MoreDomainStuff");
    }
}
.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top