Как получить свойство streetaddress организационной единицы в Windows Active Directory с LDAP в C # .Net - PullRequest
1 голос
/ 29 июня 2009

Каждый из наших пользователей назначается в основную организационную единицу (OU) в зависимости от того, в каком глобальном офисе он находится. Таким образом, в подразделении "Chicago" есть все сотрудники в нашем офисе в Чикаго.

Используя c # и .net 3.5, моя задача - извлечь всех этих пользователей.

Если пользователи не находятся в спутниковом или домашнем офисе, их адрес, город, штат и т. Д. Пусты, но OU содержит эти данные. В интерфейсе Active Directory Windows, щелкнув правой кнопкой мыши по подразделению и выбрав свойства, можно разместить всю эту информацию так же, как и для пользователя. Однако, когда я пытаюсь получить доступ к этим свойствам так же, как и к пользователю, я получаю ошибку ссылки на объект, предполагая, что эти атрибуты не существуют таким же образом для OU, как для пользователя.

Как / можно получить доступ к этим параметрам местоположения из объекта OU?

Вот пример кода, который я использую, показывающий streetaddress в качестве примера, оператор, пытающийся присвоить значение streetaddress из OU, терпит неудачу, где назначение из associate завершается успешно.

foreach (SearchResult subOU in results)
{
   ResultPropertyValueCollection subColl = subOU.Properties["distinguishedname"];
   string subPath = subColl[0].ToString();
   DirectoryEntry subEntry = new DirectoryEntry("LDAP://" + subPath);
   DirectorySearcher userSearcher = new DirectorySearcher(subEntry);
   userSearcher.SearchScope = SearchScope.OneLevel;
   userSearcher.Filter = "(objectClass=user)";
   foreach (SearchResult user in userSearcher.FindAll())
   {
     ResultPropertyValueCollection userColl = user.Properties["distinguishedname"];
     string userPath = userColl[0].ToString();
     DirectoryEntry userEntry = new DirectoryEntry("LDAP://" + userPath);
     PropertyCollection associateProperties = userEntry.Properties;
     PropertyCollection ouProperties = subEntry.Properties;

     string streetAddress = string.Empty;
     if (associateProperties["streetaddress"].Value == null) 
     { streetAddress = ouProperties["streetaddress"].Value.ToString(); }
     else
     { streetAddress = associateProperties["streetaddress"].Value.ToString(); }
  }
}

Ответы [ 3 ]

3 голосов
/ 30 июня 2009

Если вы измените поле Street на вкладке General в Active Directory Users & Computers для пользователя, значение будет сохранено в атрибуте streetAddress в каталоге. Однако если вы измените то же поле для подразделения, это значение будет сохранено в атрибуте улицы этого подразделения в каталоге.

Это потому, что объектам OU не (как определено в схеме по умолчанию Active Directory) разрешено содержать атрибут streetAddress.

Так что (не анализируя ваш код дальше), если вы измените ouProperties["streetaddress"] на ouProperties["street"], вы можете получить искомый результат.

1 голос
/ 30 июня 2009

Чтобы избежать исключения ObjectReference, необходимо проверить, что коллекция содержит обязательный атрибут, используя метод Contains (string). Смотри здесь

Я считаю, что AD будет хранить только ценные атрибуты на объекте, если конкретному атрибуту никогда не было присвоено значение, оно не будет доступно.

0 голосов
/ 01 июля 2009

Я нашел ссылки на схему AD по адресу:

http://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-ADA1%5D.pdf A-L http://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-ADA2%5D.pdf Просто М http://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-ADA3%5D.pdf N-Z http://download.microsoft.com/download/a/e/6/ae6e4142-aa58-45c6-8dcf-a657e5900cd3/%5BMS-ADTS%5D.pdf AD техническая информация

Это ответило бы на этот вопрос для вас.

Кроме того, оснастка Win2K8 ADUC MMC, если вы перейдете в View, выберите Advanced Features, (включите галочку), а затем получите редактор атрибутов. (Что-то, что ConsoleOne для eDirectory уже около десяти лет!).

Одна небольшая заметка, в схеме AD, первый символ всегда строчный, и я использую достаточно высокое разрешение, поэтому буквы L в нижнем регистре трудно увидеть как буквы L. (Нужен лучший экранный шрифт, но я виноват).

...