C#中检查Windows用户帐户名是否存在的最简单,最有效的方法是什么?这是在域环境中。
我确实找到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;
}
}
P.S。 对于那些不熟悉上面使用的API的人:您需要添加对System.DirectoryServices的引用才能使用它。
我发现的链接帮助了我:How Can I Get User Information Using ADSI 这些示例使用ADSI,但也可以应用于.NET DirectoryServices。它们还演示了可能有用的用户对象的其他属性。
答案 0 :(得分: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());
答案 1 :(得分: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;
}
}