【问题标题】:.NET: How to look up a user in Active Directory?.NET:如何在 Active Directory 中查找用户?
【发布时间】:2008-11-27 19:26:39
【问题描述】:

如何在 Active Directory 中查找用户?

一些示例用户名是:

  • avatopia\ian
  • 头像\ian
  • ian@avatopia.com
  • ian@avatopia.local
  • avatopia.com\ian

请务必注意,我不知道域名and i shouldn't be hard-coding it

有些sample code on stack-overflow 失败了。

using System.DirectoryServices;

/// <summary>
/// Gets the email address, if defined, of a user from Active Directory.
/// </summary>
/// <param name="userid">The userid of the user in question.  Make
/// sure the domain has been stripped first!</param>
/// <returns>A string containing the user's email address, or null
/// if one was not defined or found.</returns>
public static string GetEmail(string userid)
{
    DirectorySearcher searcher;
    SearchResult result;
    string email;

    // Check first if there is a slash in the userid
    // If there is, domain has not been stripped
    if (!userid.Contains("\\"))
    {
        searcher = new DirectorySearcher();
        searcher.Filter = String.Format("(SAMAccountName={0})", userid);
        searcher.PropertiesToLoad.Add("mail");
        result = searcher.FindOne();
        if (result != null)
        {
            email = result.Properties["mail"][0].ToString();
        }
    }

    return email;
}

它专门确保您没有传递完整的用户名。例如

Bad: avatopia\ian
Bad: avatar\ian
Good: ian
Good: ian

因为不允许你通过域,所以无法区分两个用户

ian
ian

另一个人在 sackoverflow 上有 the same question,但接受的答案说你必须

首先找到命名上下文 所需的域

don't know 什么是“命名上下文”,我不知道什么是“必需域”。我真的不想写一个正则表达式来尝试将用户名解析为域名和帐户名,例如

domain.something\user-name

进入

domain.something
user-name

因为我知道在某些极端情况下我会出错。我想要在活动目录中查找用户的正确、预期的方法。

CodeProject How to do almost everything in Active Directory 上有一个不错的页面,但是您无法通过用户名查找用户信息

我希望我可以给我的域控制器 (whoever it is, where ever it is, whatever it's called) 一个用户名,它会确定该用户属于哪个域,与该域控制器对话,并完成工作。

【问题讨论】:

    标签: .net active-directory


    【解决方案1】:

    这对我有用。

    您应该能够区分不同域控制器(即域/用户名)上的不同用户,因为 ldappath 会有所不同。根据你的说法,你不在乎,因为你是not specifying an ldappath

    您正在进行一项关于剥离 User.Identity.Name 的域/ 的投标交易。但我不知道你在担心什么,你只需要将字符串切成两半,第一次遇到'\'就该砍了。

    如果你不喜欢,你可以使用“正确的方式”:http://msdn.microsoft.com/en-us/library/ms973834.aspx

    这个也不错http://geekswithblogs.net/mhamilton/archive/2005/09/30/55621.aspx

          /// This is some imaginary code to show you how to use it
    
          Session["USER"] = User.Identity.Name.ToString();
          Session["LOGIN"] = RemoveDomainPrefix(User.Identity.Name.ToString()); // not a real function :D
          string ldappath = "LDAP://your_ldap_path";
          // "LDAP://CN=<group name>, CN =<Users>, DC=<domain component>, DC=<domain component>,..."
    
    
          Session["cn"] = GetAttribute(ldappath, (string)Session["LOGIN"], "cn");
          Session["displayName"] = GetAttribute(ldappath, (string)Session["LOGIN"], "displayName");
          Session["mail"] = GetAttribute(ldappath, (string)Session["LOGIN"], "mail");
          Session["givenName"] = GetAttribute(ldappath, (string)Session["LOGIN"], "givenName");
          Session["sn"] = GetAttribute(ldappath, (string)Session["LOGIN"], "sn");
    
    
    /// working code
    
    public static string GetAttribute(string ldappath, string sAMAccountName, string attribute)
        {
            string OUT = string.Empty;
    
            try
            {
                DirectoryEntry de = new DirectoryEntry(ldappath);
                DirectorySearcher ds = new DirectorySearcher(de);
                ds.Filter = "(&(objectClass=user)(objectCategory=person)(sAMAccountName=" + sAMAccountName + "))";
    
                SearchResultCollection results = ds.FindAll();
    
                foreach (SearchResult result in ds.FindAll())
                {
                    OUT =  GetProperty(result, attribute);
                }
            }
            catch (Exception t)
            {
                // System.Diagnostics.Debug.WriteLine(t.Message);
            }
    
            return (OUT != null) ? OUT : string.Empty;
        }
    
    public static string GetProperty(SearchResult searchResult, string PropertyName)
        {
            if (searchResult.Properties.Contains(PropertyName))
            {
                return searchResult.Properties[PropertyName][0].ToString();
            }
            else
            {
                return string.Empty;
            }
        }
    

    对于域/用户名

        public static string GetDomain(string s)
        {
            int stop = s.IndexOf("\\");
            return (stop > -1) ?  s.Substring(0, stop + 1) : null;
        }
    
        public static string GetLogin(string s)
        {
            int stop = s.IndexOf("\\");
            return (stop > -1) ? s.Substring(stop + 1, s.Length - stop - 1) : null;
        }
    

    对于用户名@域样式

       public static string GetDomain(string s) //untested
        {
            int stop = s.IndexOf("@");
            return (stop > -1) ? s.Substring(stop + 1, s.Length - stop - 1) : null;
        }
    
    
        public static string GetLogin(string s) //untested
        {
            int stop = s.IndexOf("@");
            return (stop > -1) ?  s.Substring(0, stop) : null;
        }
    

    【讨论】:

      【解决方案2】:

      我不知道纯 .net 方法。但是你可以使用win32的CredUIParseUserName

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-26
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        相关资源
        最近更新 更多