Как проверить, существует ли имя пользователя Windows в домене? - PullRequest
8 голосов
/ 25 августа 2009

Какой самый простой и эффективный способ в C # проверить, существует ли имя учетной записи пользователя Windows? Это в доменной среде.

  • Ввод: имя пользователя в формате [домен] / [пользователь] (например, «mycompany \ bob»)
  • Вывод: True, если имя пользователя существует, и false, если нет.

Я нашел эту статью , но примеры там относятся к аутентификации и манипулированию учетными записями пользователей, и они предполагают, что у вас уже есть отличительное имя пользователя, тогда как я начинаю с имени учетной записи пользователя.

Я уверен, что могу понять это с помощью AD, но прежде чем я это сделал, мне было интересно, есть ли простой API более высокого уровня, который делает то, что мне нужно.

* ОБНОВЛЕНИЕ *

Вероятно, есть много способов сделать это, Расс опубликовал один, который мог бы работать, но я не мог понять, как настроить его для работы в моей среде. Я нашел другой подход, используя провайдера WinNT, который сделал эту работу за меня:

    public static bool UserInDomain(string username, string domain)
    {
        string path = String.Format("WinNT://{0}/{1},user", domain, username);

        try
        {
            DirectoryEntry.Exists(path);
            return true;
        }
        catch (Exception)
        {
            // For WinNT provider DirectoryEntry.Exists throws an exception
            // instead of returning false so we need to trap it.
            return false;
        }
    }

приписка Для тех, кто не знаком с API, использованным выше: вам нужно добавить ссылку на System.DirectoryServices, чтобы использовать его.

Ссылка, которую я нашел, которая помогла мне в этом: Как я могу получить информацию о пользователе, используя ADSI В примерах используется ADSI, но его можно применять и к .NET DirectoryServices. Они также демонстрируют другие свойства пользовательского объекта, которые могут быть полезны.

Ответы [ 2 ]

4 голосов
/ 25 августа 2009

Пространство имен System.DirectoryServices в статье - именно то, что вам нужно и предназначено для этой цели. Если я правильно помню, это обертка вокруг Интерфейсы сервера Active Directory COM-интерфейсы

EDIT:

Что-то вроде следующего должно сделать это (вероятно, это может быть сделано с некоторой проверкой и обработкой). Он будет использовать домен текущего контекста безопасности для поиска контроллера домена, но его можно легко изменить, чтобы передать в именованный сервер.

public bool UserInDomain(string username, string domain)
{
    string LDAPString = string.Empty;
    string[] domainComponents = domain.Split('.');
    StringBuilder builder = new StringBuilder();

    for (int i = 0; i < domainComponents.Length; i++)
    {
        builder.AppendFormat(",dc={0}", domainComponents[i]);
    }
    if (builder.Length > 0)
        LDAPString = builder.ToString(1, builder.Length - 1);

    DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPString);

    DirectorySearcher searcher = new DirectorySearcher(entry);

    searcher.Filter = "sAMAccountName=" + username;

    SearchResult result = searcher.FindOne();

    return result != null;
}

и протестировано со следующим

Console.WriteLine(UserInDomain("username","MyDomain.com").ToString());
2 голосов
/ 17 января 2013

Найден простой способ сделать это, если вы используете достаточно высокую версию фреймворка:

using System.DirectoryServices.AccountManagement;

bool UserExists(string userName, string domain) {
    using (var pc = new PrincipalContext(ContextType.Domain, domain))
    using (var p = Principal.FindByIdentity(pc, IdentityType.SamAccountName, userName)) {
        return p != null;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...