将数据从LDAP绑定到asp.repeater控件

时间:2017-09-11 11:07:56

标签: c# asp.net

我有一个转发器控件,我希望用LDAP中的数据填充它。我可以连接到Active Directory,它将返回600多个名称的列表,但是当我尝试绑定数据时,它会返回以下消息:

System.DirectoryServices.SearchResult'不包含名称为'

的媒体资源

我也不想仅仅返回名称,而是发送电子邮件,电话,工作提示和其他一些字段。

我有办法做到这一点吗?

这是我的C#代码:

        private void GetAllUsers()
    {
        SearchResultCollection results;
        DirectorySearcher ds = null;
        DirectoryEntry de = new DirectoryEntry(GetCurrentDomainPath());
        ds = new DirectorySearcher(de);
        ds.PropertiesToLoad.Add("name");
        ds.Filter = "(&(objectCategory=User)(objectClass=person))";
        results = ds.FindAll();
        rptAD.DataSource = results;
        rptAD.DataBind();
        foreach (SearchResult sr in results)
        {
            Debug.WriteLine(sr.Properties["name"][0].ToString());
        }
    }

这是转发器的代码:

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
<div class="container">
    <h2>AD Users</h2>
    <asp:Repeater ID="rptAD" runat="server">
        <HeaderTemplate>
            <table class="table table-striped table-bordered">
                <tr>
                    <td>AD User</td>
                </tr>
        </HeaderTemplate>
        <ItemTemplate>
                <tr>
                    <td>
                        <%# DataBinder.Eval(Container.DataItem,"name") %>;
                    </td>
                </tr>
        </ItemTemplate>
        <FooterTemplate>
            </table>
        </FooterTemplate>
    </asp:Repeater>
</div>

1 个答案:

答案 0 :(得分:0)

我使用这个库已经有一段时间了,但我认为有些属性甚至都没有映射。无论如何,如果您只是想获取全名,请尝试使用属性[“displayName”]

Here链接到有关propertiesToLoad可用的属性的问题。其中一个答案包含属性列表的链接。列表很长,所以我没有检查,但我没有通过快速搜索找到它。

至于返回多个属性,只需像上面那样加载更多属性,就像上面那样:

ds.PropertiesToLoad.Add("sAMAccountName");
ds.PropertiesToLoad.Add("displayName");
ds.PropertiesToLoad.Add("userPrincipalName");
ds.PropertiesToLoad.Add("objectSid");

并以同样的方式获得他们的价值观:

sr.Properties["sAMAccountName"][0].ToString()
sr.Properties["displayName"][0].ToString()
sr.Properties["userPrincipalName"][0].ToString()
sr.Properties["objectSid"][0].ToString()

<强>替代

我建议尽管如此,如果可以,请开始使用System.Management.Automation库从AD获取任何内容。我改变了,因为你用powershell命令执行你的代码,这让我的生活更加简单。

using (var powerShell = PowerShell.Create())
            {
                var adUsersList = powerShell
                     .AddCommand("Get-ADUser")
                     .AddParameter("LDAPFilter", ldapQuery)
                     .AddParameter("Properties", new string[] { "EmailAddress", "LockedOut", "Created", "Modified" })
                     .Invoke();
            }