2009-03-12 2 views
18

Может ли кто-нибудь представить пример того, как цитировать System.DirectoryServices.PropertyCollection и выводить имя и значение свойства?Как выполнить цикл через PropertyCollection

Я использую C#.

@JaredPar - PropertyCollection не имеет свойства Name/Value. Он имеет Имена свойств и Значения, введите System.Collection.ICollection. Я не знаю тип базового объекта, который составляет объект PropertyCollection.

@ JaredPar еще раз - изначально недобросовестно заданный вопрос. Это было плохо.

Обновление: На основании ввода Zhaph - Ben Duguid я смог разработать следующий код.

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

ответ

5

PropertyCollection имеет коллекцию PropertyName - которая представляет собой набор строк (см PropertyCollection.Contains и PropertyCollection.Item как из которых берут строку).

Обычно вы можете позвонить GetEnumerator, чтобы вы могли перечислить коллекцию, используя обычные методы перечисления - в этом случае вы получите IDictionary, содержащий строковый ключ, а затем объект для каждого элемента/значений.

+0

Лучше использовать неявное преобразование в цикле foreach. – 2010-10-28 04:31:13

0

РЕДАКТИРОВАТЬ я неверно ОП как имеющий указанный PropertyValueCollection не PropertyCollection. Оставляя сообщение, потому что другие сообщения ссылаются на него.

Я не уверен, что я понимаю, что вы просите. Вы просто хотите перебрать каждое значение в коллекции? Если это так, код будет работать

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

Распечатайте имя/значение

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

См значение PropertyValueCollection во время выполнения в окне просмотра, чтобы идентифицировать типы элементов, она содержит & вы можете расширить чтобы узнать, какое свойство имеет каждый элемент.

Добавление @ 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 состоит из PropertyValueCollection

+0

Это правильный путь, кажется, что PropertyValueCollection является ключом к правильному перечислению. Все другие решения предлагают другое косвенное индексирование (или либо не работают). –

+0

Отлично, кроме как в моем случае мне нужно было использовать '.ToString' на' .Value', потому что он не мог быть неявным. – 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

Пожалуйста, объясните свой код. – hims056

0

Я думаю, что есть более простой способ

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

У меня есть System.InvalidCastException: Указанный приказ недействителен. при использовании этого. – Despertar

0

Вы действительно не должны делать ничего магического, если вы хотите только несколько пунктов ...

Использование утверждений: система, система .DirectoryServices и 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

Я отправил свой ответ на другой поток, а затем нашел эта тема задает аналогичный вопрос.

Я пробовал предлагаемые методы, но при кастинге в DictionaryEntry всегда получаю недопустимое исключение литых. И с помощью DictionaryEntry такие вещи, как FirstOrDefault, напуганы. Таким образом, я просто сделать это:

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

С, что на месте, я могу затем легко запросить любое имущество непосредственно с помощью ключа. Использование COALESCE и безопасные операторов навигации позволяет недобросовестному пустую строке или любой другие ..

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

И если бы я хотел посмотреть на весь реквизит, это аналогичен Еогеасп.

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

Обратите внимание, что объектом adUser является объект 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; 
} 
Смежные вопросы