以下代码应该在活动目录中的所有用户中运行,并找到特定组中的每个人。 一旦获得用户,它将把他们添加到数据表中,该数据表将成为最终导出到Excel的gridview的源。

但是,在运行和逐步执行时,我注意到它在没有组的某个用户上停止了。 我尝试添加条件语句以跳过该实例,但是它不起作用,当找到没有组的用户时,代码仍然停止运行。

有人可以告诉我我可以做些什么吗? 警告:这是我继承的一个旧站点,对活动目录知之甚少,并且还是vb编码的新手。

Dim entry As DirectoryEntry = New DirectoryEntry("LDAP://DOMAIN.EDU", "USERNAME", "PASSWORD", AuthenticationTypes.Secure)
    Dim search As DirectorySearcher = New DirectorySearcher(entry) With {
        .Filter = "(&(objectCategory=User)(objectClass=person))",
        .PageSize = 4000
    }
    search.PropertiesToLoad.Add("userPrincipalName").ToString
    search.PropertiesToLoad.Add("name").ToString
    Dim mySearchResultColl As SearchResultCollection = search.FindAll
    Dim results As DataTable = New DataTable
    results.Columns.Add("User ID")        
    results.Columns.Add("Full Name")
    Dim CurrRow = 0

    For Each sr As SearchResult In mySearchResultColl

        Dim dr As DataRow = results.NewRow
        Dim de As DirectoryEntry = sr.GetDirectoryEntry
        !!!! line below is the problem !!!!
        If de.Properties("memberOf") IsNot Nothing AndAlso de.Properties("memberOf").Value.ToString = "CN=MYGROUP,OU=Security Groups,OU=Students,DC=DOMAIN,DC=edu" Then 
            dr("User ID") = de.Properties("userPrincipalName").Value           
            dr("Full Name") = de.Properties("name").Value
            results.Rows.Add(dr)
            de.Close
        End If
    Next

    gvNot.DataSource = results
    gvNot.DataBind()
    gvNot.Visible = True
    gvAgreed.Visible = False
    ExportToExcel("notagreed", gvNot)

#1楼 票数:1 已采纳

我不确定“停下来”是什么意思,但是您可以更改此设置,使其表现更好,并解决所有问题。

  1. 因为您必须检查域中的每个用户,所以此循环将永远花费。 如果只希望特定组中的用户,则可以通过仅询问该组的成员来加快速度。 为此,您可以在查询中为memberOf属性添加条件。 这样,您只会得到自己关心的结果。

(请注意,如果您的林中有多个域,则使用memberOf来查找成员可能无法按您想要的方式工作。我在此处写道。但是,如果您只有一个域,那就可以了。)

  1. 在循环中,不要为每个结果创建DirectoryEntry ,因为这将迫使它返回AD并再次请求对象的属性,即使您已经在搜索结果中找到了所需的内容。 因此,请改用SearchResult对象中的值。

  2. SearchResultCollection文档说:

由于实现限制,当进行垃圾回收时,SearchResultCollection类无法释放其所有非托管资源。 为防止内存泄漏,当不再需要SearchResultCollection对象时,必须调用Dispose方法。

因此,您应该将其放在Using子句中。

  1. 我也不确定为什么不使用返回值时为什么要在PropertiesToLoad.Add上调用ToString 您可以删除它。

这就是全部:

Dim entry As DirectoryEntry = New DirectoryEntry("LDAP://DOMAIN.EDU", "USERNAME", "PASSWORD", AuthenticationTypes.Secure)
Dim search As DirectorySearcher = New DirectorySearcher(entry) With {
    .Filter = "(&(objectCategory=User)(objectClass=person)(memberOf=CN=MYGROUP,OU=Security Groups,OU=Students,DC=DOMAIN,DC=edu))",
    .PageSize = 4000
}
search.PropertiesToLoad.Add("userPrincipalName")
search.PropertiesToLoad.Add("name")

Dim results As DataTable = New DataTable
results.Columns.Add("User ID")        
results.Columns.Add("Full Name")
Dim CurrRow = 0

Using mySearchResultColl As SearchResultCollection = search.FindAll
    For Each sr As SearchResult In mySearchResultColl

        Dim dr As DataRow = results.NewRow
        dr("User ID") = sr.Properties("userPrincipalName")(0)
        dr("Full Name") = sr.Properties("name")(0)
        results.Rows.Add(dr)
    Next
End Using

gvNot.DataSource = results
gvNot.DataBind()
gvNot.Visible = True
gvAgreed.Visible = False
ExportToExcel("notagreed", gvNot)

我在任何地方都没有看到您使用CurrRow ,但是我留给了它,以防您在此处未显示的其他代码中使用它。

#2楼 票数:0

尝试将String.Equals函数与StringComparer.OrdinalIgnoreCase参数一起使用,而不要使用equals运算符。 另外,您遇到的错误是什么?

  ask by Jamie translate from so

未解决问题?本站智能推荐:

2回复

当我使用DirectoryServices的“成员”属性时,“域用户”组为空

我正在使用以下代码来获取我域中的组成员: 我的问题是,当 GroupDN(组的专有名称)是“ CN=Domain Users,CN=Users,DC=Mydomain,DC=local ”时,For...Each 循环不执行,当我检查手动属性语句,它的计数为零。 这似乎适用于我域中的所有其他组,但“
2回复

使用VB.NET检索用户信息并检查活动目录中组的成员

我正在使用以下代码,用于将用户登录到针对活动目录的VB.NET内置的应用程序。 这段代码效果很好,但我需要检索用户的名字,姓氏,显示名称,还要检查用户是否属于某个组。 我尝试了很多形式的adResults.Property(“displayname”)。ToString()之类的东西但是
5回复

查找用户是否是ActiveDirectory组ASP.NETVB的成员?

我正在使用 Active Directory 对 Intranet 站点的用户进行身份验证。 我想根据他们在 Active Directory 中所在的组来优化经过身份验证的用户。 有人可以向我展示或指出有关如何在 ASP.NET 4.0 (VB) 中查找用户所在组的说明吗?
2回复

从以组名开头的组中删除ActiveDirectory用户

我在尝试克服VB.net中的问题时遇到了麻烦。 我要实现的是从所有以“ Google”开头的组中删除一个特定的AD用户。 如果我知道该小组的全名,那么这很简单,我可以执行以下操作: 但是问题是我的应用程序并不总是知道需要从哪个特定组中删除用户。 有28个不同的组,每个组有数千个用户,
2回复

如何获取属于ActiveDirectory中组的用户?

我有一个下拉列表,我试图填写属于Active Directory中某个组的用户。 组名是OverRiders,8人是该组的成员。 可以添加更多成员。 我有以下下拉列表,但我运行代码,下拉列表是空白。 我究竟做错了什么? 请看代码: 我已经能够确认该组确实存在且组名称有效。
1回复

如何知道广告组是否是其他广告组的成员。(VB.net)

我试图在此示例中获得与IsInRole类似的结果: 但是我需要对组执行此操作,在这种情况下,MyPrincipal.IsInRole将不起作用(我认为这仅适用于用户帐户),并且之前从未尝试过对组进行操作,因此甚至不知道从哪里开始。 有人可以帮忙吗?
2回复

在VB.NET中查询LDAP。我有用户帐户,我想要一个用户所在的组列表

我知道SAMAccountName,现在想要填充一个组列表,其中的条目反映了整个目录中该用户的组成员身份。 这是我的开始,但我很难过: 我不知道如何遍历这个。 请问,有什么指针吗?
1回复

使用DirectoryServices将成员添加到组

我使用DirectoryServices在Active Directory中创建一个组。 资料来源: msdn 这很完美。 现在,我想将现有用户添加为该组的成员。 (如descripted 这里 ) 所以我加了 如果我现在运行脚本,它将在CommitChanges()处停止