Войти

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


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

fcdm25
21-02-2014, 17:56
Спасибо за помощь 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

andysc
17-09-2014, 18:13
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;ChangePasswordAtLogo n;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


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

Спвсибо.

Kazun
17-09-2014, 22:42
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
}

andysc
18-09-2014, 17:27
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


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

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

Kazun
18-09-2014, 18:28
1) Посмотрите вывод переменной $UsersCSV - корректные ли данные выводятся в PowerShell?

2) Измените строку Path = $User.Path+','+$DomainPath на Path = $User.Path+','+$DomainPath.distinguishedName

3) Заполните csv тестовыми данными и приведите их сюда, вместе с ошибкой.

andysc
19-09-2014, 11:32
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;ChangePasswordAtLogo n;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

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

Т.е. в данном случае England заменяем на GB и должно отработать.

andysc
19-09-2014, 14:30
Kazun, Большое Спасибо, скрипт заработал, все отличьно...

andysc
25-09-2014, 11:05
Kazun, нужна помщь... :)

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

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

Kazun, и еще,

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

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

Iska
25-09-2014, 11:29
andysc, что такое «ЧСВ структуры»?

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

Хочу доработать скрипт с импортированием пользователей.
Хочу чтоб при выполнении показал какое то состояние процеса и чтоб создал лог со статусом выполнения. »
Дорабатывайте, кто ж мешает ;). powershell progress - Поиск в Google (https://www.google.ru/search?q=powershell+progress).

Kazun
25-09-2014, 11:38
Мне такой скрипт не нужен, кому надо можно взять готовые решения и допилить под себя:

1) Active Directory User Creation tool 1.2 (http://gallery.technet.microsoft.com/scriptcenter/New-User-Creation-tool-14fa73cd)

2) Z-Hire Active Directory, Exchange, Lync, Office 365 User Creation Tool (http://gallery.technet.microsoft.com/office/Z-Hire-Employee-Provisionin-e4854d6b)

andysc
25-09-2014, 11:52
Iska,

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

Я не думаю что не поняли что я хотел этим сказать,
и факт что не добавил запятую там где надо не считаю изменился смысл выражения.
Просто иногда кто то хочит показать себя превысше других и придераются к словам, факт которого, я считаю - неправельным.

Но все таки, если для кого то это так важно, то могу исправить:

Хочу написать скрип для импортирования в АД, из ЧСВ, структуры ОУ. »

Думаю что теперь понятно. :)

Kazun,

кому надо можно взять готовые решения и допилить под себя »

А считаю что можно написать такой же скрипт как для добавления пользователей, так и для добавления ОУ и не засырять систему всякими готовыми решениями. :)

Если кому то интерессно: New-ADOrganizationalUnit (http://technet.microsoft.com/en-us/library/hh852233.aspx)

Iska
25-09-2014, 13:26
Я не думаю что не поняли что я хотел этим сказать,
и факт что не добавил запятую там где надо не считаю изменился смысл выражения.
Просто иногда кто то хочит показать себя превысше других и придераются к словам, факт которого, я считаю - неправельным. »
А здесь Вы уже специально не ставите знаки препинания и коверкаете слова? Я всего лишь спросил, что такое «ЧСВ структуры», и на тебе — обвинение в ЧСВ (http://lurkmore.to/%D0%A7%D0%A1%D0%92).

Думаю что теперь понятно. »
Нет. Спрошу вновь — что такое «ЧСВ»? Расшифруйте.

andysc
25-09-2014, 14:33
Нет. Спрошу вновь — что такое «ЧСВ»? Расшифруйте. »

Это транлит с латынских букв. :)
Тоесть CSV.

Iska
25-09-2014, 14:36
andysc, спасибо, ясно. Никогда б не догадался. То, что не транслит — точно.




© OSzone.net 2001-2012