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

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

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

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

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

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

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

本文中的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; } 

并通过以下测试

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

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

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