LDAP |检查AD上的UserID是否为Existing

时间:2009-10-01 11:24:12

标签: c# ldap

我只想在下面的现有代码中添加新方法。 方法是简单地检查给定的 User_ID ,如果它存在于AD上。

这是我第一次与AD打交道。

public class AD
{
    // Fields
    private static string ADPassword = ConfigurationManager.AppSettings["ADPassword"].ToString();
    private static string ADPath = ConfigurationManager.AppSettings["ADConnection"].ToString();
    private static string ADServerName = ConfigurationManager.AppSettings["ADServerName"].ToString();
    private static string ADUserName = ConfigurationManager.AppSettings["ADUserName"].ToString();

    // Methods
    public static string GetLogin(string sUserName, string sPassword)
    {
        try
        {
            DirectoryEntry entry = new DirectoryEntry(ADPath, ADServerName + sUserName, sPassword);
            object nativeObject = entry.NativeObject;
            return string.Empty;
        }
        catch
        {
            return "Invalid Username or Password";
        }
    }

    public static string Update(string sUserName, string sOldPassword, string sNewPassword)
    {
        string message;
        try
        {
            DirectoryEntry searchRoot = new DirectoryEntry();
            searchRoot.Path = ADPath;
            searchRoot.Username = ADServerName + ADUserName;
            searchRoot.Password = ADPassword;
            DirectorySearcher searcher = new DirectorySearcher(searchRoot);
            searcher.Filter = "(SAMAccountName=" + sUserName + ")";
            DirectoryEntry directoryEntry = searcher.FindOne().GetDirectoryEntry();
            directoryEntry.Invoke("ChangePassword", new object[] { sOldPassword, sNewPassword });
            directoryEntry.CommitChanges();
            directoryEntry.Close();
            message = string.Empty;
        }
        catch (Exception exception)
        {
            try
            {
                message = exception.InnerException.Message;
            }
            catch
            {
                message = exception.Message;
            }
        }
        return message;
    }
}

2 个答案:

答案 0 :(得分:1)

您使用的是哪个版本的.NET Framework?

在3.5之前的.NET中,您可能在整个服务器上执行DirectorySearch(或者更具约束性的子树):

public bool UserExists(string userName)
{
  DirectoryEntry searchRoot = new DirectoryEntry("LDAP://dc=yourcompany,dc=com", userName, password);
  DirectorySearcher searchForUser = new DirectorySearcher(searchRoot);

  searchForUser.SearchScope = SearchScope.SubTree;
  searchForUser.Filter = string.Format("(&(objectCategory=Person)(anr={0}))", userName);

  if(searchForUser.FindOne() != null)
  {  
     return true;
  } 
  else
  {
     return false;
  }
}

这只是我的头脑,现在无法测试。这将在您的整个域中搜索 - 检查searchRoot的LDAP路径 - 它必须类似于

LDAP://dc=yourcompany,dc=com

或者如果您想在“用户”容器内搜索:

LDAP://cn=Users,dc=yourcompany,dc=com

使用.NET 3.5,事情变得容易多了 - 请参阅此MSDN Article,了解有关如何使用新的System.DirectoryServices.AccountManagement命名空间在.NET 3.5中搜索和查找用户和组的大量有用信息。您现在基本上可以进行FindByIdentity调用:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "YOURDOMAIN");

UserPrincipal foundUser = UserPrincipal.FindByIdentity(ctx, "your user name");

这就是全部。

马克

答案 1 :(得分:0)

如果这是您的第一次AD体验,可能值得一看这个代码项目文章:Howto: (Almost) Everything In Active Directory via C#。它包含许多可能对您有所帮助的示例。

User_ID究竟是什么意思?用户名? LDAP专有名称?