Question

Quelqu'un peut-il donner un exemple de la procédure à suivre pour effectuer une boucle dans System.DirectoryServices.PropertyCollection et générer le nom et la valeur de la propriété?

J'utilise C #.

@JaredPar - La PropertyCollection n'a pas de propriété Nom / Valeur. Il possède un PropertyNames et des valeurs, tapez System.Collection.ICollection. Je ne connais pas le type d'objet basline qui constitue l'objet PropertyCollection.

@JaredPar à nouveau - Au départ, j'avais mal étiqueté la question avec le mauvais type. C'était mon mauvais.

Mise à jour: Sur la base de la saisie 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));                
            }
        }      
    }  
}
Était-ce utile?

La solution

PropertyCollection possède une collection PropertyName, qui est une collection de chaînes (voir PropertyCollection.Contains et PropertyCollection.Item , qui prennent tous deux une chaîne).

Vous pouvez généralement appeler GetEnumerator pour vous permet d'énumérer la collection, en utilisant les méthodes d'énumération habituelles - dans ce cas, vous obtiendrez un IDictionary contenant la clé de chaîne, puis un objet pour chaque élément / valeur.

Autres conseils

Voir la valeur de PropertyValueCollection au moment de l'exécution dans la fenêtre de surveillance pour identifier les types d'élément, elle contient & amp; vous pouvez développer pour voir plus en détail la propriété 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 PropertyValueCollection

usr = result.GetDirectoryEntry();
foreach (string strProperty in usr.Properties.PropertyNames)
{
   Console.WriteLine("{0}:{1}" ,strProperty, usr.Properties[strProperty].Value);
}
foreach(var k in collection.Keys) 
{
     string name = k;
     string value = collection[k];
}

MODIFIER : j'ai mal interprété le PO comme s'il avait déclaré PropertyValueCollection et non PropertyCollection. Laisser post up parce que d'autres posts le référencent.

Je ne suis pas sûr de comprendre ce que vous demandez. Voulez-vous simplement parcourir chaque valeur de la collection? Si tel est le cas, ce code fonctionnera

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

Imprimez le nom / la valeur

Console.WriteLine(collection.Name);
Console.WriteLine(collection.Value);

Je pense qu'il y a un moyen plus facile

foreach (DictionaryEntry e in child.Properties) 
{
    Console.Write(e.Key);
    Console.Write(e.Value);
}

Vous n'avez vraiment rien à faire de magique si vous ne voulez que quelques articles ...

Utilisation des instructions: System, System.DirectoryServices et System.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;
}

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

J'ai essayé les méthodes suggérées, mais j'obtiens toujours une exception de diffusion invalide lors de la conversion vers DictionaryEntry. Et avec un DictionaryEntry, des choses comme FirstOrDefault sont géniales. Donc, je fais simplement 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();

Cela mis en place, je peux alors facilement interroger une propriété directement par Key. L’utilisation des opérateurs de navigation coalesce et safe permet d’utiliser par défaut une chaîne vide ou autre.

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

Et si je voulais regarder par-dessus tous les accessoires, c'est une foreach similaire.

foreach (var prop in props)
{
     Console.WriteLine(<*>quot;{prop.Key} - {prop.Value}");
}

Notez que le " adUser " objet est l'objet UserPrincipal.

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

Je ne sais pas pourquoi il était si difficile de trouver une réponse, mais avec le code ci-dessous, je peux parcourir toutes les propriétés, extraire celle que je veux et réutiliser le code pour n’importe quelle propriété. Vous pouvez gérer la partie entrée de répertoire 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;
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top