返回有关找到的用户Active Directory的信息

时间:2015-07-01 20:21:49

标签: c# active-directory directoryservices

我正在制作Active Directry管理工具,但我无法让某些人工作。 我创建了一个课程,我想找到一个特定的用户并返回他的信息(姓名,全名,CN,......)。我可以找到所有这些信息,但是当我不知道从班级返回所有值的最佳方法时。

以下是我目前使用的代码:

DirectorySearcher search = new DirectorySearcher(ldapConnectie);
search.Filter = "(cn=" + username + ")";
SearchResult result = search.FindOne();
    if (result != null)
    {
        List<string> listLdapFields = new List<string>();
        List<Object> listLdapValues = new List<Object>();
        ResultPropertyCollection fields = result.Properties;

                foreach (String ldapField in fields.PropertyNames)
                {
                    listLdapFields.Add(ldapField);
                    foreach (Object myCollection in fields[ldapField])
                    {
                        listLdapValues.Add(myCollection);
                    }



                }
            }

程序将所有内容添加到列表中。但是,如果我返回此项,则无法在“CN”或“名称”上搜索列表。我只能找到有关索引号的信息。

希望你能帮助我。

2 个答案:

答案 0 :(得分:0)

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

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

// set up domain context
using (PrincipalContext ctx = new PrincipalContext(ContextType.Domain))
{
    // find a user
    UserPrincipal user = UserPrincipal.FindByIdentity(ctx, username);

    if(user != null)
    {
       // do something here....
       // the most often used attributes are available as nice, strongly-typed properties
       string value = user.GivenName;
       value = user.Surname;
       value = user.EmailAddress;
       value = user.VoiceTelephoneNumber;
    }
}

新的S.DS.AM让您可以轻松地与AD中的用户和群组一起玩!

答案 1 :(得分:0)

这是一种可以通过名称调用属性的方法。它还使用经过身份验证的帐户发出请求。

string domainPath = String.Format("LDAP://{0},DC=site,DC=com", domain);

using (DirectoryEntry searchRoot = new DirectoryEntry(domainPath))
{
    using (DirectorySearcher search = 
            filterSearch(new DirectorySearcher(searchRoot), username))
    {
        SearchResult result = null;

        try
        {
            result = search.FindOne();
        }
        catch (DirectoryServicesCOMException e)
        {
            //handle the error
        }

        if (result != null)
        {
            string givenname = result.Properties["givenname"].Count > 0 ? 
                    (string)result.Properties["givenname"][0] : "";

            string sn = result.Properties["sn"].Count > 0 ? 
                    (string)result.Properties["sn"][0] : "";

            var samaccount= result.Properties["samaccountname"].Count > 0 ? 
                    (string)result.Properties["samaccountname"][0] : "";

            var name = String.Format("{0}, {1}", sn, givenname);
            var email = result.Properties["mail"].Count > 0 ? 
                    (string)result.Properties["mail"][0] : "";
        }
    }
}

//Apply a filter to search only specific classes and categories.
//Add the specific properties to be retrieved

private DirectorySearcher filterSearch(DirectorySearcher search, string username)
{
    DirectorySearcher filteredSearch = search;

    filteredSearch.Filter = "(&(objectClass=user)(objectCategory=person)(samaccountname=" + username + "))";
    filteredSearch.PropertiesToLoad.Add("givenname");
    filteredSearch.PropertiesToLoad.Add("sn");
    filteredSearch.PropertiesToLoad.Add("samaccountname");
    filteredSearch.PropertiesToLoad.Add("department");
    filteredSearch.PropertiesToLoad.Add("physicalDeliveryOfficeName");
    filteredSearch.PropertiesToLoad.Add("mail");

    return filteredSearch;
}

如果要查找特定属性,这可能会有所帮助,但如果要检索所有属性/值的列表,请查看其他SO question

Google包含您可以使用的常用过滤器列表。仔细查看它们并适当修改filterSearch方法。