如何检查域中是否存在Windows用户帐户名?

DSO*_*DSO 8 c# security

在C#中检查Windows用户帐户名是否存在的最简单,最有效的方法是什么?这是在域环境中.

  • 输入:[域]/[用户]格式的用户名(例如"mycompany\bob")
  • 输出:如果用户名存在则为True,否则为false.

我确实找到了这篇文章,但是这些示例与验证和操作用户帐户有关,他们假设您已经拥有用户可分辨名称,而我从用户帐户名称开始.

我确信我可以使用AD来解决这个问题,但在此之前,我想知道是否有一个简单的更高级API可以满足我的需求.

*更新*

可能有很多方法可以做到这一点,Russ发布了一个可以工作的方法,但我无法弄清楚如何调整它以在我的环境中工作.我确实找到了一种不同的方法,使用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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

PS 对于那些不熟悉上面使用的API的人:您需要添加对System.DirectoryServices的引用才能使用它.

我找到的链接帮助了我:如何使用ADSI获取用户信息 示例使用ADSI,但也可以应用于.NET DirectoryServices.它们还演示了可能有用的用户对象的其他属性.

Rus*_*Cam 4

System.DirectoryServices本文中的命名空间正是您所需要的并且旨在用于此目的。如果我没记错的话,它是Active Directory 服务器接口COM 接口的包装器

编辑:

像下面这样的事情应该可以做到(它可能需要一些检查和处理)。它将使用当前安全上下文的域来查找域控制器,但这可以轻松修改以传递命名服务器。

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;
}
Run Code Online (Sandbox Code Playgroud)

并用以下测试

Console.WriteLine(UserInDomain("username","MyDomain.com").ToString());
Run Code Online (Sandbox Code Playgroud)