【问题标题】:How can I search Active Directory by username using C#?如何使用 C# 按用户名搜索 Active Directory?
【发布时间】:2013-05-31 20:09:34
【问题描述】:

我正在尝试通过用户名“admin”搜索活动目录。我知道目录中有一个具有该用户名的用户,但搜索不断返回。

var attributeName = "userPrincipalName";
var searchString = "admin"
var ent = new DirectoryEntry("LDAP://"dc=corp,dc=contoso,dc=com")
var mySearcher = new DirectorySearcher(ent);
mySearcher.Filter = string.Format("(&(objectClass=user)({0}={1}))", attributeName, searchString);

var userResult = mySearcher.FindOne();

userResult 总是以 null 结尾。我很想知道为什么,一定是我遗漏了什么。

【问题讨论】:

  • 很可能您不想按 UserPrincipalName 而是按 SamAccountNamr 进行搜索。

标签: c# active-directory


【解决方案1】:

如果您使用的是 .NET 3.5 及更高版本,则应查看 System.DirectoryServices.AccountManagement (S.DS.AM) 命名空间。在此处阅读所有相关信息:

基本上,您可以定义域上下文并在 AD 中轻松找到用户和/或组:

// set up domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find a user
UserPrincipal user = UserPrincipal.FindByIdentity(ctx, "admin");

if(user != null)
{
   // do something here....     
}

使用此代码,您将通过以下属性搜索该用户:

  • DistinguishedName:身份是专有名称 (DN)。
  • Guid:身份是全球唯一标识符 (GUID)。
  • Name:身份就是名字。
  • SamAccountName:身份是安全帐户管理员 (SAM) 名称。
  • Sid:身份是安全描述符定义语言 (SDDL) 格式的安全标识符 (SID)。
  • UserPrincipalName:身份是用户主体名称 (UPN)。

新的 S.DS.AM 让在 AD 中与用户和组一起玩变得非常容易!

【讨论】:

    【解决方案2】:

    这应该可行。

    private void showUsers(string pUserName)
    {
        string uid = Properties.Settings.Default.uid;
        string pwd = Properties.Settings.Default.pwd;
        using (var context = new PrincipalContext(ContextType.Domain, "YOURDOMAIN", uid, pwd))
        {
            using (UserPrincipal user = new UserPrincipal(context))
            {
                user.SamAccountName = pUserName;
                using (var searcher = new PrincipalSearcher(user))
                {
                    foreach (var result in searcher.FindAll())
                    {
                        DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
                        Console.WriteLine("First Name: " + de.Properties["givenName"].Value);
                        Console.WriteLine("Last Name : " + de.Properties["sn"].Value);
                        Console.WriteLine("SAM account name   : " + de.Properties["samAccountName"].Value);
                        Console.WriteLine("User principal name: " + de.Properties["userPrincipalName"].Value);
                        Console.WriteLine("Mail: " + de.Properties["mail"].Value);
    
                        PrincipalSearchResult<Principal> groups = result.GetGroups();
    
                        foreach (Principal item in groups)
                        {
                            Console.WriteLine("Groups: {0}: {1}", item.DisplayName, item.Name);
                        }
                        Console.WriteLine();
                    }
                }
            }
        }
        Console.WriteLine("End");
        Console.ReadLine();
    }
    

    【讨论】:

      【解决方案3】:

      事实证明,“userPrincipalName”必须全部小写(“userprincipalname”)。很高兴知道,感谢您的回复。

      【讨论】:

        【解决方案4】:

        如果您想坚持使用 DirectorySearcher,请尝试使用 cnsamaccountname 进行搜索

        var attributeName = "cn";
        var searchString = "admin"
        var ent = new DirectoryEntry("LDAP://"dc=corp,dc=contoso,dc=com")
        var mySearcher = new DirectorySearcher(ent);
        mySearcher.Filter = string.Format("(&(objectcategory=user)({0}={1}))", attributeName, searchString);
        
        var userResult = mySearcher.FindOne();
        

        【讨论】:

          【解决方案5】:
          var attributeName = "userPrincipalName";
          var = "admin"
          

          你需要像这样改变过滤器

          string filter="(&(objectCategory=person)(objectClass=user)(!sAMAccountType=805306370)(attributeName =searchString))";
          
          
          
          var ent = new DirectoryEntry("LDAP://"dc=corp,dc=contoso,dc=com")
          var mySearcher = new DirectorySearcher(ent);
          mySearcher.Filter = filter;
          
          var userResult = mySearcher.FindOne();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-26
            • 1970-01-01
            • 2017-04-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多