Показать полную графическую версию : Не работает импорт пользователей в AD из CSV-файла
Спасибо за помощь 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
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
Уже второй день с ним мучаюсь...
В сети не нашел инфу чтоб помогала.
Спвсибо.
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
}
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
Может в чем то другм проблема у меня?
Заранее спасибо.
1) Посмотрите вывод переменной $UsersCSV - корректные ли данные выводятся в PowerShell?
2) Измените строку Path = $User.Path+','+$DomainPath на Path = $User.Path+','+$DomainPath.distinguishedName
3) Заполните csv тестовыми данными и приведите их сюда, вместе с ошибкой.
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
Значение атрибута Country должно быть в формате ISO 3166 - http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2
Т.е. в данном случае England заменяем на GB и должно отработать.
Kazun, Большое Спасибо, скрипт заработал, все отличьно...
Kazun, нужна помщь... :)
Хочу написать скрип для импортирования в АД, из ЧСВ структур ОУ.
Компания большая и подразелений много, подымаю новый АД и есть нужда в таком скрипте.
Конечно финальный скрипт выложим на форуме для других хороших парней. ;)
Есть кое какие идей?
Я в курсе что в ПоуэрШел 4 есть такая команда как АДД-ОрганизатионЮнит.
Kazun, и еще,
Хочу доработать скрипт с импортированием пользователей.
Хочу чтоб при выполнении показал какое то состояние процеса и чтоб создал лог со статусом выполнения.
Заранее спасибо. :)
andysc, что такое «ЧСВ структуры»?
Я в курсе что в ПоуэрШел 4 есть такая команда как АДД-ОрганизатионЮнит. »
В конечном счёте всё работает посредством ADSI интерфейсов. Так что наличие или отсутствие того или иного командлета не должно служить препятствием.
Хочу доработать скрипт с импортированием пользователей.
Хочу чтоб при выполнении показал какое то состояние процеса и чтоб создал лог со статусом выполнения. »
Дорабатывайте, кто ж мешает ;). powershell progress - Поиск в Google (https://www.google.ru/search?q=powershell+progress).
Мне такой скрипт не нужен, кому надо можно взять готовые решения и допилить под себя:
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)
Iska,
что такое «ЧСВ структуры»? »
Я не думаю что не поняли что я хотел этим сказать,
и факт что не добавил запятую там где надо не считаю изменился смысл выражения.
Просто иногда кто то хочит показать себя превысше других и придераются к словам, факт которого, я считаю - неправельным.
Но все таки, если для кого то это так важно, то могу исправить:
Хочу написать скрип для импортирования в АД, из ЧСВ, структуры ОУ. »
Думаю что теперь понятно. :)
Kazun,
кому надо можно взять готовые решения и допилить под себя »
А считаю что можно написать такой же скрипт как для добавления пользователей, так и для добавления ОУ и не засырять систему всякими готовыми решениями. :)
Если кому то интерессно: New-ADOrganizationalUnit (http://technet.microsoft.com/en-us/library/hh852233.aspx)
Я не думаю что не поняли что я хотел этим сказать,
и факт что не добавил запятую там где надо не считаю изменился смысл выражения.
Просто иногда кто то хочит показать себя превысше других и придераются к словам, факт которого, я считаю - неправельным. »
А здесь Вы уже специально не ставите знаки препинания и коверкаете слова? Я всего лишь спросил, что такое «ЧСВ структуры», и на тебе — обвинение в ЧСВ (http://lurkmore.to/%D0%A7%D0%A1%D0%92).
Думаю что теперь понятно. »
Нет. Спрошу вновь — что такое «ЧСВ»? Расшифруйте.
Нет. Спрошу вновь — что такое «ЧСВ»? Расшифруйте. »
Это транлит с латынских букв. :)
Тоесть CSV.
andysc, спасибо, ясно. Никогда б не догадался. То, что не транслит — точно.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.