Вопрос по c# – Active Directory Показать все свойства в таблице

6

Я пытаюсь выполнить запрос LDAP, чтобы собрать все свойства, которые у нас есть о наших пользователях, без указания свойств заранее, я хотел бы отобразить это в таблице, поэтому использовал следующий код. Это работает, если я раскомментирую search.PropertiesToLoad.Add (& quot; cn & quot;); и будет отображать любые другие свойства, которые я добавляю таким же образом, но не тогда, когда я делаю полный поиск всех свойств.

DirectoryEntry myLdapConnection = createDirectoryEntry();
DirectorySearcher search = new DirectorySearcher(myLdapConnection);

search.CacheResults = true;
//search.PropertiesToLoad.Add("cn");

SearchResultCollection allResults = search.FindAll();
DataTable resultsTable = new DataTable("Results");

//add columns for each property in results
foreach (string colName in allResults.PropertiesLoaded)
    resultsTable.Columns.Add(colName, colName.GetType());

//loop to add records to DataTable
foreach (SearchResult result in allResults)
{
    int tmp = result.Properties.Count;
    DataRow row = resultsTable.NewRow();
    foreach (string columnName in search.PropertiesToLoad)
    {
        if (columnName.Equals("lastlogon"))
        {
            if (result.Properties.Contains(columnName))
                row[columnName] = ConvertDate(result.Properties[columnName].ToString());
            else
                row[columnName] = "";
        }
        else
        {
            if (result.Properties.Contains(columnName))
                row[columnName] = result.Properties[columnName][0].ToString();
            else
                row[columnName] = "";
        }
    }
    resultsTable.Rows.Add(row);
}

gridResults.DataSource = resultsTable;

Проблема, кажется, с

foreach (string colName in allResults.PropertiesLoaded)
    resultsTable.Columns.Add(colName, colName.GetType());

Я ожидал, что это зациклит все свойства, когда не было указано PropertiesToLoad, но это не способ добиться того, чего я хочу.

Я знаю, что пока мне нужно несколько попыток отлова и других фрагментов в коде, это черновик.

Ваш Ответ

3   ответа
1

глядя на то, как сделать это сам. Вместо этого я нашел другой способ сделать это, и, кажется, работает нормально.

return ((DirectoryEntry)UserPrincipal.Current.GetUnderlyingObject()).Properties.PropertyNames;

В любом случае, он отлично загружается в Combobox. Просто если кто-нибудь еще сталкивается с этой темой.

Это может быть более полезным для меня, если ваш комментарий связывает UserPrincipal с DirectorySearcher или что-то релевантное. Возможно, я просто недостаточно знаю об этом объекте, но не вижу допустимого типа объекта и не могу разрешить это. Taersious
Это использует более новую версию System.DirectoryServices.AccountManagement. Таким образом, вам нужно будет добавить ссылку и использование оператора. Michael
11

foreach (SearchResult searchResult in allResults)
{
  foreach (string propName in searchResult.Properties.PropertyNames)
  {
    ResultPropertyValueCollection valueCollection =
    searchResult.Properties[propName];
    foreach (Object propertyValue in valueCollection)
    {
    Console.WriteLine("Property: " + propName + ": " + propertyValue.ToString());
    }
  }
}

Это то, что тебе нужно?

12

Это можно сделать с помощьюDirectoryEntry, но я не думаю, чтоSearchResultCollection имеет все поля.
Попробуй создатьDirectoryEntry для каждого результата поиска он должен иметь все свойства активного каталога:

DirectoryEntry entry = result.GetDirectoryEntry();

Также обратите внимание, что в активном каталоге каждое свойство может иметь несколько значений (например, поле MemberOf), поэтому вам придется их итерировать.
Я написал похожий метод, но выбралList с ключами / значениями (это казалось более управляемым по сравнению с WCF.ILookup было бы оптимальным, но я не мог заставить его работать здесь). Вот он, оторванный от try / catch / using

var list = new List<KeyValuePair<string, string>>();
foreach (PropertyValueCollection property in entry.Properties)
   foreach (object o in property)
   {
       string value = o.ToString();
       list.Add(new KeyValuePair<string, string>(property.PropertyName, value));
   }

Похожие вопросы