2009-03-12 12 views
18

Qualcuno può fornire un esempio su come eseguire il ciclo di un System.DirectoryServices.PropertyCollection e produrre il nome e il valore della proprietà?Come effettuare il looping di una proprietà?

Sto usando C#.

@JaredPar - PropertyCollection non ha una proprietà Nome/Valore. Ha un PropertyNames e valori, digitare System.Collection.ICollection. Non conosco il tipo di oggetto di base che costituisce l'oggetto PropertyCollection.

@JaredPar di nuovo - In origine avevo erroneamente etichettato la domanda con il tipo sbagliato. Quello era il mio cattivo.

Aggiornamento: Sulla base di input Zhaph - Ben Duguid, sono stato in grado di sviluppare il seguente codice.

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

risposta

5

Il PropertyCollection ha una collezione PropertyName - che è una raccolta di stringhe (vedi PropertyCollection.Contains e PropertyCollection.Item sia di cui prendere una stringa).

In genere è possibile chiamare GetEnumerator per consentire di eseguire l'enumerazione sulla raccolta, utilizzando i consueti metodi di enumerazione: in questo caso si otterrà un IDictionary contenente la chiave di stringa e quindi un oggetto per ciascun elemento/valori.

+0

È meglio usare la conversione implicita in un ciclo foreach. –

0

EDIT I misread PO come avente detta PropertyValueCollection non PropertyCollection. Lasciando post perché altri post lo stanno facendo riferimento.

Non sono sicuro di aver capito cosa stai chiedendo Stai semplicemente cercando di scorrere ogni valore della collezione? Se è così questo codice funzionerà

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

Stampa il nome/valore

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

vedere il valore di PropertyValueCollection in fase di esecuzione nella finestra di controllo per identificare i tipi di elementi, contiene & si può espandere su per vedere ulteriormente quale proprietà ha ciascun elemento.

Aggiungendo a @ di JaredPar codice

 

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 si compone di PropertyValueCollection

+0

Questo è il modo giusto, sembra che PropertyValueCollection fosse la chiave per l'enumerazione corretta. Tutte le altre soluzioni suggeriscono un'altra indicizzazione indiretta (o non funzionano). –

+0

Perfetto, tranne che nel mio caso avevo bisogno di usare '.ToString' su' .Value' perché non poteva essere lanciato implicitamente. – Chad

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

Spiega il tuo codice. – hims056

0

Penso che ci sia un modo più semplice

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

Ho ottenuto System.InvalidCastException: il cast specificato non è valido. quando si utilizza questo. – Despertar

0

Davvero non c'è bisogno di fare nulla di magico se si desidera solo alcuni articoli ...

Utilizzo di istruzioni: Sistema, Sistema .DirectoryServices, e 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; 
} 
0

ho postato la mia risposta su un altro thread, e poi trovato questa discussione fa una domanda simile.

Ho provato i metodi suggeriti, ma ottengo sempre un'eccezione di cast non valida durante il casting su DictionaryEntry. E con un DictionaryEntry, cose come FirstOrDefault sono funky. Quindi, faccio semplicemente questo:

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(); 

Con quello sul posto, posso quindi facilmente richiedere qualsiasi proprietà direttamente da Key. Utilizzando il coalesce e gli operatori la sicurezza della navigazione permette inadempiente su una stringa vuota o qualsiasi altra cosa ..

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

E se volessi guardare oltre tutte le oggetti di scena, si tratta di un foreach simile.

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

Si noti che l'oggetto "adUser" è l'oggetto UserPrincipal.

0
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; 
} 
Problemi correlati