2010-06-18 40 views
4

嘿家伙,这一个是在那里为PS大师。我创建了一个脚本,可以从CSV(或其他数据集)中读取脚本,但不会发布该方面,并在我的AD环境中创建用户。如何优化我的PowerShell - LDAP查询?

基本上,无论传递到脚本中的数据集都将被处理,然后如果用户不存在,则会创建一个用户。如果用户已经存在于AD中,则该脚本跳过该条目。这是一个CREATE唯一的脚本。

这很慢,我想在保持功能的同时提高性能。你可以给我任何关于如何让这个表现更好的提示吗?

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." 
    } 
} 

非常感谢您提供任何帮助。

回答

4

尝试静态是否存在()方法来查找该用户是否存在于学生OU:

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

的$ usersOU值是静态的,所以你可以把它拿出来,进口-CSV命令之前将其。

+0

这是一个非常有趣的想法 - 在LDAP级别上处理,而不是查询LDAP响应,对吗?我会尽快在其中一个开发节点上实现它,并让你知道它是如何工作的。我不想标记为答案 - 如果这显着提高了表现,我肯定会。 谢谢你的建议!我不喜欢PS中的ADSI接口。或者期间,甚至。 – buzzedword 2010-06-19 05:22:24

+0

np :)顺便说一句,Quest有一套免费的cmdlet来管理你的广告,检查出来:http://www.quest.com/powershell/activeroles-server.aspx – 2010-06-19 09:44:43

+0

这对我来说工作得很好。谢谢! – buzzedword 2010-06-21 13:55:23