PowerShell批量查找ActiveDirectory对象

5
我正在尝试编写一个PowerShell脚本来帮助管理AD组成员。我们有一些大组(30k-60k+对象),我们想要从另一个系统更新这些组的数据。
该脚本从文本文件中加载应在组中的对象。然后,使用System.DirectoryServices.DirectorySearcher在AD中查找每个对象。之后,将每个对象添加到组成员中。
脚本花费了大约80%的时间查找每个对象,是否有批量方式使用PowerShell在AD中查找对象?
谢谢!
4个回答

3

根据我的经验,这是查询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

这里有更多的信息


翻看我的旧问题,发现我从未接受过这个问题的答案。这大致是我最终所做的。 - klyd

1
你可以尝试使用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
  }
}

1
如果您开始看到超时问题,请适当设置超时参数,如下所示。
$ADDPConnect = New-Object System.DirectoryServices.Protocols.LdapConnection $serverName
$ADDPConnect.Timeout = "1000"

0
如果您在执行过程中遇到超时问题,以下内容可能会有所帮助。
$ADDPConnect = New-Object System.DirectoryServices.Protocols.LdapConnection $serverName
$ADDPConnect.Timeout = "1000"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接