【问题标题】:How can I optimize my PowerShell - LDAP Query?如何优化我的 PowerShell - LDAP 查询?
【发布时间】:2011-03-05 14:34:48
【问题描述】:

我创建了一个脚本,该脚本从 CSV(或其他数据集,但不发布该数据集)读取并在我的 AD 环境中创建用户。

基本上,任何传入脚本的数据集都会被处理,如果用户不存在,则会创建一个用户。如果用户已经存在于 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."
  }
}

提前感谢您提供的任何帮助。

【问题讨论】:

    标签: powershell active-directory csv ldap adsi


    【解决方案1】:

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

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

    $usersOU 值是静态的,因此您可以将其取出,放在 import-csv 命令之前。

    【讨论】:

    • 这是一个非常有趣的想法——在 LDAP 级别进行处理,而不是查询 LDAP 响应,对吗?我会尽快在其中一个开发节点上实现它,并让你知道它是如何工作的。我还不想标记为答案——如果这能显着提高性能,我肯定会的。感谢您的建议!我不喜欢 PS 中的 ADSI 界面。或期间,甚至。
    • np :) 顺便说一句,Quest 有一套免费的 cmdlet 来管理您的广告,请查看:quest.com/powershell/activeroles-server.aspx
    最近更新 更多