Question

essentiellement ce que j'essaie de faire est d'ajouter un ordinateur / utilisateur à un groupe.Après avoir ajouté l'objet au groupe, je souhaite interroger les groupes de l'objet pour voir ce qu'ils ont.

Il semble que la méthode GetGroups ne fonctionne pas assez rapidement.Mon test semble toujours échouer.Si je mets des points d'arrêt dans VS, il fonctionnera si j'attendrai assez.

Je suis nouveau à jouer avec l'espace de noms AccounGanagement (j'ai utilisé le code PRE .NET 3.5 ALOT).Je suppose que je pouvais faire boucle à travers le code plusieurs fois, mais je vois si d'autres personnes ont des suggestions pour cela.

J'ai fait le test de l'unité suivant

[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);
}

Edit 1:

J'ai donc essayé deux approches différentes

1 -

J'ai essayé d'obtenir le getderlyingObject puis de boucler à travers le membre des propriétés (même résultat)

2 -

J'ai évité le code de la gestion de compte et j'ai utilisé un répertoire chercher et bouclé dans la propriété du membre de la propriété et il apparaît à chaque fois.Sighh

Était-ce utile?

La solution

J'ai donc changé mon code dans ce qui suit.L'ancienne façon de vérifier que Memberof avec DirectorySearch fonctionne à chaque fois.J'espérais utiliser uniquement l'utilisation de la classe de comptes pour ce projet.Je me demande si la version future de la classe sera meilleure.

    [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");
    }
}

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top