В настоящее время я пытаюсь написать функцию, которая позволяет мне получить ряд дополнительных атрибутов для пользователя 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();
}
}
}
Если отладить этот код я могу видеть, что postalCode
profilePath
и оба добавлены в список свойств, которые должны быть загружены, но в результат user
имеет только postalCode
от additionalAttributes
строка. Даже если я добавлю *
к свойствам, которые необходимо загрузить profilePath
. Итак, что я могу попытаться выяснить, почему атрибуты отсутствуют?
Другие вещи, которые я пробовал:
- Проверьте, когда атрибуты видны (они) с использованием учетных данных с помощью:
- AD пользователей и компьютеров MMC
- LDP
- Сравните количество свойств, возвращенных
Get-ADUser <user> -Properties *
, с количеством свойств, возвращенных этой w ау. В результате командлет возвращает больше атрибутов (в 2 раза больше). Поскольку некоторые из них, конечно, вычисляются (например,AccountExpirationDate
иAccoutnExpires
). Я не уверен, что это хороший показатель. - Убедитесь, что свойства действительно имеют назначенное значение.