2009-08-25 104 views
8

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

  • 输入:在[域]用户名/ [用户]格式(例如 “myCompany中\鲍勃”)
  • 输出:如果用户名存在则为真,否则为false。

我发现this article但例子也有相关认证和操纵用户帐户和他们假定您已经有一个用户专有名称,而我开始与用户帐户名。

我敢肯定,我可以用AD来解决这个问题,但在我这样做之前,我想知道是否有一个简单的高级API可以满足我的需求。

* UPDATE *

可能有许多方法可以做到这一点,拉斯发布一个可以工作,但我无法弄清楚如何调整它在我的环境中工作。我没有找到一个不同的方法,使用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。他们还演示了可能有用的用户对象的其他属性。

+0

爱新版本中,超快正是我所需要的。谢谢! – 2011-02-24 16:23:51

回答

4

文章中的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()); 
+0

这些是用于访问Active Directory信息(如ADO.NET for SQL数据)的通用API。 AD编程的挑战在于理解模式并构建正确的查询来获取所需的信息(并且存储在AD中的信息很多)。 – DSO 2009-08-25 19:12:24

+0

@DSO - 你有域名和用户名,所以你应该可以使用DirectorySearcher对象来查找用户名是否存在于该域中,方法是实例化DirectorySearcher对象并传入绑定到表示域对象的节点的DirectoryEntry对象 – 2009-08-25 20:16:24

+0

你的例子没有为我工作,我得到一个“服务器返回一个推荐”的错误,我认为这意味着容器不存在。我认为你原则上是正确的,首先绑定到正确的容器,然后搜索对象,所以我让你为此付出了努力。然而,我不认为你构建查询绑定到域的方法将适用于所有环境。我找到了一个更简单的解决方案(更新后)。 – DSO 2009-08-28 18:01:47

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; 
    } 
} 
相关问题