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>");
Другие вопросы по тегам