Ограничение атрибутов, возвращаемых в запросе 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».
Больше информации здесь