如何使用C#按用户名搜索Active Directory?

时间:2013-05-31 20:09:34

标签: c# active-directory

我正在尝试使用用户名“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结尾。我很想知道为什么,一定有一些我不知道的东西。

5 个答案:

答案 0 :(得分:7)

如果您使用的是.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中的用户和群组一起玩!

答案 1 :(得分:2)

如果您想坚持使用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();

答案 2 :(得分: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 :(得分:1)

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

答案 4 :(得分:0)

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();