Подтвердить что ты не робот

Как выполнить цикл PropertyCollection

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

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

@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));                
            }
        }      
    }  
}
4b9b3361

Ответ 1

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

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

Ответ 2

Посмотрите значение 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

Ответ 3

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

Ответ 4

foreach(var k in collection.Keys) 
{
     string name = k;
     string value = collection[k];
}

Ответ 5

EDIT Я неправильно читаю OP как имеющий свойство PropertyValueCollection, а не PropertyCollection. Оставляя сообщение, потому что другие сообщения ссылаются на него.

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

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

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

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

Ответ 6

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

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

Ответ 7

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

Использование выражений: System, System.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;
}

Ответ 8

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

Я попробовал предложенные методы, но при кастинге в 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();

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

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

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

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

Обратите внимание, что объектом adUser является объект UserPrincipal.

Ответ 9

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