Как найти пользователя, у которого есть буква (или несколько) в его отображаемом имени - PullRequest
0 голосов
/ 03 февраля 2019

Я постараюсь объяснить себя лучше.Я использую C # для создания мини-программы для себя.Я хочу найти пользователя в моем активном каталоге, но я хочу найти пользователя без полного отображаемого имени.Позвольте мне объяснить себя.Например, мое отображаемое имя может быть: «David Holonka \ Jeramy».Есть ли способ поиска букв "lonka", и он найдет всех пользователей, у которых есть эти комбинации букв в их отображаемом имени?

Мой текущий код:

using (var pc = new PrinicpalContext(ContextType.Domain, "MyDomain"))
{
UserPrincipal user = new UserPrinicpal(pc);
User.DisplayName = "Holonka";
PrinicpalSearcher scrh = new PrinicpalSearcher(user);
Prinicpal found = scrh.FindOne();
}

}

Сейчас он ничего не находит, потому что нет пользователя, который отображает имя только "Holonka", но я хочу, чтобы он нашел пользователя, которого я упоминал ранее

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Вы также можете попробовать использовать Разрешение неоднозначных имен , который представляет собой специальный запрос AD, который ищет частичные совпадения в нескольких атрибутах (список этих атрибутов находится в этой статье).

Вы не можете использовать PrincipalSearcher, но используйте ANR.Вы должны использовать DirectorySearcher (это то, что PrincipalSearcher использует в любом случае в фоновом режиме).

Вот пример:

var searchRoot = new DirectoryEntry("LDAP://domain.com");
var searcher = new DirectorySearcher(searchRoot) {
    Filter = "(anr=Holonka)"
};
searcher.PropertiesToLoad.Add("displayName");

using (var results in = searcher.FindAll()) {
    foreach (SearchResult result in results) {
        if (result.Properties.Contains("displayName")) {
            var displayName = (string) result.Properties["displayName"][0];
            //do something else
        }
    }
}

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

Оператор using также целесообразен, поскольку SearchResultCollection не может быть полностью очищен сборщиком мусора.

Я написал об этом больше в статье, которую я написал: Active Directory: лучшая производительность

0 голосов
/ 03 февраля 2019

Вы можете использовать строку запроса в PrinicpalSearcher:

UserPrincipal user = new UserPrinicpal(pc);
User.DisplayName = "*Holonka*";
PrinicpalSearcher searcher = new PrinicpalSearcher(user);
var results = searcher.FindAll();

Вы также можете использовать PrincipalSearcher, чтобы найти пользователей с параметрами «или», как в примере ниже:

List<UserPrincipal> searchPrinciples = new List<UserPrincipal>();
searchPrinciples.Add(new UserPrincipal(context) { DisplayName="*Holonka*"});
searchPrinciples.Add(new UserPrincipal(context) { SamAccountName = "*Holonka*" });
searchPrinciples.Add(new UserPrincipal(context) { MiddleName = "*Holonka*" });
searchPrinciples.Add(new UserPrincipal(context) { GivenName = "*Holonka*" });
List<Principal> results = new List<Principal>();
foreach (var item in searchPrinciples)
{
    var searcher = new PrincipalSearcher(item);
    // Results may contains duplicate values because of separate searchers can handle the same user
    results.AddRange(searcher.FindAll());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...