2

我设法使用 AD 进行 ASP.NET 身份验证工作。现在,我想在 AD 中查询一个 OU,并在 ASP.NET 页面中显示 ListView 或 GridView 的结果。

这是域控制器:dc.itlab.edu

OU:用户学生

在组织单位 (OU) UsersStudents 中有以下列:

名字、姓氏、Windows 2000 之前的登录名、名称、类型

我想查询 OU UsersStudents 中的 First Name、Last Name、Pre-Windows 2000 Logon Name 列,并将结果绑定到 ListView 或 GridView。

感谢您在 C# 或 VB.NET 中的建议。

4

3 回答 3

4

如果您使用的是 .NET 3.5,或者可以升级到它 - LDAP 的东西随着命名空间的引入而得到了极大的改进System.DirectoryServices.AccountManagement

它包含其他类,例如UserPrincipal,它提供了大多数常用的 LDAP 属性作为属性。使用PrincipalSearcher和 QBE(按示例查询),您可以非常轻松地找到您感兴趣的那些用户(或其他对象)并将它们绑定到 ASP.NET 网格视图。

要了解有关 .NET 3.5 新内容的更多信息,请阅读 MSDN 杂志上的这篇优秀文章:

在 .NET Framework 3.5 中管理目录安全主体 - 2008 年 1 月号

更新:使用 .NET 3.5 接口,您可以编写如下代码:

// define the content - domain name (second param) must be NetBIOS-style,
// third parameter is the container where to create the context for
PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "ITLAB", "OU=UsersStudents,DC=dc,DC=itlab,DC=edu");

// define your "prototype" for the searcher - here: you want to search for 
// users which have the .Enabled property set to true; you could define additional
// requirements here
UserPrincipal qbePrototype = new UserPrincipal(ctx);
qbePrototype.Enabled = true;

// create PrincipalSearcher based on that QBE prototype
PrincipalSearcher ps = new PrincipalSearcher(qbePrototype);

// find all matching Principals - in your case, those will be of type UserPrincipal
PrincipalSearchResult<Principal> results = ps.FindAll();

现在您应该能够将results直接绑定到 aDataGridView或其他东西,并为您正在寻找的列选择这些属性:

  • 名字 = UserPrincipal.GivenName
  • 姓氏 = UserPrincipal.Surname
  • Windows 2000 之前的登录名 = UserPrincipal.SamAccountName
  • 姓名 = 姓名
  • 类型 = ?? 你在这里是什么意思??
于 2010-10-25T15:51:18.213 回答
0

这里有一个 C# 示例,用于从 AD 填充 ASP.Net GridView

于 2010-10-25T15:42:20.073 回答
0

未测试** 这将为您指明正确的方向。应该非常接近您的需要。

    Dim MySearchRoot As DirectoryEntry = New DirectoryEntry("LDAP://domain/DC=..", "usr", "pwd")
    Dim MyDirectorySearcher As New DirectorySearcher(MySearchRoot)

    MyDirectorySearcher.Filter = ("(&(objectCategory=organizationalunit)(name=UsersStudents))")

    MyDirectorySearcher.SearchScope = SearchScope.Subtree
    MyDirectorySearcher.PropertiesToLoad.Add("First Name")
    MyDirectorySearcher.PropertiesToLoad.Add("Last Name")
    MyDirectorySearcher.PropertiesToLoad.Add("Pre-Windows 2000 Logon Name")
    MyDirectorySearcher.PropertiesToLoad.Add("Name")
    MyDirectorySearcher.PropertiesToLoad.Add("Type")
    MyDirectorySearcher.Sort.Direction = System.DirectoryServices.SortDirection.Ascending
    MyDirectorySearcher.Sort.PropertyName = "Name"

    Dim MySearchResult As SearchResultCollection = MyDirectorySearcher.FindAll()

    Dim myTable As New DataTable("Results")
    Dim colName As String

    For Each colName In MyDirectorySearcher.PropertiesToLoad
        myTable.Columns.Add(colName, GetType(System.String))
    Next

    Dim result As SearchResult

    For Each result In MySearchResult
        Dim dr As DataRow = myTable.NewRow()
        For Each colName In MyDirectorySearcher.PropertiesToLoad
            If result.Properties.Contains(colName) Then
                    dr(colName) = CStr(result.Properties(colName)(0))
                End If
            Else
                dr(colName) = ""
            End If
        Next
        myTable.Rows.Add(dr)
    Next

    gridview.datasource = myTable
    gridview.databind()
于 2010-10-25T15:47:14.617 回答