【问题标题】:Powershell Bulk Find ActiveDirectory ObjectsPowershell 批量查找 ActiveDirectory 对象
【发布时间】:2012-04-30 20:36:02
【问题描述】:

我正在尝试开发一个 powershell 脚本来帮助管理 AD 组成员。我们有一些大型组(30k-60k+ 个对象),我们希望使用来自另一个系统的数据进行更新。

脚本从文本文件加载应该在组中的对象。然后每个对象都必须使用System.DirectoryServices.DirectorySearcher 定位在 AD 中。之后,每个对象都被添加到组成员中。

该脚本花费了大约 80% 的时间来查找每个对象,是否有使用 powershell 在 AD 中查找对象的批量方法?

谢谢!

【问题讨论】:

    标签: powershell active-directory adsi


    【解决方案1】:

    这是我在经验中发现的查询 AD 的快速方法,您需要更改查询以查找特定对象,在此代码中,您将在 $objRecordSet 中找到所有用户/人员对象。

    $Ads_Scope_SubTree = 2        
    $objConnection = new-Object  -com "ADODB.Connection"
    $objCommand = new-Object -com "ADODB.Command"
    
    $objConnection.Provider = "ADsDSOObject"
    $objConnection.Open( "Active Directory Provider")
    $objCommand.ActiveConnection = $objConnection
    
    $objCommand.Properties.Item("Page Size").value = 1000
    $objCommand.Properties.item("Searchscope").value = $Ads_Scope_SubTree 
    
    $objCommand.CommandText = "Select Name From 'LDAP://DC = int, DC= my, DC = local' Where objectCategory = 'Person'" 
    
    $objRecordSet = $objCommand.Execute()
    $objRecordSet.RecordCount
    

    更多info here

    【讨论】:

    • 浏览我的旧问题并注意到我从未接受过这个问题的答案。这大致就是我最终做的事情。
    【解决方案2】:

    您或许可以尝试System.DirectoryServices.Protocols (S.DS.P) 原生(非托管)版本非常有效。

    这是一个 PowerShell 启动脚本:

    # ADDP-Connect.PS1
    
    Clear-Host
    # Add the needed assemblies
    Add-Type -AssemblyName System.DirectoryServices.Protocols
    
    # Connexion
    $serverName = "WM2008R2ENT" 
    $ADDPConnect = New-Object System.DirectoryServices.Protocols.LdapConnection $serverName
    
    $userName = "JPB"
    $pwd = "PWD"
    $domain = "Dom"
    $ADDPConnect.Credential = New-Object system.Net.NetworkCredential -ArgumentList $userName,$pwd,$domain
    
    # Create a searcher
    $searchTargetOU = "dc=dom,dc=fr"
    $searchFilter = "(samAccountName=user1)"
    $searchScope = [System.DirectoryServices.Protocols.SearchScope]::Subtree
    $searchAttrList = $null
    
    foreach($user in "user1","user2","user3")
    {
      $searchFilter = "(samAccountName=$user)"
      $searchRequest = New-Object System.DirectoryServices.Protocols.SearchRequest -ArgumentList $searchTargetOU,$searchFilter,$searchScope,$searchAttrList
    
      $searchResponse = $ADDPConnect.SendRequest($searchRequest)
    
      foreach($searchEntries in $searchResponse.Entries)
      {
        $searchEntries.DistinguishedName
      }
    }
    

    【讨论】:

      【解决方案3】:

      如果您开始看到超时问题,请适当设置超时参数,如下所示

      $ADDPConnect = New-Object System.DirectoryServices.Protocols.LdapConnection $serverName
      $ADDPConnect.Timeout = "1000"
      

      【讨论】:

        【解决方案4】:

        如果您在执行期间发现超时问题,以下内容会有所帮助

        $ADDPConnect = New-Object System.DirectoryServices.Protocols.LdapConnection $serverName
        $ADDPConnect.Timeout = "1000"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-17
          • 1970-01-01
          • 2013-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多