Импорт пользователей CSV с помощью сценария PowerShell

Моя цель - импортировать пользователей из файла CSV в Active Directory с помощью простого сценария PowerShell. Несмотря на это, я сталкиваюсь с синтаксической ошибкой, как показано ниже.

Обновлено: формат столбца CSV

name,surname,ou
Steven,Boone,Management
Rodney,Fisher,Sales
Taylor,Bautista,Management
Nathan,Morris,Management

Работает и решено: код PowerShell

Import-Module ActiveDirectory
$ADDSUsers = Import-Csv C:\0469697M_gxt.csv

foreach ($user in $ADDSUsers) {
     $Name = $user.name + " " + $user.surname
     $OU = $user.ou
     $OUPath = "OU=$($OU),dc=intgxt,dc=allaboutfood,dc=com,dc=mt"

     #Creating New AD Users                   
     New-ADUser -Name $Name -Path $OUPath
}   

Ошибка

New-ADUser : The object name has bad syntax
At C:\Script.ps1:9 char:5
+     New-ADUser -Name "$name" -Path "$OU"
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (CN=Tyler Blair,Management:String) [New-ADUser], ADException
    + FullyQualifiedErrorId :ActiveDirectoryServer:8335,Microsoft.ActiveDirectory.Management.Commands.NewADUser

Не уверен, где у меня ошибка. Насколько я понимаю, столбцы разбираются хорошо.

«Насколько я понимаю, столбцы разбираются хорошо.» - я предполагаю, что нет. NotSpecified: (CN=Tyler Blair,Management:String) сообщает мне, что анализатор CSV не справляется с данными OU, которые должны быть похожи на CN=Tyler Blair,OU=This,DC=example,DC=com, а ваш CSV не имеет этого цитируемого, поэтому Import-CSV разбивает OU на запятые, как если бы они были разными столбцами, и то вы создаете объект без полного пути, и это не удается. Предположение, потому что ваш код не выглядит некорректным. В качестве альтернативы, возможно, подразделение в вашей электронной таблице не является полным путем и должно быть

TessellatingHeckler 27.04.2018 21:32

Да, у меня есть столбец ou, но не столбец DC. В этой ошибке Management - это подразделение, но я не знаю, что такое Management: String. Какие предложения у вас есть @TessellatingHeckler?

Sam_M 27.04.2018 21:41

Пожалуйста, опубликуйте образец CSV. Не стесняйтесь менять имена, но постарайтесь сохранить структуру нетронутой. Сделайте это, отредактировав свой вопрос не как комментарий.

EBGreen 27.04.2018 21:46

@EBGreen Обновил мои столбцы CSV и добавил некоторые данные - Спасибо за вашу помощь :)

Sam_M 27.04.2018 21:57

Ваш CSV-канал разделен, разделен запятыми или разделен табуляцией. Ваш пример выглядит так, как будто заголовки разделены вертикальной чертой (вроде), а данные разделены табуляцией. Ваш пример кода подразумевает, что он разделен запятыми.

EBGreen 27.04.2018 22:06

О, это было просто форматирование в StackOverflow - это действительно разделение запятыми

Sam_M 27.04.2018 22:12

@EBGreen Вот как это выглядит в исходном формате: имя, фамилия, оу Стивен, Бун, Менеджмент Родни, Фишер, Сэйлс Тейлор, Баутиста, Менеджмент Натан, Моррис, Менеджмент

Sam_M 27.04.2018 22:14

Похоже, -Path должен иметь полный путь к формату X.500 - документы docs.microsoft.com/en-us/powershell/module/addsadministratio‌ n /… и примеры serverfault.com/questions/581383/new-aduser-path-syntax

TessellatingHeckler 28.04.2018 02:23

@TessellatingHeckler Хорошо, я обновил код в исходном посте. Допустим, у меня есть домен - intgxt.allaboutfood.com.mt. Как мне разобрать это в $ Container? intgxt.allaboutfood.com.mt, являющийся доменом, тогда с подразделениями под ним называются: - Учетные записи - Управление - Ура продаж

Sam_M 28.04.2018 11:36

Спасибо. Решено, проверьте ответы

Sam_M 28.04.2018 12:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
2 361
2

Ответы 2

IMO, часть, которая не работает, - это переменная -Path, которую вы предоставляете. Вам необходимо указать DN (отличительное имя) пути в активном каталоге. Самый простой способ сделать это - получить DN пользователя и получить DN родительского контейнера.

Что-то вроде этого:

-Path 'OU = New User Accounts, OU = Users, DC = compost, DC = is, DC = smelly, DC = com'

Кроме того, я бы посоветовал вам привыкнуть к одинаковому разделению строк каждый раз и придерживаться его. Одиночные и двойные кавычки действуют по-разному. Вам не нужно отделять имена полей от исходного .csv, если нет пробелов.

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

$ OU

Рабочим примером этого может быть:

Начинать

    Import-Module ActiveDirectory
    $ADDSUsers = Import-Csv C:\0469697M_gxt.csv
    $Creation_PW = Read-Host -AsSecureString -Prompt "Choose a password"
    foreach ($user in $ADDSUsers) {
    $Container = "OU=$($OU),OU=Users,DC=contoso,DC=com"
    $FirstName = $user.name
    $LastName = $user.surname
    $Account_Name = "$($FirstName) $($LastName)"
    New-ADUser -ChangePasswordAtLogon $true -Enabled $true -Path $Container -GivenName $FirstName -Surname $LastName -Name $Account_Name Description $Description -AccountPassword $Creation_PW }

Конец

($ Creation_PW должен быть SecureString)

Я вытащил разделы из сценария массового создания учетных записей, который я использую для своей организации. Мы делаем их время от времени. Вы можете указать все виды атрибутов при создании, в зависимости от вашей схемы AD. Я оставил только нужные части.

Надеюсь, это поможет

Хорошо, я обновил код в исходном посте. Допустим, у меня есть домен - intgxt.allaboutfood.com.mt. Как мне разобрать это в $ Container? intgxt.allaboutfood.com.mt, являющийся доменом, тогда с подразделениями под ним называются: - Учетные записи - Управление - Ура продаж

Sam_M 28.04.2018 11:14

Рад, что у тебя все работает. Как вы уже догадались, ключом был путь LDAP. Извините, что оставил вас висеть на висящей переменной. Мне пришлось дезинфицировать свой сценарий из-за того, где я работаю. Я использую этот веб-сайт уже некоторое время и рад, что могу поделиться чем-то для других.

Dave 28.04.2018 19:44

Нет проблем, @Dave. Также спасибо за вашу помощь в защите страны, сэр :) Я очень ценю вашу помощь

Sam_M 29.04.2018 23:36

Спасибо, ребята, мне удалось усовершенствовать свой сценарий, и все заработало.

Как я решил проблему

Как было сказано выше, мне пришлось использовать формат пути X.500 для сценария, чтобы найти, куда вводить пользователей. Для людей, у которых такие же проблемы, как и у меня, вот ссылка, которая помогла мне вместе с приведенным выше: https://serverfault.com/questions/581383/new-aduser-path-syntax

Мне также нужно использовать -Name вместо -GivenName, а затем добавить $ user.name и $ user.surname вместе, чтобы имена в OU отображались, например, как Dave Smith. Это зависит от ваших требований.

Кроме того, необходимо было объявить $ ($ OU), чтобы сценарий знал OU для каждого соответствующего пользователя. (Предоставляется в формате .csv)

Как ввести правильный путь (формат пути X.500)

Для всех, кто столкнулся с проблемой и наткнулся на этот пост.

OU > Domain Name

Точки в имени домена разделяются dc = Например:

Admin Organizational Unit in Contoso.com Domain
$OUPath = "OU=Admin,dc=Contoso,dc=com"

HR Organizational Unit in MyOrganization.co.uk Domain
$OUPath = "OU=HR,dc=MyOrganization,dc=co,dc=uk"

Import Organizational Unit in .CSV File
$OUImport = $user.ou (or whatever your ou column name is)
$OUPath = "OU=($OUImport),dc=MyOrganization,dc=co,dc=uk"

Код

Import-module activedirectory
$ADDSUsers = Import-csv C:\0469697M_gxt.csv

write-host "Start Process"
write-host "-------------------------------------"

ForEach ($user in $ADDSUsers){
    $Name = $user.name + " " + $user.surname
    $OU = $user.ou
    $OUPath = "OU=$($OU),dc=intgxt,dc=allaboutfood,dc=com,dc=mt"

    #Creating New AD Users                   
    New-ADUser -Name $Name -Path $OUPath
}

Особая благодарность (Dave) https://stackoverflow.com/users/9712731/dave и (EBGreen) https://stackoverflow.com/users/1358/ebgreen за их руководство.

Другие вопросы по теме