Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Не работает импорт пользователей в AD из CSV-файла (http://forum.oszone.net/showthread.php?t=278102)

fcdm25 20-02-2014 16:25 2312511

Не работает импорт пользователей в AD из CSV-файла
 
Вложений: 1
Здравствуйте, сегодня решил загрузить пользователей в 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"

Kazun 20-02-2014 16:32 2312514

Сам скрипт полностью приведите.

fcdm25 20-02-2014 16:36 2312519

Цитата:

Цитата Kazun
Сам скрипт полностью приведите. »

Сам скрипт
Код:

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 2312537

Покажите вывод: $Users[0]

fcdm25 20-02-2014 17:06 2312548

Цитата:

Цитата Kazun
Покажите вывод: $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 2312570

Заменить $OU,на:
Код:

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

fcdm25 20-02-2014 17:38 2312572

Цитата:

Цитата Kazun
Заменить $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 2312582

Вы привели файл, где разделитель запятая. Здесь же используется точка с запятой. Где правда?

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

fcdm25 20-02-2014 20:05 2312594

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

Kazun 20-02-2014 23:17 2312686

Вопрос мне неясен,что конкретно требуется в итоге.

Для поиска в лесе - обращайтесь к глобальному каталогу по порту 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 2312870

Kazun, как я понимаю строка
Код:

Get-ADUser -Filter "Name -eq 'Test User'" -Server GC:3268
отвечает за поиск по лесу AD?

Цитата:

Цитата Kazun
Вопрос мне неясен,что конкретно требуется в итоге. »

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


Например

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

Kazun 21-02-2014 09:45 2312875

отвечает за поиск по лесу 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 2312881

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 2312893

Код:

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 2312961

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 2313023

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

fcdm25 21-02-2014 14:01 2313042

Цитата:

Цитата Kazun
Заменить else ($ou){ на else { - и будет работать »

Я пробовал так делать, тогда он пишет "каталог не найден".
Цитата:

Цитата Kazun
Я никогда не был на курсах, так что не могу ничего сказать о них. »

Спасибо, я сейчас начал читать книгу "Введение в технологии языка сценариев для пользователей без базовых знаний". Просто первый раз столкнулся с PS, язык очень интересный и как я понимаю в дальнейшем MS планирует все продукты заточить под него

Iska 21-02-2014 14:43 2313075

Цитата:

Цитата fcdm25
и как я понимаю в дальнейшем MS планирует все продукты заточить под него »

Нет, все — не планирует ;).

fcdm25 21-02-2014 14:51 2313086

Iska, я просто смотрю в System Center, Windows Server, SQL Server в PS достаточно плотно интегрирован.

Iska 21-02-2014 14:58 2313091

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

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

fcdm25 21-02-2014 17:56 2313235

Спасибо за помощь 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 2404060

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



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

Спвсибо.

Kazun 17-09-2014 22:42 2404161

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 2404504

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 2404527

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

2) Измените строку
Код:

Path = $User.Path+','+$DomainPath
на
Код:

Path = $User.Path+','+$DomainPath.distinguishedName
3) Заполните csv тестовыми данными и приведите их сюда, вместе с ошибкой.

andysc 19-09-2014 11:32 2404760

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


Kazun 19-09-2014 13:05 2404796

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

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

andysc 19-09-2014 14:30 2404839

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

andysc 25-09-2014 11:05 2406862

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

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

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

Kazun, и еще,

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

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

Iska 25-09-2014 11:29 2406865

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

Цитата:

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

В конечном счёте всё работает посредством ADSI интерфейсов. Так что наличие или отсутствие того или иного командлета не должно служить препятствием.

Цитата:

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

Дорабатывайте, кто ж мешает ;). powershell progress - Поиск в Google.

Kazun 25-09-2014 11:38 2406868

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

1) Active Directory User Creation tool 1.2

2) Z-Hire Active Directory, Exchange, Lync, Office 365 User Creation Tool

andysc 25-09-2014 11:52 2406873

Iska,

Цитата:

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

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

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

Цитата:

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

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

Kazun,

Цитата:

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

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

Если кому то интерессно: New-ADOrganizationalUnit

Iska 25-09-2014 13:26 2406896

Цитата:

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

А здесь Вы уже специально не ставите знаки препинания и коверкаете слова? Я всего лишь спросил, что такое «ЧСВ структуры», и на тебе — обвинение в ЧСВ.

Цитата:

Цитата andysc
Думаю что теперь понятно. »

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

andysc 25-09-2014 14:33 2406921

Цитата:

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

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

Iska 25-09-2014 14:36 2406922

andysc, спасибо, ясно. Никогда б не догадался. То, что не транслит — точно.


Время: 09:20.

Время: 09:20.
© OSzone.net 2001-