Comment puis-je faire une boucle à travers une collecte PropertyCollection

est-ce que quelqu'un peut fournir un exemple de boucle à travers un système?DirectoryServices.PropertyCollection et sortie du nom et de la valeur de la propriété?

j'utilise C#.

@JaredPar-la collection PropertyCollection n'a pas de propriété Nom/Valeur. Il a un PropertyNames et des valeurs, type Système.Collection.ICollection. Je ne connais pas le type d'objet basline qui constitue L'objet PropertyCollection.

@JaredPar à nouveau - j'ai à l'origine mal étiqueté le question avec le mauvais type. C'était mon mauvais.

mise à Jour: basé sur L'entrée de Zhaph - Ben Duguid, j'ai pu développer le code suivant.

using System.Collections;
using System.DirectoryServices;

public void DisplayValue(DirectoryEntry de)
{
    if(de.Children != null)
    {
        foreach(DirectoryEntry child in de.Children)
        {
            PropertyCollection pc = child.Properties;
            IDictionaryEnumerator ide = pc.GetEnumerator();
            ide.Reset();
            while(ide.MoveNext())
            {
                PropertyValueCollection pvc = ide.Entry.Value as PropertyValueCollection;

                Console.WriteLine(string.Format("Name: {0}", ide.Entry.Key.ToString()));
                Console.WriteLine(string.Format("Value: {0}", pvc.Value));                
            }
        }      
    }  
}
19
demandé sur John Saunders 2009-03-13 01:46:25

10 réponses

la collection PropertyCollection a une collection PropertyName - qui est une collection de chaînes (voir PropertyCollection.Contient et PropertyCollection.L'élément tous deux prendre une corde).

habituellement, Vous pouvez appeler GetEnumerator pour vous permettre d'énumérer au - dessus de la collection, en utilisant les méthodes habituelles d'énumération-dans ce cas, vous obtiendriez un Idicule contenant la clé de chaîne, puis un objet pour chaque item/valeurs.

5
répondu Zhaph - Ben Duguid 2009-03-12 23:13:15

voir la valeur de PropertyValueCollection à l'exécution dans la fenêtre watch pour identifier les types d'éléments, il contient et vous pouvez l'étendre pour voir plus loin quelle propriété possède chacun des éléments.

Ajout au code de @JaredPar


PropertyCollection collection = GetTheCollection();
foreach ( PropertyValueCollection value in collection ) {
  // Do something with the value
  Console.WriteLine(value.PropertyName);
  Console.WriteLine(value.Value);
  Console.WriteLine(value.Count);
}

EDIT: PropertyCollection est composé de Proprietyvaluecollection

26
répondu shahkalpesh 2009-03-12 23:13:13
usr = result.GetDirectoryEntry();
foreach (string strProperty in usr.Properties.PropertyNames)
{
   Console.WriteLine("{0}:{1}" ,strProperty, usr.Properties[strProperty].Value);
}
4
répondu Vladimir 2010-08-12 17:20:30
foreach(var k in collection.Keys) 
{
     string name = k;
     string value = collection[k];
}
2
répondu antonioh 2009-03-12 23:09:47

EDIT j'ai mal interprété L'OP comme ayant dit que la perception de la valeur de la propriété n'était pas une perception correcte. Quitter post up parce que d'autres postes le référencent.

Je ne suis pas sûr de comprendre ce que vous demandez voulez-vous simplement faire le tour de chaque valeur de la collection? Si ce code fonctionne

PropertyValueCollection collection = GetTheCollection();
foreach ( object value in collection ) {
  // Do something with the value
}

imprimer le nom / la valeur

Console.WriteLine(collection.Name);
Console.WriteLine(collection.Value);
0
répondu JaredPar 2009-03-12 23:16:33

je pense qu'il y a un moyen plus simple

foreach (DictionaryEntry e in child.Properties) 
{
    Console.Write(e.Key);
    Console.Write(e.Value);
}
0
répondu 2010-10-28 04:30:09

Vous n'avez vraiment pas à faire quelque chose de magique si vous voulez juste quelques articles...

Utilisation Des Déclarations: Système, Système.DirectoryServices, et du Système.AccountManagement

public void GetUserDetail(string username, string password)
{
    UserDetail userDetail = new UserDetail();
    try
    {
        PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "mydomain.com", username, password);

        //Authenticate against Active Directory
        if (!principalContext.ValidateCredentials(username, password))
        {
            //Username or Password were incorrect or user doesn't exist
            return userDetail;
        }

        //Get the details of the user passed in
        UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(principalContext, principalContext.UserName);

        //get the properties of the user passed in
        DirectoryEntry directoryEntry = userPrincipal.GetUnderlyingObject() as DirectoryEntry;

        userDetail.FirstName = directoryEntry.Properties["givenname"].Value.ToString();
        userDetail.LastName = directoryEntry.Properties["sn"].Value.ToString();
    }
    catch (Exception ex)
    {
       //Catch your Excption
    }

    return userDetail;
}
0
répondu user2680296 2013-08-13 22:11:07

j'ai posté ma réponse sur un autre fil, puis trouvé ce fil de poser une question similaire.

j'ai essayé les méthodes suggérées, mais j'obtiens toujours une exception de cast invalide en casting à DictionaryEntry. Et avec un dictionnaire, les choses comme FirstOrDefault sont funky. Donc, j'ai simplement faire ceci:

var directoryEntry = adUser.GetUnderlyingObject() as DirectoryEntry;
directoryEntry.RefreshCache();
var propNames = directoryEntry.Properties.PropertyNames.Cast<string>();
var props = propNames
    .Select(x => new { Key = x, Value = directoryEntry.Properties[x].Value.ToString() })
    .ToList();

avec cela en place, je peux alors facilement rechercher n'importe quelle propriété directement par clé. L'utilisation des opérateurs de coalesce et de la navigation sûre permet de une corde vide ou autre..

var myProp = props.FirstOrDefault(x => x.Key == "someKey"))?.Value ?? string.Empty;

et si je voulais regarder tous les accessoires, c'est un avant-bras similaire.

foreach (var prop in props)
{
     Console.WriteLine($"{prop.Key} - {prop.Value}");
}

notez que l'objet" adUser " est L'objet UserPrincipal.

0
répondu long2know 2016-10-21 04:58:11
public string GetValue(string propertyName, SearchResult result)
{
    foreach (var property in result.Properties)
    {
        if (((DictionaryEntry)property).Key.ToString() == propertyName)
        {
            return ((ResultPropertyValueCollection)((DictionaryEntry)property).Value)[0].ToString();
        }
    }
    return null;
}
0
répondu Mohammed Othman 2017-03-08 20:13:43

je ne sais pas pourquoi c'était si dur de trouver une réponse, mais avec le code ci-dessous je peux parcourir l'ensemble des propriétés et tirez celui que je veux et réutiliser le code pour n'importe quelle propriété. Vous pouvez gérer l'entrée de répertoire partie différemment si vous voulez

getAnyProperty("[servername]", @"CN=[cn name]", "description");

   public List<string> getAnyProperty(string originatingServer, string distinguishedName, string propertyToSearchFor)
    {
        string path = "LDAP://" + originatingServer + @"/" + distinguishedName;
        DirectoryEntry objRootDSE = new DirectoryEntry(path, [Username], [Password]);
// DirectoryEntry objRootDSE = new DirectoryEntry();

        List<string> returnValue = new List<string>();
        System.DirectoryServices.PropertyCollection properties = objRootDSE.Properties;
        foreach (string propertyName in properties.PropertyNames)
        {
            PropertyValueCollection propertyValues = properties[propertyName];
            if (propertyName == propertyToSearchFor)
            {
                foreach (string propertyValue in propertyValues)
                {
                    returnValue.Add(propertyValue);
                }
            }
        }

        return returnValue;
    }
0
répondu Jay 2018-05-07 22:30:03