2012-04-30 9 views
5

Estoy tratando de desarrollar un script de powershell para ayudar con la gestión de membresía de AD Group. Tenemos un puñado de grupos grandes (30k-60k + objetos) que queremos actualizar con datos de otro sistema.Powershell Bulk Find ActiveDirectory Objetos

La secuencia de comandos carga los objetos que deberían estar en el grupo de un archivo de texto. Cada objeto tiene que ubicarse en AD usando un System.DirectoryServices.DirectorySearcher. Después de eso, cada objeto se agrega a la membresía del grupo.

La secuencia de comandos dedica aproximadamente el 80% de su tiempo a buscar cada objeto, ¿hay una forma masiva de encontrar objetos en AD con powershell?

Gracias!

Respuesta

3

Esta es la manera más rápida de consultar AD que encontré en mi experiencia, necesita cambiar la consulta para encontrar objetos específicos, en este código encontrará todos los objetos de usuario/persona en $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 

Más info here

+0

Mirando a través de mi viejo q uestions y noté que nunca acepté una respuesta para este. Esto es más o menos lo que terminé haciendo. – klyd

1

Usted tal vez puede intentar System.DirectoryServices.Protocols (S.DS.P) la forma nativa (no administrado) versión es bastante eficiente.

Aquí es un script que comiencen 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 
    } 
} 
0

La continuación pueden ayudar si usted ve los problemas de tiempo de espera durante la ejecución

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

Si se empiezan a ver los problemas de tiempo de espera a continuación, establecer el parámetro de tiempo de espera apropiada como se muestra a continuación

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