PDA

Показать полную графическую версию : Не работает импорт пользователей в AD из CSV-файла


Страниц : [1] 2

fcdm25
20-02-2014, 16:25
Здравствуйте, сегодня решил загрузить пользователей в AD из csv. В интернете нашел много примеров, но они почему то не запускаются на моем сервере и выдает ошибку


New-ADUser : Объект каталога не найден
C:\Users\Администратор\Desktop\script.ps1:18 знак:5
+ New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalNam ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (CN=\ \ ,OU=Цент...с,DC=edu,DC=guu:String) [New-ADUser], ADIdentityNotFoundException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.Act iveDirectory.Management.Commands.NewADUser

New-ADUser : Объект каталога не найден
C:\Users\Администратор\Desktop\script.ps1:18 знак:5
+ New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalNam ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (CN=\ \ ,OU=Цент...с,DC=edu,DC=guu:String) [New-ADUser], ADIdentityNotFoundException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.Act iveDirectory.Management.Commands.NewADUser

New-ADUser : Объект каталога не найден
C:\Users\Администратор\Desktop\script.ps1:18 знак:5
+ New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalNam ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (CN=\ \ ,OU=Цент...с,DC=edu,DC=guu:String) [New-ADUser], ADIdentityNotFoundException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.Act iveDirectory.Management.Commands.NewADUser


Скрипт


Import-Module ActiveDirectory
$Users = Import-Csv -Delimiter ";" -Path "C:\Users\Администратор\Desktop\user.csv"
foreach ($User in $Users)
{
if ($User.OU -eq "") #если OU пустая создаем в Others
{
$OU = "OU=Others,DC=edu,DC=guu"
}
else {
$OU = "OU=Центр новых информационных технологий (ЦНИТ), OU=Подразделения\, обеспечивающие учебный процесс" + $User.OU + ",DC=edu,DC=guu"
}
$Password = $User.Password
$Detailedname = $User.LastName + " " + $User.FirstName + " " + $User.MiddleName
$UserFirstname = $User.FirstName
$UserLastName = $User.LastName
$JobTitle = $User.JobTitle
$SAM= $User.Login + "@edu.guu"
New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalName $SAM -DisplayName $Detailedname -GivenName $User.FirstName -Surname $User.LastName -Title $JobTitle -AccountPassword (ConvertTo-SecureString -AsPlainText "P@ssword2" -Force) -Enabled $true -Path $OU
}


Так же во вложении есть пример нашего леса и csv файл (unicode).

Login,Password,LastName,FirstName,MiddleName,OU,JobTitle
user1,braY2sPe1,Иванов ,Антон,Анатольевич,Отдел телекоммуникационного обеспечения,Программист
user2,braY2sPe2,Петров,Антон,Алексеевич,Отдел телекоммуникационного обеспечения,Программист
user3,braY2sPe3,Сидоров,Антон,Олегович,Отдел телекоммуникационного обеспечения,Программист 1 категории

На DC включена функция обработки скриптов
Set-ExecutionPolicy Unrestricted
Загружен модуль
import-module activedirectory
Все данные введены через запятую. Пароль соответствует требованиям.
Кто может помочь с данной проблемой?

UPD0: Пробовал менять «;» на «,» результатов не принесло
UPD1:Заменил @password на "password"

Kazun
20-02-2014, 16:32
Сам скрипт полностью приведите.

fcdm25
20-02-2014, 16:36
Сам скрипт полностью приведите. »
Сам скрипт

Import-Module ActiveDirectory
$Users = Import-Csv -Delimiter ";" -Path "C:\Users\Администратор\Desktop\user.csv"
foreach ($User in $Users)
{
if ($User.OU -eq "") #если OU пустая создаем в Others
{
$OU = "OU=Others,DC=edu,DC=guu"
}
else {
$OU = "OU=Центр новых информационных технологий (ЦНИТ), OU=Подразделения\, обеспечивающие учебный процесс" + $User.OU + ",DC=edu,DC=guu"
}
$Password = $User.Password
$Detailedname = $User.LastName + " " + $User.FirstName + " " + $User.MiddleName
$UserFirstname = $User.FirstName
$UserLastName = $User.LastName
$JobTitle = $User.JobTitle
$SAM= $User.Login + "@edu.guu"
New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalName $SAM -DisplayName $Detailedname -GivenName $User.FirstName -Surname $User.LastName -Title $JobTitle -AccountPassword (ConvertTo-SecureString -AsPlainText "P@ssword2" -Force) -Enabled $true -Path $OU
}

Kazun
20-02-2014, 16:56
Покажите вывод: $Users[0]

fcdm25
20-02-2014, 17:06
Покажите вывод: $Users[0] »
New-ADUser : Объект каталога не найден
C:\Users\Администратор\Desktop\script.ps1:18 знак:5
+ New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalNam ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (CN=\ \ ,OU=Цент...с,DC=edu,DC=guu:String) [New-ADUser], ADIdentityNotFoundException
+ FullyQualifiedErrorId : ActiveDirectoryCmdlet:Microsoft.ActiveDirectory.Management.ADIdentityNotFoundException,Microsoft.Act iveDirectory.Management.Commands.NewADUser

Kazun
20-02-2014, 17:33
Заменить $OU,на:
$OU = "OU=$($User.OU),OU=Центр новых информационных технологий (ЦНИТ), OU=Подразделения\, обеспечивающие учебный процесс,OU=GUU,DC=edu,DC=guu"

fcdm25
20-02-2014, 17:38
Заменить $OU,на: »
Заменил выдал следующую ошибку
New-ADUser : Имя объекта имеет недопустимый синтаксис
C:\Users\Администратор\Desktop\script.ps1:18 знак:5
+ New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalNam ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (CN=\ \ ,OU=,OU=...U,DC=edu,DC=guu:String) [New-ADUser], ADException
+ FullyQualifiedErrorId : ActiveDirectoryServer:8335,Microsoft.ActiveDirectory.Management.Commands.NewADUser


Import-Module ActiveDirectory
$Users = Import-Csv -Delimiter ";" -Path "C:\Users\Администратор\Desktop\user.csv"
foreach ($User in $Users)
{
if ($User.OU -eq "") #если OU пустая создаем в Others
{
$OU = "OU=Others,DC=edu,DC=guu"
}
else {
$OU = "OU=$($User.OU),OU=Центр новых информационных технологий (ЦНИТ), OU=Подразделения\, обеспечивающие учебный процесс,OU=GUU,DC=edu,DC=guu"
}
$Password = $User.Password
$Detailedname = $User.LastName + " " + $User.FirstName + " " + $User.MiddleName
$UserFirstname = $User.FirstName
$UserLastName = $User.LastName
$JobTitle = $User.JobTitle
$SAM= $User.Login + "@edu.guu"
New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalName $SAM -DisplayName $Detailedname -GivenName $User.FirstName -Surname $User.LastName -Title $JobTitle -AccountPassword (ConvertTo-SecureString -AsPlainText "P@ssword2" -Force) -Enabled $true -Path $OU
}

Kazun
20-02-2014, 18:00
Вы привели файл, где разделитель запятая. Здесь же используется точка с запятой. Где правда?

Ps. Т.к. $User.OU -eq "" - Для объекта у которого нет свойства OU будет $false,а значение $User.OU пусто,то и путь формируется неправильный.

fcdm25
20-02-2014, 20:05
Kazun, большое спасибо. Скрипт заработал. Искренне Вам благодарен!!
Я бы хотел еще узнать можно ли как то дописать скрипт так, чтобы он проходил все ветки и сверял их с данными которые находятся в OU. Просто в интернете я не нашел поиска по лесу в AD
Просто проблема, что в файле CSV есть информация только о конечных подразделениях, а если их нет, то он отправлял бы пользователей в каталог Other

Kazun
20-02-2014, 23:17
Вопрос мне неясен,что конкретно требуется в итоге.

Для поиска в лесе - обращайтесь к глобальному каталогу по порту 3268-LDAP(3269 - LDAPS). Для поиска в глобальном каталоге используйте параметр -Server GC:3268,но следует учесть,что в GC реплицируется не все атрибуты.

Get-ADUser -Filter "Name -eq 'Test User'" -Server GC:3268

Просто проблема, что в файле CSV есть информация только о конечных подразделениях, а если их нет, то он отправлял бы пользователей в каталог Other - Ваш скрипт уже делает эту проверку if ($User.OU -eq ""),при условии,что свойство есть,а оно будет если Import-Csv корректно отрабатывает.

fcdm25
21-02-2014, 09:39
Kazun, как я понимаю строка
Get-ADUser -Filter "Name -eq 'Test User'" -Server GC:3268
отвечает за поиск по лесу AD?

Вопрос мне неясен,что конкретно требуется в итоге. »
Я хотел дописать скрипт, чтобы он проходил весь "лес" AD до последнего "листа".


Например

Поиск по всем вложениям каталога GUU
Если ("отдел сопровождения асу" из AD == "отдел сопровождения асу" из csv) то
данные из CSV записываются в этот каталог.
иначе пользователи попадают в other

Kazun
21-02-2014, 09:45
отвечает за поиск по лесу AD? - За поиск в Global Catalog

Если лес состоит из одного домена, то:

# Получим все имена OU в GUU
$allou = Get-ADOrganizationalUnit -Filter * -SearchBase "OU=GUU,DC=edu,DC=guu" | Foreach {$_.Name}


и останется изменить строку:

if ($allou -notcontains $User.OU)
{
$OU = "OU=Others,DC=edu,DC=guu"
}

fcdm25
21-02-2014, 10:00
Kazun, спасибо.
У меня получился вот такой скрипт
Import-Module ActiveDirectory
$Users = Import-Csv -Delimiter ";" -Path "C:\Users\Администратор\Desktop\user.csv"
foreach ($User in $Users)
{
if ($allou = Get-ADOrganizationalUnit -Filter * -SearchBase "OU=GUU,DC=edu,DC=guu")
{
$OU = "OU=Others,DC=edu,DC=guu"
}
$Password = $User.Password
$Detailedname = $User.LastName + " " + $User.FirstName + " " + $User.MiddleName
$UserFirstname = $User.FirstName
$UserLastName = $User.LastName
$JobTitle = $User.JobTitle
$SAM= $User.Login + "@edu.guu"
New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalName $SAM -DisplayName $Detailedname -GivenName $User.FirstName -Surname $User.LastName -Title $JobTitle -AccountPassword (ConvertTo-SecureString -AsPlainText "P@ssword2" -Force) -Enabled $true -Path $OU
}

Kazun
21-02-2014, 10:20
Import-Module ActiveDirectory
$Users = Import-Csv -Delimiter ";" -Path "C:\Users\Администратор\Desktop\user.csv"
$allou = Get-ADOrganizationalUnit -Filter * -SearchBase "OU=GUU,DC=edu,DC=guu"
foreach ($User in $Users)
{
$ou = $allou | Where {$_.Name -eq $User.OU}

if ($ou) {
$OU = $ou.DistinguishedName
}
else {
$OU = "OU=Others,DC=edu,DC=guu"
}

$Password = $User.Password
$Detailedname = $User.LastName + " " + $User.FirstName + " " + $User.MiddleName
$UserFirstname = $User.FirstName
$UserLastName = $User.LastName
$JobTitle = $User.JobTitle
$SAM= $User.Login + "@edu.guu"
New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalName $SAM -DisplayName $Detailedname -GivenName $User.FirstName -Surname $User.LastName -Title $JobTitle -AccountPassword (ConvertTo-SecureString -AsPlainText "P@ssword2" -Force) -Enabled $true -Path $OU
}

fcdm25
21-02-2014, 12:12
Kazun, большое Вам спасибо. У меня остался последний вопрос это возмодно ли сдлеать так, чтобы если каталога нет, то он отправлял бы пользователя в каталог Other. Верно ли мое исправление
Import-Module ActiveDirectory
$Users = Import-Csv -Delimiter ";" -Path "C:\Users\Администратор\Desktop\user.csv"
$allou = Get-ADOrganizationalUnit -Filter * -SearchBase "OU=GUU,DC=edu,DC=guu"
foreach ($User in $Users)
{
$ou = $allou | Where {$_.Name -eq $User.OU}

if ($ou) {
$OU = $ou.DistinguishedName
}
else ($ou){
$OU = "OU=Others,DC=edu,DC=guu"
}

$Password = $User.Password
$Detailedname = $User.LastName + " " + $User.FirstName + " " + $User.MiddleName
$UserFirstname = $User.FirstName
$UserLastName = $User.LastName
$JobTitle = $User.JobTitle
$SAM= $User.Login + "@edu.guu"
New-ADUser -Name $Detailedname -SamAccountName $User.Login -UserPrincipalName $SAM -DisplayName $Detailedname -GivenName $User.FirstName -Surname $User.LastName -Title $JobTitle -AccountPassword (ConvertTo-SecureString -AsPlainText "P@ssword2" -Force) -Enabled $true -Path $OU
}
Так же хотел у Вас узнать как у специалиста PowerShell какой курс лучше всего подходит начинающему администратору для автоматизации. Мне показалось, что курс M6434 больше всего для этого подходит

Kazun
21-02-2014, 13:39
1) Заменить else ($ou){ на else { - и будет работать
2) Я никогда не был на курсах, так что не могу ничего сказать о них.

fcdm25
21-02-2014, 14:01
Заменить else ($ou){ на else { - и будет работать »
Я пробовал так делать, тогда он пишет "каталог не найден".
Я никогда не был на курсах, так что не могу ничего сказать о них. »
Спасибо, я сейчас начал читать книгу "Введение в технологии языка сценариев для пользователей без базовых знаний". Просто первый раз столкнулся с PS, язык очень интересный и как я понимаю в дальнейшем MS планирует все продукты заточить под него

Iska
21-02-2014, 14:43
и как я понимаю в дальнейшем MS планирует все продукты заточить под него »
Нет, все — не планирует ;).

fcdm25
21-02-2014, 14:51
Iska, я просто смотрю в System Center, Windows Server, SQL Server в PS достаточно плотно интегрирован.

Iska
21-02-2014, 14:58
Ну, есть ещё Microsoft Office, вряд ли кто-то будет менять в нём VBA на PowerShell ;).

По поводу же остального добра — то не «продукты затачиваются под PowerShell», а на PowerShell создаётся ряд командлетов, облегчающих работу с теми или иными продуктами. Впрочем, ничто не мешает пользовать в PowerShell вместо командлетов старый добрый Automation или непосредственно WinAPI.




© OSzone.net 2001-2012