代码之家  ›  专栏  ›  技术社区  ›  dso

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

  •  8
  • dso  · 技术社区  · 15 年前

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

    • 输入:用户名,格式为[域]/[用户](例如“mycompany\bob”)
    • 输出:如果用户名存在,则为true;如果不存在,则为false。

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

    我确信我可以用广告来解决这个问题,但是在我这么做之前,我想知道是否有一个简单的更高级的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,但也可以应用于.NETRealTryServices。它们还演示了用户对象可能有用的其他属性。

    2 回复  |  直到 8 年前
        1
  •  4
  •   Russ Cam    8 年前

    这个 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());
    
        2
  •  2
  •   lbergnehr    12 年前

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

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