DirectoryServices.Protocols.SearchRequest возвращает несколько результатов для GUID
Я пишу программное обеспечение, которое интегрируется с Microsoft Active Directory. Ранее мы искали конкретных пользователей с DirectoryServices.Protocols.SearchRequest
используя запрос как:
var request = new SearchRequest("DC=corp,DC=spring,DC=lan", "(objectGUID=\71\ad\7d\cc\6e\fa\cc\4e\87\c5\b7\a8\5b\85\e7\36)", ...
Однако мы обнаружили, что это может быть медленно в зависимости от количества объектов в дереве, поэтому мы переключились на:
var request = new SearchRequest("<GUID=cc7dad71-fa6e-4ecc-87c5-b7a85b85e736>", "(objectCategory=*)", ...
В нашей тестовой среде это работало и, казалось, выполнялось быстрее, но наши конечные пользователи сообщали о проблемах. Я получил достаточно диагностической информации из файлов журналов, чтобы определить, что проблема в том, что новый запрос возвращает более одного результата Entry, когда программа ожидает только один результат, и это все, над чем я должен работать в данный момент.
Кто-нибудь знает, что может быть источником дополнительных результатов? Насколько я понимаю, objectGUID должен быть уникальным в среде Active Directory.
Обновление - Актуальный код:
SearchResultEntryCollection results = null;
try
{
var request = new SearchRequest("<GUID=cc7dad71-fa6e-4ecc-87c5-b7a85b85e736>", "(objectCategory=*)",
SearchScope.Subtree, new[] { "sAMAccountName", "objectGUID", "cn", "mail", "telephoneNumber" } );
var response = this._connection.SendRequest(request) as SearchResponse;
if (response != null && response.ResultCode == ResultCode.Success && response.Entries != null)
{
results = response.Entries;
return results;
}
errorMessage = response != null && !string.IsNullOrWhiteSpace(response.ErrorMessage)
? response.ErrorMessage
: "Unknown Error"
}
catch (DirectoryException e)
{
errorMessage = e.Message;
}
//other error handling
2 ответа
Проблема состоит в том, что могут быть некоторые другие дочерние объекты в учетной записи пользователя, которую вы ищете. Эти дочерние объекты не могут иметь GUID, поэтому GUID родительского объекта наследуется.
Например, Exchange-Active-Sync-Devices (ассоциации устройств SCCM/InTune):
Решение состоит в том, чтобы добавить поисковый фильтр как
(&(objectClass=person))
и тогда вы получите только ту учетную запись, которую ищете.
Рассматривали ли вы сделать привязку GUID LDAP с помощью DirectoryEntry
учебный класс?
Если код должен найти только одну запись в AD, привязка с использованием этого GUID может работать лучше. Хотя тогда вам придется получить все данные объекта.
DirectoryEntry entry = new DirectoryEntry("LDAP://<GUID=cc7dad71-fa6e-4ecc-87c5-b7a85b85e736>");