Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Не работает импорт пользователей в AD из CSV-файла

Ответить
Настройки темы
PowerShell - Не работает импорт пользователей в AD из CSV-файла

Новый участник


Сообщения: 31
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: fcdm25
Дата: 21-02-2014
Вложения
Тип файла: zip file.zip
(26.3 Kb, 10 просмотров)
Здравствуйте, сегодня решил загрузить пользователей в 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.ActiveDirectory.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.ActiveDirectory.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.ActiveDirectory.Management.Commands.NewADUser

Скрипт
Скрипт PS

Код: Выделить весь код
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).
csv-файл

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"

Отправлено: 16:25, 20-02-2014

 

Новый участник


Сообщения: 31
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо за помощь Kazun`у! Скрипт отлично работает!
Конечный скрипт
Код: Выделить весь код
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,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
}
Заголовок csv файла
Код: Выделить весь код
Login,Password,LastName,FirstName,MiddleName,OU,JobTitle

Отправлено: 17:56, 21-02-2014 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Kazun, помоги пожалуйста

Скрипт ps1:
читать дальше »
Код: Выделить весь код
function Select-FileDialog 
{
	param([string]$Title,[string]$Directory,[string]$Filter="CSV Files (*.csv)|*.csv")
	[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
	$objForm = New-Object System.Windows.Forms.OpenFileDialog
	$objForm.InitialDirectory = $Directory
	$objForm.Filter = $Filter
	$objForm.Title = $Title
	$objForm.ShowHelp = $true
	
	$Show = $objForm.ShowDialog()
	
	If ($Show -eq "OK")
	{
		Return $objForm.FileName
	}
	Else
	{
		Exit
	}
}

$FileName = Select-FileDialog -Title "Import an CSV file" -Directory "c:\"

$domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain()
$DomainDN = (([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Domains | ? {$_.Name -eq $domain}).GetDirectoryEntry().distinguishedName
$final = "LDAP://$DomainDN"
$DomainPath = [ADSI]"$final"

$UsersCSV = Import-Csv $FileName -Delimiter ";"

Foreach ($User in $UsersCSV)
{
	
    Write-Host "Creating User: $User.SamAccountName"

    $password = ConvertTo-SecureString $User.AccountPassword -AsPlainText -Force

    $Enable = $false
    If ($User.Enabled -eq "True")
    {
      $Enable = $true
    }

    $CPaL = $false
    If ($User.ChangePasswordAtLogon -eq "True")
    {
      $CPaL = $true
    }

    if ($User.AccountExpirationDate -eq "0")
    {
        $AED = $null
    }

    $UPN = $User.SamAccountName+'@'+$domain

    $userinfo = @{
    DisplayName = "$User.DisplayName"
    SamAccountName = "$User.SamAccountName"
    GivenName = "$User.GivenName"
    Name = "$User.Nume"
    Surname = "$User.Surname"
    UserPrincipalName = $UPN
    AccountExpirationDate = $AED
    Enabled = $Enable
    ChangePasswordAtLogon = $CPaL
    AccountPassword = $password
    Path = "$User.Path"+','+$DomainPath
    Country = "$User.Country"
    City = "$User.City"
    Company = "$User.Company"
    Organization = "$User.Organization"
    Department = "$User.Department"
    Division = "$User.Division"
    Description = "$User.Description"
    }


    New-ADUser @userinfo

}
Write-Host "Script Completed"


Заголовок CSV файла:
читать дальше »
Код: Выделить весь код
DisplayName;SamAccountName;GivenName;Name;Surname;AccountExpirationDate;Enabled;ChangePasswordAtLogon;AccountPassword;Path;Country;City;Company;Organization;Department;Division;Description


Получаю ошибку:
читать дальше »
Код: Выделить весь код
New-ADUser : The object name has bad syntax
At New-Users.ps1:117 char:5
+     New-ADUser @userinfo
+     ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (CN=@{DisplayNam....DirectoryEntry:String) [New-ADUser], ADException
    + FullyQualifiedErrorId : ActiveDirectoryServer:8335,Microsoft.ActiveDirectory.Management.Commands.NewADUser
 
Script Completed


Уже второй день с ним мучаюсь...
В сети не нашел инфу чтоб помогала.

Спвсибо.

Отправлено: 18:13, 17-09-2014 | #22


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


andysc, Вы неправильно передаете параметры:
1) "$User.DisplayName" - Либо убрать кавычки
2) "$User.DisplayName" - Либо обернуть в скобки "$($User.DisplayName)"

Пример:
Код: Выделить весь код
PS >  $user

displayname
-----------
Sasha

PS >  "$user.displayname"   - Когда в кавычках, значение преобразуется в хэш.
@{displayname=Sasha}.displayname

PS >  $user.displayname
Sasha
PS >  "$($user.displayname)"
Sasha
Код: Выделить весь код
    $userinfo = @{
		DisplayName = $User.DisplayName
		SamAccountName = $User.SamAccountName
		GivenName = $User.GivenName
		Name = $User.Nume
		Surname = $User.Surname
		UserPrincipalName = $UPN
		AccountExpirationDate = $AED
		Enabled = $Enable
		ChangePasswordAtLogon = $CPaL
		AccountPassword = $password
		Path = $User.Path+','+$DomainPath
		Country = $User.Country
		City = $User.City
		Company = $User.Company
		Organization = $User.Organization
		Department = $User.Department
		Division = $User.Division
		Description = $User.Description
    }
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:42, 17-09-2014 | #23


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Kazun, спасибо за ответ и помощь,
исправил код, но к сожалению, так же получаю ошибку.

читать дальше »
Код: Выделить весь код
function Select-FileDialog 
{
	param([string]$Title,[string]$Directory,[string]$Filter="CSV Files (*.csv)|*.csv")
	[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
	$objForm = New-Object System.Windows.Forms.OpenFileDialog
	$objForm.InitialDirectory = $Directory
	$objForm.Filter = $Filter
	$objForm.Title = $Title
	$objForm.ShowHelp = $true
	
	$Show = $objForm.ShowDialog()
	
	If ($Show -eq "OK")
	{
		Return $objForm.FileName
	}
	Else
	{
		Exit
	}
}

$FileName = Select-FileDialog -Title "Import an CSV file" -Directory "c:\"

$domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain()
$DomainDN = (([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Domains | ? {$_.Name -eq $domain}).GetDirectoryEntry().distinguishedName
$final = "LDAP://$DomainDN"
$DomainPath = [ADSI]"$final"

$UsersCSV = Import-Csv $FileName -Delimiter ";"

Foreach ($User in $UsersCSV)
{
	
    Write-Host "Creating User: $User.SamAccountName"

    $password = ConvertTo-SecureString $User.AccountPassword -AsPlainText -Force

    $Enable = $false
    If ($User.Enabled -eq "True")
    {
      $Enable = $true
    }

    $CPaL = $false
    If ($User.ChangePasswordAtLogon -eq "True")
    {
      $CPaL = $true
    }

    if ($User.AccountExpirationDate -eq "0")
    {
        $AED = $null
    }

    $UPN = $User.SamAccountName+'@'+$domain
    
    $userinfo = @{
                    DisplayName = $User.DisplayName
                    SamAccountName = $User.SamAccountName
                    GivenName = $User.GivenName
                    Name = $User.Name
                    Surname = $User.Surname
                    UserPrincipalName = $UPN
                    AccountExpirationDate = $AED
                    Enabled = $Enable
                    ChangePasswordAtLogon = $CPaL
                    AccountPassword = $password
                    Path = $User.Path+','+$DomainPath
                    Country = $User.Country
                    City = $User.City
                    Company = $User.Company
                    Organization = $User.Organization
                    Department = $User.Department
                    Division = $User.Division
                    Description = $User.Description
    }
    

    New-ADUser @userinfo
    
}
Write-Host "Script Completed"


Код ошибки:
читать дальше »
Код: Выделить весь код
New-ADUser : The object name has bad syntax
At PS >New-Users.ps1:117 char:5
+     New-ADUser @userinfo
+     ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (CN=Prenume,OU=0....DirectoryEntry:String) [New-ADUser], ADException
    + FullyQualifiedErrorId : ActiveDirectoryServer:8335,Microsoft.ActiveDirectory.Management.Commands.NewADUser


Может в чем то другм проблема у меня?

Заранее спасибо.

Отправлено: 17:27, 18-09-2014 | #24


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


1) Посмотрите вывод переменной $UsersCSV - корректные ли данные выводятся в PowerShell?

2) Измените строку
Код: Выделить весь код
Path = $User.Path+','+$DomainPath
на
Код: Выделить весь код
Path = $User.Path+','+$DomainPath.distinguishedName
3) Заполните csv тестовыми данными и приведите их сюда, вместе с ошибкой.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:28, 18-09-2014 | #25


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Kazun,
1. Не обращайся ко мне на вы, а то как то не ловко становится.
2. Не знаю если правильно, но я сделал простой вывод:
читать дальше »
Код: Выделить весь код
PS C:\Windows\system32> Write-Host $UsersCSV
@{DisplayName=Name Family; SamAccountName=name.family; GivenName=Name; Name=Name; Surname=Family; AccountExpirationDate=0; Enabled=True; ChangePasswordAtLogon=True; AccountPassword=asdf
gh1!; Path=OU=01. Administration; Country=England; City=London; Company=Logon Company; Organization=Logon Company; Department=Administration; Division=Administration Depratment; Descript
ion=President & CEO}


3. После изминения строки на:
читать дальше »
Код: Выделить весь код
Path = $User.Path+','+$DomainPath.distinguishedName

получаю другую ошибку:
читать дальше »
Код: Выделить весь код
Creating User: @{DisplayName=Name Family; SamAccountName=name.family; GivenName=Name; Name=Name; Surname=Family; AccountExpirationDate=0; Enabled=True; ChangePasswordAtLogon=True; AccountPassword=asdfgh1!; Path=OU=01. Administration; Country=England; City=London; Company=Logon Company; Organization=Logon Company; Department=Administration; Division=Administration Depratment; Description=President & CEO}.SamAccountName
New-ADUser : A value for the attribute was not in the acceptable range of values
At PS >New-Users.ps1:117 char:5
+     New-ADUser @userinfo
+     ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (CN=Name,OU=01. ...ia,DC=trm,DC=md:String) [New-ADUser], ADException
    + FullyQualifiedErrorId : ActiveDirectoryServer:8322,Microsoft.ActiveDirectory.Management.Commands.NewADUser


4. И вот что у меня есть:

Код скрипта:
читать дальше »
Код: Выделить весь код
function Select-FileDialog 
{
	param([string]$Title,[string]$Directory,[string]$Filter="CSV Files (*.csv)|*.csv")
	[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
	$objForm = New-Object System.Windows.Forms.OpenFileDialog
	$objForm.InitialDirectory = $Directory
	$objForm.Filter = $Filter
	$objForm.Title = $Title
	$objForm.ShowHelp = $true
	
	$Show = $objForm.ShowDialog()
	
	If ($Show -eq "OK")
	{
		Return $objForm.FileName
	}
	Else
	{
		Exit
	}
}

$FileName = Select-FileDialog -Title "Import an CSV file" -Directory "c:\"

$domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetComputerDomain()
$DomainDN = (([System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Domains | ? {$_.Name -eq $domain}).GetDirectoryEntry().distinguishedName
$final = "LDAP://$DomainDN"
$DomainPath = [ADSI]"$final"

$UsersCSV = Import-Csv $FileName -Delimiter ";"

Foreach ($User in $UsersCSV)
{
	
    Write-Host "Creating User: $User.SamAccountName"

    $password = ConvertTo-SecureString $User.AccountPassword -AsPlainText -Force

    $Enable = $false
    If ($User.Enabled -eq "True")
    {
      $Enable = $true
    }

    $CPaL = $false
    If ($User.ChangePasswordAtLogon -eq "True")
    {
      $CPaL = $true
    }

    if ($User.AccountExpirationDate -eq "0")
    {
        $AED = $null
    }

    $UPN = $User.SamAccountName+'@'+$domain

    
    $userinfo = @{
                    DisplayName = $User.DisplayName
                    SamAccountName = $User.SamAccountName
                    GivenName = $User.GivenName
                    Name = $User.Name
                    Surname = $User.Surname
                    UserPrincipalName = $UPN
                    AccountExpirationDate = $AED
                    Enabled = $Enable
                    ChangePasswordAtLogon = $CPaL
                    AccountPassword = $password
                    Path = $User.Path+','+$DomainPath.distinguishedName
                    Country = $User.Country
                    City = $User.City
                    Company = $User.Company
                    Organization = $User.Organization
                    Department = $User.Department
                    Division = $User.Division
                    Description = $User.Description
    }
    

    New-ADUser @userinfo
    
}
Write-Host "Script Completed"


Файл CSV:
читать дальше »
Код: Выделить весь код
DisplayName;SamAccountName;GivenName;Name;Surname;AccountExpirationDate;Enabled;ChangePasswordAtLogon;AccountPassword;Path;Country;City;Company;Organization;Department;Division;Description
Name Family;name.family;Name;Name;Family;0;True;True;asdfgh1!;OU=01. Administration;England;London;Logon Company;Logon Company;Administration;Administration Depratment;President & CEO

Отправлено: 11:32, 19-09-2014 | #26


Ветеран


Сообщения: 1259
Благодарности: 861

Профиль | Отправить PM | Цитировать


Значение атрибута Country должно быть в формате ISO 3166 - http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2

Т.е. в данном случае England заменяем на GB и должно отработать.
Это сообщение посчитали полезным следующие участники:

Отправлено: 13:05, 19-09-2014 | #27


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Kazun, Большое Спасибо, скрипт заработал, все отличьно...

Отправлено: 14:30, 19-09-2014 | #28


Новый участник


Сообщения: 7
Благодарности: 0

Профиль | Отправить PM | Цитировать


Kazun, нужна помщь...

Хочу написать скрип для импортирования в АД, из ЧСВ структур ОУ.
Компания большая и подразелений много, подымаю новый АД и есть нужда в таком скрипте.
Конечно финальный скрипт выложим на форуме для других хороших парней.

Есть кое какие идей?
Я в курсе что в ПоуэрШел 4 есть такая команда как АДД-ОрганизатионЮнит.

Kazun, и еще,

Хочу доработать скрипт с импортированием пользователей.
Хочу чтоб при выполнении показал какое то состояние процеса и чтоб создал лог со статусом выполнения.

Заранее спасибо.

Последний раз редактировалось andysc, 25-09-2014 в 11:12.


Отправлено: 11:05, 25-09-2014 | #29


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


andysc, что такое «ЧСВ структуры»?

Цитата andysc:
Я в курсе что в ПоуэрШел 4 есть такая команда как АДД-ОрганизатионЮнит. »
В конечном счёте всё работает посредством ADSI интерфейсов. Так что наличие или отсутствие того или иного командлета не должно служить препятствием.

Цитата andysc:
Хочу доработать скрипт с импортированием пользователей.
Хочу чтоб при выполнении показал какое то состояние процеса и чтоб создал лог со статусом выполнения. »
Дорабатывайте, кто ж мешает . powershell progress - Поиск в Google.
Это сообщение посчитали полезным следующие участники:

Отправлено: 11:29, 25-09-2014 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Не работает импорт пользователей в AD из CSV-файла

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - [решено] Добавление информации из csv-файла в AD с обработкой IvanXXL Скриптовые языки администрирования Windows 12 23-07-2014 10:49
2012 R2 - [решено] Не работает импорт пользователей в AD из CSV-файла fcdm25 Windows Server 2012/2012 R2 1 21-02-2014 19:51
PowerShell - PowerShell: импорт данных в AD из файла Perersmeshnik Скриптовые языки администрирования Windows 2 20-02-2014 09:44
PowerShell - [решено] Импорт из CSV в AD с помощью PowerShell rox33 Скриптовые языки администрирования Windows 23 20-07-2012 15:45
PowerShell - Импорт пользователей с помощью POwerShell и CSV файла. Temafet Скриптовые языки администрирования Windows 19 18-01-2012 16:45




 
Переход