2010-06-18 2 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

Попробуйте статический 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 ,

+0

Это очень интересная идея: процессы на уровне LDAP вместо запроса на ответ LDAP, правильно? Я реализую его как можно скорее на одном из узлов dev и дам вам знать, как это работает. Я не хочу отмечать как ответ еще - если это значительно улучшит производительность, я определенно буду. Благодарим за предложение! Мне не нравится интерфейс ADSI в PS. Или период, даже. – buzzedword

+0

np :) BTW, Quest имеет бесплатный набор командлетов для управления вашим AD, проверьте его: http://www.quest.com/powershell/activeroles-server.aspx –

+0

Это сработало для меня отлично. Благодаря! – buzzedword

Смежные вопросы