Ограничение атрибутов, возвращаемых в запросе LDAP

Как ограничить атрибуты, которые возвращаются в запросе LDAP через System.DirectoryServices?

Я использую DirectorySearcher и добавляю нужные свойства в DirectorySearcher.PropertiesToLoad. Проблема в том, что это просто гарантирует, что добавленные свойства включены в DirectoryEntry.Properties, а также в некоторый список по умолчанию. Есть ли способ указать только те свойства, которые вы хотите вернуть?

DirectoryEntry base = new DiectoryEntry(rootPath, null, null, AuthenticationTypes.FastBind);
DirectorySearcher groupSearcher = new DirectorySearcher(base);
groupSearcher.Filter = "(objectClass=group)";
groupSearcher.PropertiesToLoad.Add("distinguishedName");
groupSearcher.PropertiesToLoad.Add("description");
foreach (SearchResult groupSr in groupDs.FindAll())
...

Внутри цикла foreach, когда я получаю группу DirectoryEntry, существует около 16 различных свойств, к которым я могу получить доступ, а не только к двум, которые я указал (Отличительное имя, описание)

2 ответа

Решение

То, что вы ограничиваете, есть свойства, которые будут доступны / заполнены в вашем SearchResult объекты - к которым вы можете получить доступ непосредственно в вашем foreach цикл:

DirectoryEntry baseEntry = new DirectoryEntry(rootPath, null, null, AuthenticationTypes.FastBind);

DirectorySearcher groupSearcher = new DirectorySearcher(baseEntry);
groupSearcher.Filter = "(objectClass=group)";

groupSearcher.PropertiesToLoad.Add("distinguishedName");
groupSearcher.PropertiesToLoad.Add("description");

foreach (SearchResult groupSr in groupSearcher.FindAll())
{
   if(groupSr.Properties["description"] != null && groupSr.Properties["description"].Count > 0)
   {
      string description = groupSr.Properties["description"][0].ToString();
   }

  .....
} 

Вы не можете ограничить свойства на фактическом DirectoryEntry - так что, если вы идете, возьмите запись каталога для каждого SearchResult - у вас есть полный доступ ко всему. Но суть в том, что вы можете определить, какие свойства вам нужны, и получить к ним доступ непосредственно в SearchResultбез необходимости возвращаться к основному DirectoryEntry

Исходный ответ правильный, но если вам действительно нужно использовать DirectoryEntryи хотите получить доступ к определенному свойству, обязательно загрузите его через RefreshCacheперед доступом к значению:

      dirEntry.RefreshCache(new [] { "mail", "displayName" });
var email = (string) dirEntry.Properties["mail"]?.Value;
var displayName = (string) dirEntry.Properties["displayName"]?.Value;

Таким образом, из этой записи загружаются только «mail» и «displayName».

Больше информации здесь

Другие вопросы по тегам