2010-06-18 4 views
4

Hé les gars, celui-ci est là pour les gourous PS. J'ai créé un script qui lit à partir d'un fichier CSV (ou d'un autre ensemble de données, mais sans afficher ce côté) et crée des utilisateurs dans mon environnement AD. Fondamentalement, quel que soit le jeu de données passé dans le script sera traité, puis un utilisateur sera créé si elles n'existent pas. Si l'utilisateur existe déjà dans l'AD, le script ignore l'entrée. C'est un script CREATE uniquement.Comment puis-je optimiser ma requête PowerShell - LDAP?

C'est assez lent, et j'aimerais améliorer les performances tout en gardant la fonctionnalité. Pouvez-vous me donner des conseils sur la façon dont je peux améliorer cette performance?

import-csv "c:\PSScripts\LDAP\ADMigrate.csv" | ForEach-Object { 

# Define the User OU 
$usersOU = [ADSI] "LDAP://ou=Students, dc=live,dc=tcicollege,dc=edu" 

# Check for existing users 
$existingUsers = ($usersOU.psbase.children | Where-Object {$_.psBase.schemaClassName -eq "User"} | Select-Object -expand Name) 
$userQuery = $existingUsers -contains $_.'AccountName' 
if ($userQuery) { 
    echo $_.'AccountName' " already exists in Directory." 
} else { 

    # Create a new user 
    $newUser = $usersOU.create("user","cn=" + $_.'AccountName') 

    # Set Account AttributesAMAccountName 
    $newUser.Put("sAMAccountName", $_.'AccountName') 
    $newUser.Put("givenName", $_.'FirstName') 
    $newUser.Put("employeeID", $_.'StudentID') 
    $newUser.Put("sn", $_.'LastName') 
    $newUser.Put("department", $_.'Department') 
    $newUser.Put("company", $_.'SyStudentID') 
    $newUser.Put("UserPrincipalName", $_.'AccountName' + "@live.tcicollege.edu") 
    $newUser.Put("mail", $_.'AccountName' + "@live.tcicollege.edu") 
    $newUser.Put("displayName", $_.'LastName' + "," + " " + $_.'FirstName') 

    # First Commit 
    $newUser.SetInfo() 
    $newUser.userAccountControl="66048" 
    $newUser.Put("pwdLastset", -1) 
    $newUser.SetPassword($_.'Password') 

    # Final Commit 
    $newUser.SetInfo() 
    echo $_.'AccountName' " created successfully." 
    } 
} 

Merci d'avance pour toute aide que vous pouvez offrir.

Répondre

4

Essayez la méthode statique exists() pour trouver si l'utilisateur existe chez les élèves OU:

$user = [ADSI]::Exists("LDAP://cn=$($_.AccountName),ou=Students, dc=live,dc=tcicollege,dc=edu") 
if(!$user) 
{  
    "create code goes here" 
} 

La valeur usersOU $ est statique afin que vous puissiez le sortir, le placer avant la commande import-csv .

+0

C'est une idée très intéressante - qui traite au niveau LDAP, au lieu d'interroger la réponse LDAP, n'est-ce pas? Je l'implémenterai dès que possible sur l'un des nœuds de développement et je vous ferai savoir comment cela fonctionne. Je ne veux pas marquer comme réponse encore-- si cela améliore considérablement la performance, je le ferai certainement. Merci pour cette suggestion! Je n'aime pas l'interface ADSI dans PS. Ou période, même. – buzzedword

+0

np :) BTW, Quest a un ensemble gratuit de cmdlets pour gérer votre AD, consultez-le: http://www.quest.com/powershell/activeroles-server.aspx –

+0

Cela a très bien fonctionné pour moi. Merci! – buzzedword