ASP.NET LDAP SearchResults返回Byte Array的属性

时间:2017-03-07 23:13:41

标签: c# asp.net active-directory ldap

我正在使用DirectorySearcher尝试获取AD中的用户列表以将其与我的应用程序同步并从各种SO源复制代码,但是我没有获得任何属性值。我正在使用以下代码:

        DirectorySearcher search = new DirectorySearcher();
        SearchResultCollection results = null;
        string sDefaultOU = "LDAP://...";
        DirectoryEntry de = new DirectoryEntry(sDefaultOU);
        string userName = "DonaldDuck";
        search = new DirectorySearcher
        {
            SearchRoot = de,
            PropertiesToLoad = { "displayname", "sAMAccountName"}, 
            Filter = "(sAMAccountName=" + userName + ")"    
        };
        results = search.FindAll();

        foreach (SearchResult result in results)
        {
            String name; 
            if (result.Properties["sAMAccountName"].Count > 0)
            {
                name = result.Properties["sAMAccountName"][0].ToString();
            }    
        }

但是,不是名称等于“DonaldDuck”,而是“Byte [10]”或Byte [x],其中x是长度。

任何人都可以看到我做错了什么。

如果我添加一个过滤器,它会返回一个用户,所以我很确定代码在搜索方面是有效的

2 个答案:

答案 0 :(得分:3)

显然,其他人已经面临这个问题:LDAP DirectoryEntry SearchResult returns data differently in Windows 8 than Win7

AD正在使用LDAPv3使用UTF8对值进行编码,上面链接中提到的解决方案可能适合您:

if (result.Properties["sAMAccountName"][0].GetType().IsArray)
{
    name = System.Text.Encoding.UTF8.GetString((byte[])result.Properties["sAMAccountName"][0]);
}
else
{
    name = result.Properties["sAMAccountName"][0].ToString();
}

答案 1 :(得分:1)

而不是

foreach (SearchResult result in results)
    {
        String name; 
        if (result.Properties["sAMAccountName"].Count > 0)
        {
            name = result.Properties["sAMAccountName"][0].ToString();
        }    
    }

尝试

foreach (SearchResult result in results)
    {
        String name; 
        if (result.Properties["sAMAccountName"].Count > 0)
        {
            var thisDE=result.GetDirectoryEntry();
            name = thisDE.Properties["sAMAccountName"].Value.ToString();
        }    
    }

编辑:示例 我使用这个帮助方法来搜索我的域(当userDomainAndName =“DOMAIN \ UserName”时),但你应该可以根据需要调整它。

 public static DirectoryEntry GetUserDirectoryEntryFromCurrentDomain(string userDomainAndName)
    {
        var Split = userDomainAndName.Split(@"\\".ToCharArray());

        var DomainNetBiosNAme = Split[0];
        var UserName = Split[1];

        var QueryString = $"(&(objectCategory=person)(objectClass=user)(sAMAccountName={UserName}))";

        DirectoryEntry rootDSE = GetDirectoryObject(
            "LDAP://" + DomainNetBiosNAme + "/rootDSE");

        string domain = "LDAP://" + (string)rootDSE.Properties[
            "defaultNamingContext"][0];

        var Searcher = new DirectorySearcher(new DirectoryEntry(domain), QueryString);
        var Result = Searcher.FindOne();

        var tReturn = Result.GetDirectoryEntry();
        return tReturn; 

    }

然后获取我的用户PrimarySMTP地址(例如)..

var TheUsersDirectoryEntry=GetUserDirectoryEntryFromCurrentDomain(userDomainAndName);
var TheUsersPrimarySMTP=TheUsersDirectoryEntry.Properties["mail"].Value.ToString();