2012-04-30 14 views
5

私は、ADグループメンバシップ管理に役立つpowershellスクリプトを開発しようとしています。別のシステムからのデータで更新したい大規模なグループ(30k〜60k +オブジェクト)がいくつかあります。Powershell Bulk ActiveDirectoryオブジェクトを検索

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

スクリプトは各オブジェクトを検索する時間の80%を費やしますが、powershellを使用してADでオブジェクトを見つけるための方法がありますか?

ありがとうございます!

答えて

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 

もっとinfo here

+0

私の古いq私は決してこれに対する答えを受け入れなかったことに気づいた。これはおおよそ私がやったことです。 – klyd

1

あなたはおそらくSystem.DirectoryServices.Protocols (S.DS.P)ネイティブ(非管理)のバージョンが非常に効率的で試すことができます。以下

# 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 
    } 
} 
0

あなたが実行

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

中にタイムアウトの問題を参照してください場合は、タイムアウトの問題を見始める場合は、同様に適切なタイムアウトパラメータを設定することができます:ここで

は、PowerShellの起動スクリプトです以下に示す

$ADDPConnect = New-Object System.DirectoryServices.Protocols.LdapConnection $serverName 
$ADDPConnect.Timeout = "1000" 
関連する問題