5

ADグループのメンバーシップ管理に役立つPowerShellスクリプトを開発しようとしています。別のシステムからのデータで更新したい少数の大きなグループ(30k〜60k以上のオブジェクト)があります。

スクリプトは、グループ内にあるはずのオブジェクトをテキストファイルからロードします。次に、各オブジェクトは、を使用してADに配置する必要がありSystem.DirectoryServices.DirectorySearcherます。その後、各オブジェクトがグループメンバーシップに追加されます。

スクリプトはその時間の約80%を各オブジェクトの検索に費やしていますが、PowerShellを使用してAD内のオブジェクトを検索するための大規模な方法はありますか?

ありがとう!

4

4 に答える 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

詳細はこちら

于 2012-04-30T21:26:35.497 に答える
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
  }
}
于 2012-05-01T19:50:06.253 に答える
1

タイムアウトの問題が発生し始めた場合は、以下に示すようにタイムアウトパラメータを適切に設定してください

$ADDPConnect = New-Object System.DirectoryServices.Protocols.LdapConnection $serverName
$ADDPConnect.Timeout = "1000"
于 2012-06-19T16:02:29.863 に答える
0

実行中にタイムアウトの問題が発生した場合は、以下が役立ちます

$ADDPConnect = New-Object System.DirectoryServices.Protocols.LdapConnection $serverName
$ADDPConnect.Timeout = "1000"
于 2012-06-19T15:41:56.463 に答える