返回字节数组的 ASP.NET LDAP SearchResults 属性

gra*_*son 1 c# asp.net ldap active-directory

我正在使用 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();
            }    
        }
Run Code Online (Sandbox Code Playgroud)

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

谁能看到我做错了什么。

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

Stf*_*Bln 5

显然其他人也遇到过这个问题:LDAP DirectoryEntry SearchResult 在 Windows 8 中返回的数据与 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();
}
Run Code Online (Sandbox Code Playgroud)