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

C# 返回有关找到的用户Active Directory的信息,c#,active-directory,directoryservices,C#,Active Directory,Directoryservices,我正在制作一个活动的直接管理工具,但我在使某些东西正常工作方面遇到了困难。 我创建了一个类,希望在其中查找特定用户并返回其信息(名称、全名、CN等)。我可以找到所有这些信息,但当我不知道从我的类返回所有值的最佳方法时 以下是我目前使用的代码: DirectorySearcher search = new DirectorySearcher(ldapConnectie); search.Filter = "(cn=" + username + ")"; SearchResult result =

我正在制作一个活动的直接管理工具,但我在使某些东西正常工作方面遇到了困难。 我创建了一个类,希望在其中查找特定用户并返回其信息(名称、全名、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);
                    }



                }
            }
DirectorySearcher search=新的DirectorySearcher(ldapConnectie);
search.Filter=“(cn=“+username+””);
SearchResult=search.FindOne();
如果(结果!=null)
{
List listLdapFields=新列表();
List listLdapValues=新列表();
ResultPropertyCollection字段=result.Properties;
foreach(fields.PropertyNames中的字符串ldapField)
{
listLdapFields.Add(ldapField);
foreach(字段[ldapField]中的对象myCollection)
{
listLdapValues.Add(myCollection);
}
}
}
程序将所有内容都很好地添加到列表中。但是如果我返回这个,我就无法在“CN”或“Name”上搜索列表。我只能找到索引号上的信息


希望你能帮助我

如果您使用的是.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使得在广告中与用户和群组进行互动变得非常容易

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

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;
}
如果要查找特定属性,这可能会有所帮助,但如果要检索所有属性/值的列表,请查看另一个

有一个可以使用的常用筛选器列表。查看它们并适当修改filterSearch方法