【问题标题】:How to check if Windows user account name exists in domain?如何检查域中是否存在 Windows 用户帐户名?
【发布时间】:2009-08-25 17:47:29
【问题描述】:

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

  • 输入:[域]/[用户]格式的用户名(例如“mycompany\bob”)
  • 输出:如果用户名存在则为真,否则为假。

我确实找到了this article,但那里的示例与验证和操作用户帐户有关,它们假设您已经有一个用户专有名称,而我从用户帐户名称开始。

我确信我可以使用 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;
        }
    }

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

我找到的对我有帮助的链接:How Can I Get User Information Using ADSI 这些示例使用 ADSI,但也可以应用于 .NET DirectoryServices。它们还演示了用户对象的其他可能有用的属性。

【问题讨论】:

  • 喜欢新版本,速度超快,正是我所需要的。谢谢!

标签: c# security


【解决方案1】:

本文中的System.DirectoryServices 命名空间正是您为此目的所需要的。如果我没记错的话,它是Active Directory Server Interfaces 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;
}

并使用以下测试

Console.WriteLine(UserInDomain("username","MyDomain.com").ToString());

【讨论】:

  • 这些是用于访问 Active Directory 信息的通用 API(例如用于 SQL 数据的 ADO.NET)。 AD 编程的挑战在于理解架构并构建正确的查询以获取您需要的信息(AD 中存储了大量信息)。
  • @DSO - 您拥有域和用户名,因此您应该能够使用 DirectorySearcher 对象通过实例化 DirectorySearcher 对象并传入绑定的 DirectoryEntry 对象来查找该域中是否存在用户名到表示域对象的节点
  • 您的示例对我不起作用,我收到“服务器返回推荐”错误,我认为这意味着容器不存在。我认为你原则上是对的,首先绑定到正确的容器然后搜索对象,所以我给了你赞成票。但是,我认为您构建查询以绑定到域的方法并不适用于所有环境。我找到了一个更简单的解决方案(更新后的帖子)。
  • 我在发布之前对其进行了测试,它对我有用。您是否为用户名传递了完全限定的用户名,还是只传递了用户名?只有用户名有效
【解决方案2】:

如果您使用足够高的框架版本,找到了一种简单的方法:

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;
    }
}

【讨论】:

    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-28
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多