2017-02-01 1 views
0

В настоящее время я пытаюсь написать функцию, которая позволяет мне получить ряд дополнительных атрибутов для пользователя Active Directory. Чтобы получить эти атрибуты, я использую System.DirectoryServices.DirectorySearcher, и он работает для некоторых атрибутов, таких как postalCode или physicalDeliveryOfficeName, но не для других, таких как profilePath, и я озадачен, почему.Использование DirectorySearcher для извлечения определенных свойств не возвращает значение

Я использую код, который выглядит примерно следующим образом:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.DirectoryServices; 

namespace ADReaderTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string name = "doe"; 
      string additionalAttributes = "postalCode,profilePath"; 
      DirectoryEntry adConnection = 
       new DirectoryEntry("GC://DC=contoso,DC=local", "CONTOSO\\User", "Password"); 
      DirectorySearcher adSearch = new DirectorySearcher(adConnection); 
      adSearch.PropertiesToLoad.Add("cn"); 
      adSearch.PropertiesToLoad.Add("SamAccountName"); 
      adSearch.PropertiesToLoad.Add("objectSID"); 

      foreach(string attribute in additionalAttributes.Split(',')){ 
       adSearch.PropertiesToLoad.Add(attribute); 
      } 

      adSearch.Filter = "(&(|((&objectCategory=person)(objectClass=user))(objectCategory=group))(cn=*" + name + "*))"; 

      SearchResultCollection adSearchResult = adSearch.FindAll(); 

      Console.WriteLine("There were " + adSearchResult.Count + " matches for *" + name + "*"); 
      foreach(SearchResult user in adSearchResult) 
      { 
       Console.WriteLine("Listing Properties for " + user.Path); 
       foreach (string prop in user.Properties.PropertyNames) { 
        Console.WriteLine("Prop: " + prop); 
        for(int i = 0; i < user.Properties[prop].Count; i++){ 
         Console.WriteLine("\t" + user.Properties[prop][i].ToString()); 
        } 
       } 
      } 

      Console.ReadLine(); 
     } 
    } 
} 

Если отладить этот код я могу видеть, что postalCodeprofilePath и оба добавлены в список свойств, которые должны быть загружены, но в результат user имеет только postalCode от additionalAttributes строка. Даже если я добавлю * к свойствам, которые необходимо загрузить profilePath. Итак, что я могу попытаться выяснить, почему атрибуты отсутствуют?

Другие вещи, которые я пробовал:

  • Проверьте, когда атрибуты видны (они) с использованием учетных данных с помощью:
    • AD пользователей и компьютеров MMC
    • LDP
  • Сравните количество свойств, возвращенных Get-ADUser <user> -Properties *, с количеством свойств, возвращенных этой w ау. В результате командлет возвращает больше атрибутов (в 2 раза больше). Поскольку некоторые из них, конечно, вычисляются (например, AccountExpirationDate и AccoutnExpires). Я не уверен, что это хороший показатель.
  • Убедитесь, что свойства действительно имеют назначенное значение.

ответ

0

Если кто-то еще сталкивается с той же проблемой, вы должны убедиться, что ваша строка path/connection является правильной. В этом случае (как указано GC://) я привязываюсь к глобальному каталогу и глобальному каталогу doesn't contain all attributes. Если вы действительно хотите запросить LDAP, используйте LDAP:// provider ...

Смежные вопросы