2012-04-30 11 views
5

Ich versuche ein Powershell-Skript zu entwickeln, das bei der Verwaltung von AD-Gruppenmitgliedschaften hilft. Wir haben eine Handvoll großer Gruppen (30k-60k + Objekte), die wir mit Daten von einem anderen System aktualisieren wollen.Powershell Bulk Suche nach ActiveDirectory-Objekten

Das Skript lädt die Objekte, die in der Gruppe sein sollen, aus einer Textdatei. Jedes Objekt muss dann in AD unter Verwendung einer System.DirectoryServices.DirectorySearcher lokalisiert werden. Danach wird jedes Objekt der Gruppenmitgliedschaft hinzugefügt.

Das Skript verbringt etwa 80% seiner Zeit damit, jedes Objekt nachzuschauen. Gibt es einen Massenweg, um Objekte in AD mit Powershell zu finden?

Danke!

Antwort

3

Dies ist die schnelle Möglichkeit, AD abzufragen, die ich in meiner Erfahrung gefunden habe, müssen Sie die Abfrage ändern, um bestimmte Objekte zu finden, in diesem Code finden Sie alle Benutzer/Person Objekt in $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 

Mehr info here

+0

Blick durch meine alten q Und ich bemerkte, dass ich niemals eine Antwort auf diese Frage akzeptierte. Das ist ungefähr das, was ich getan habe. – klyd

1

vielleicht können Sie versuchen, System.DirectoryServices.Protocols (S.DS.P) die nativen (nicht verwaltet) Version ist sehr effizient.

Hier ist ein Powershell-Startskript:

# 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

Die unten helfen können, wenn Sie

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

während der Ausführung Timeout Probleme sehen Wenn Sie Timeout sehen Probleme beginnen stellen Sie dann den Timeout-Parameter passend wie siehe unten

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