Ну и теперь решил описать так, чтобы ЛЮБОМУ было понятно, кто хоть чуть-чуть видел powershell и знаком со скриптами.
Итак. Чтобы создать кучу юзеров с кучей параметров в Active Directory требуется (помимо Windows Server 2008 R2 SP1 \ PowerShell 2.0.1.1):
0. Разрешить выполнять скрипты в powershell - открыть powershell на контроллере домена и выполнить команд
Set-ExecutionPolicy UnrestrictedНе выполнив этой команды получим сообщение "выполнение скриптов запрещено для данной системы"
1. Загрузить в powershell модуль управления Active Directory. Выполняем команду
import-module activedirectory
2. Создаем в MS Excel файлик с параметрами пользователей. В верхней строке указано объяснение что это за параметр. Во второй строке указано имя параметра - это реальная команда-параметр для командлета new-aduser. Далее в каждом столбце указано значение какого-либо параметра, который будет присвоен объекту при создании. В принципе все эти параметры можно посмотреть по команде get-help new-aduser -full. Я выбрал нужные мне и задал их значения:
Кому не видно - вот перечень столбцов через запятую, которые по-моему обязательны.
Name,Password,Surname,GivenName,DisplayName,Description,Department,Title,Division,City,EmailAddress,ScriptPath,SamAccountName
Вообще можно заполнить все параметры учетки, имена параметров можно уивдеть в свойствах учетки, на вкладке Редактор атрибутов (если такой вкладки нет - включаем дполнитиельные возможности в свойствах консоли ММС)
При создании параметров нужно избегать точек, запятых и прочего мусора, который может быть воспринят как команда. Обязательным параметром следует сделать SamAccountName (спасибо комментирующему за поправку)
Сохраняем файлик с расширением XLS (XLSX - для 2007). А потом сохраняем с расширением CSV (разделители - точка с запятой). Открываем файлик с расширением CSV в блокноте и сохраняем в другой кодировке - Unicode (а по умолчанию идет ANSI, которую powershell не переваривает и при выполнении выдаст ошибку). Имя сохраняемого и путь (для упрощения понимания последующих шагов) - C:\scripts\createuserbat.csv. Открываем файлик в каком-нибудь файловом менеджере и заменяем ВСЕ точки с запятой (;) на просто запятые - (,). Сохраняем. Не должно быть лишних пробелов, точек и прочего хлама. Проверять нужно тщательно.
3. Открываем блокнот и вставляем туда вот этот код:
Import-CSV -Path "C:\scripts\createuserbat.csv" | ForEach-Object -process {New-ADuser -Name $_.Name -Surname $_.Surname -City $_.City -Department $_.Department -GivenName $_.GivenName -Title $_.Title -Description $_.Description -DisplayName $_.DisplayName -Division $_.Division -EmailAddress $_.EmailAddress -MobilePhone $_.MobilePhone -SamAccountName $_.SamAccountName -ScriptPath $_.ScriptPath -Path "ou=Users_Test,dc=Test,dc=ru" -CannotChangePassword $true -ChangePasswordAtLogon $false -PasswordNotRequired $true -AccountPassword (ConvertTo-SecureString -AsPlainText $_.Password -Force) -Company TEST}
Теперь подробнее. Разберем скрипт на куски:
Import-CSV -Path "C:\scripts\createuserbat.csv" - эта команда берет данные из файлика, котоый мы создали (и положили по указанному пути - в данном случае в C:\scripts\createuserbat.csv) и передает их...
| ForEach-Object -process - ... в конвейер указанной далее команды (т.е. указанная далее команда отработает для всех строк нашего createuserbat.csv)
{New-ADuser - команда уже знакомая и понятная - она создает пользователя с нужными атрибутами, которые перечисляются далее...
-Name $_.Name - это атрибут "Имя" (по сути логин пользователя). Т.е. мы говорим команде New-ADUser взять параметр Name из файлика createuserbat.csv из столбца Name (указывается псевдоним $_.Name).
Далее - все по аналогии. Обязательным параметром следует сделать SamAccountName
Нюансы - куда создается объект, его пароль и атрибуты, связанные с паролем. А также скрипт, выполняющийся при входе в систему.
Куда создается объект (пользователь)?
Это указывается параметром -Path "ou=Users_Test,dc=Test,dc=ru" из которого мы видим, что создаваться он будет в контейнере (OU) Users_Test домена Test.ru. Тут надо подставить свое значение конечно. Я бы советовал держать пользователей не в Users, как это бывает по умолчанию, а в другом OU. Это упростит потом работы с политиками. Посмотреть путь до контейнера можно в консоли MMC Пользователи и компьютеры со включенными дополнительными параметрами. Смотрим в редактор атрибутов, параметр distinguishedName.
Пароль и его атрибуты.
-CannotChangePassword $true - задаем параметр "Запретить смену пароля пользователем"
-ChangePasswordAtLogon $false - задаем параметр "Сменить пароль при следующем входе в систему" в значение НЕТ
-PasswordNotRequired $true - задаем параметр "Требуется ли пароль для учетной записи" в значение ДА
-AccountPassword (ConvertTo-SecureString -AsPlainText $_.Password -Force) - задаем собственно сам пароль, включая возможность это делать из простого текстового значения, снимая атрибуты секретности, и передавая в конвейер значение столбца Password в файлике createuserbat.csv
Эти три параметра рекомендую не менять - они зависят друг от друга (уже забыл как))) и надо просто их выполнить именно так)))
Скрипт, выполняющийся при входе в систему.
-ScriptPath $_.ScriptPath
В параметре прописано startuser.bat. Это обычный батник, которым очень удобно подключать сетевые диски, запускать какие-то уведомлялки на js, и прочая. Лежать должен в \\DomainController\NETLOGON.
Сохраняем файл с расширением PS1 в кодировке Unicode с именем CreateUser.PS1 в тот же каталог, куда и createuserbat.csv
4. Запускаем файл CreateUser.PS1
5. Учетные записи готовы, если их не видно в AD - обновите страницу консоли))) Однако все они выключены. Выделяем их все и включаем одной командой по правой кнопке мыши. В принципе есть параметр -Enabled, использованного нами командлета New-ADUser, и ее можно добавить в конец списка параметров, но мне кажется удобнее включать учетные записи когда пользователь придет к администратору (т.е. ко мне) за листочком с учетными данными.
Есть и другие варианты создания пользователя - с помощью questsoft и т.п., но если у вас Windows Server 2008 R2 SP1 \ PowerShell 2.0.1.1 - это работает, проверено.
UPDATE 1
Всегда заменяйте разделители - точки с запятой (;) на запятые(,)
UPDATE 2
Всегда проверяйте колчиество симоволов в пароле - одно должно соответствовать количеству символов в пароле, указнному в Default Domain Policy
UPDATE 3
Обязательным параметром следует сделать SamAccountName. Сделайте его равным параметру Name (т.е. логину)
UPDATE 4
Кроме полей "описание" все остальные поля рекомендуется заполнять латинскими буквами, без пробелов, например buhgalteria_permskogo_otdelenia_banka
UPDATE 5
Для выполнения очень удобно использовать не стандартную строку powershell, а некий giud, встроенный в ОС и позволяющий боле удобно править скрипты, содвать странички и пр пр. Запускается просто: выполнить \ вводим
powershell_ise
и энтер.
Вопрос...
Date: 2012-01-09 11:53 am (UTC)У меня домен: domain1.domain2.int я изменил параметр -Path
-Path "OU=Users,DC=donain1,DC=domain2,DC=int"
получаю ошибку "Объект каталога не найден"
Re: Вопрос...
Date: 2012-01-10 03:10 am (UTC)Самое простое в вашем случае по-моему просто посмотреть в свойствах объекта каталога правильный путь к нему.
Т.е. открываем оснастку АD, и смотрим свойства каталога, куда требуется создать пользователей (это не обязательно должен быть Users) - вкладка "Объект"
Ну и если вы пишете вот так:
DC=donain1
то тут у вас ошибка в букве do_n_ain1
Re: Вопрос...
Date: 2012-01-11 10:04 am (UTC)Import-CSV -Path "C:\scripts\createuserbat.csv" | ForEach-Object -process {New-ADuser -SamAccountName $_.Name -Name $_.Name -Surname $_.Surname -City $_.City -Department $_.Department -GivenName $_.GivenName -Title $_.Title -Description $_.Description -DisplayName $_.DisplayName -Division $_.Division -EmailAddress $_.EmailAddress -MobilePhone $_.MobilePhone -ScriptPath $_.ScriptPath -Path "ou=Users_Test,dc=Test,dc=ru" -CannotChangePassword $true -ChangePasswordAtLogon $false -PasswordNotRequired $true -AccountPassword (ConvertTo-SecureString -AsPlainText $_.Password -Force) -Company TEST}
После этого все заработало.
no subject
Date: 2012-02-21 11:13 am (UTC)no subject
Date: 2012-02-21 11:42 am (UTC)кто-то из коллег пробовал, но у меня сложилось впечатление что там нужны нехилые пляски с бубном и установка какого-то стороннего софта, кроме пауэршела, квест софтваре что ли.
no subject
Date: 2012-03-05 07:58 am (UTC)no subject
Date: 2012-03-06 08:22 am (UTC)синтаксис не такой прозрачный, как в пауэршеле, но основные шаги поясню:
1. Создаем экселевский файл, в котором каждая строчка будет иметь такой примерно вид (пробелы тут - это границы между ячейками, т.е. каждое значение с своей ячейке)
call Add_User Podrazdelenie IvanovAM password "Иванов Андрей Михайлович" "Начальник подразделения"
2. Сохраняем эксель-вариант как документ эксель
3. Сохраняем эксель-вариант как документ TXT
4. Меняем расширение файла на BAT
5. Создаем файл с именем Add_User с таким содержимым (пояснения заremлены):
rem подключаем к контроллеру домена, на котором будем выполнять скрипт локальный диск файлового сервера server. Это нужно для создания личной папки пользователя в такой структуре:
сетевой диск \ папка подразделенеия \ личная папка пользователя (доступ только у Администраторов домена и самого пользователя) И общая папка подразделения (доступ только у Администраторов домена и всех членов группы безопасности данного подразделения) \ файлы данных***
net use u: \\server\d$
set drive=u:\
set org_gr=Office
rem Устанавливаем переменные для использования в батнике***
set group=%1
set nik=%2
set pass=%3
set name=%4
set comm=%5
set mail=%6
echo passed=1
cd /d %drive%%org_gr%\%group%
echo passed=2
rem Создаем пользователя. Пераметр scriptpath смотрит на батник для подключения сетевых дисков, батник лежит в DC\Netlogon***
net user %nik% %pass% /add /active:yes /fullname:%name% /comment:%comm% /expires:never /passwordchg:no /passwordreq:yes /scriptpath:office.bat /DOMAIN
echo passed=3
rem Добавляем пользователя в групповую группу ****
net group %group% %nik% /add /domain
echo passed=4
rem Создаем домашнюю папку пользователя ****
md %nik%
xcacls %nik% /T /G %nik%:C /Y
cacls %nik% /E /G "администраторы домена":F
echo passed=5
rem Отключаем диск файлового сервера от КД***
cd /d c:\Scripts\Office
net use u: /delete
6. Запускаем файл из пункта 4.
7. Если что-то не идет - проверяем параметры. Пользовательс создается в OU Users, так что если они хранятся в другом контейнере - их надо перемещать особо.
Скрипт для создания групп безопасности для ПОДРАЗДЕЛЕНИЙ:
принцип тот же - создам файл, передающий в конвейер значения
1. Создаем файл содержащий строки вида:
call Add_Group Podrazdelenie "Центр01"
2. Создаем файл с именем Add_Group
rem подключаем файловый сервер к КД, устанавливаем переменные***
net use u: \\server\d$
set drive=u:\
set org_gr=Office
set group=%1
set comm=%2
rem Переходим в корень диска
cd /D %drive%%org_gr%
rem Создаем папку группы
md %group%
rem Создаем группу
net group %group% /comment:%comm% /Domain /Add
rem Добавляем группу в общую группу (
rem net group %org_gr% %group% /add /domain
rem Заменяем права для группы организации
xcacls %group% /T /G %group%:C /Y
rem Добавляем права
cacls %group% /E /G "Администраторы домена":F
rem Создаем общую папку группы
cd %group%
md Common
rem Переходим на КД обратно
cd /d c:\Scripts\Office
net use u: /delete
3. Запускаем файл из пункта 1.
Сразу скажу что писал эти батники не я, но они работают у нас. Любые проблемы обычно связаны с ошибкой в кодировке, в пробелах, путях, синтаксисе. Тут не пауэершел - подсказок в какой строке косяк не дают.
Таких же батников куча на любом форуме админов, но пишут в основном на VBS, а мне VBS категорически не нравится - я не программист, я администратор, и вникать в программные загогулины никакого желания не имею))
Удачного запуска, коллега)))
no subject
Date: 2012-06-14 01:11 pm (UTC)Выбивает ошибку:
"ConvertTo-SecureString : Не удается привязать аргумента к параметру "String", так как он имеет значение NULL.
C:\scripts\CreateUser.ps1:1 знак:547"
я, так понимаю, это связанно с полем пароля в файле исходных данных. Но в чем может быть проблема? Пароль введен "Qq123456".
Заранее спасибо :)
no subject
Date: 2012-06-14 01:39 pm (UTC)поэкспериментируйте, создайте без пароля, попробуйте другой пароль(тут важно какие у вас настройки безопасности в домене относительно длины пароля и его сложности - см. дефолт домэйн полиси, политика комп-ра\безопасность). Если создавать без пароля, то, наскоко помню,учетка будет отключена, ее можно включить потом отдельным батником и им же установить пароль...
э, голова другим занята, уж простите
no subject
Date: 2012-06-14 06:59 pm (UTC)на счет политики. Идея на счет политик тоже в голову пришла. :) Вписал пароль как надо.
попробую без пароля. Спасибо. Отпишу, как попробую. ;)
no subject
Date: 2012-06-15 07:39 am (UTC)Примечание:
файл .csv построен по примеру вашего скриншота, без поля password. Везде в Excel'е использовался англ. язык (хотя нужен будет русский.Решил пока на англ., чтоб проверить хоть такую работу), пустых полей нет. Пробелов лишних нигде нет, ";" заменил на ",".
причем, кол-во отображения ошибки = кол-ву полей для импорта ;)
"New-ADUser : Не удается проверить аргумент для параметра "Name". Аргумент пустой или имеет значение NULL. Укажите не пу
стой аргумент, не имеющий значение NULL, после чего повторите выполнение команды.
C:\scripts\GreateUser.ps1:1 знак:92
+ Import-CSV -Path "C:\scripts\createuserbat.csv" | ForEach-Object -process {New-ADuser -Name <<<< $_.Name -Surname $_
.Surname -City $_.City -Department $_.Department -GivenName $_.GivenName -Title $_.Title -Description $_.Description -D
isplayName $_.DisplayName -Division $_.Division -EmailAddress $_.EmailAddress -MobilePhone $_.MobilePhone -ScriptPath $
_.ScriptPath -Path "ou=Users_Test,dc=Test,dc=ru" -CannotChangePassword $true -ChangePasswordAtLogon $false -PasswordNot
Required $true -Company TEST}
+ CategoryInfo : InvalidData: (:) [New-ADUser], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.ActiveDirectory.Management.Commands.NewADUser"
Вот код самого .ps1 файла:
"
Import-CSV -Path "C:\scripts\createuserbat.csv" | ForEach-Object -process {New-ADuser -Name $_.Name -Surname $_.Surname -City $_.City -Department $_.Department -GivenName $_.GivenName -Title $_.Title -Description $_.Description -DisplayName $_.DisplayName -Division $_.Division -EmailAddress $_.EmailAddress -MobilePhone $_.MobilePhone -ScriptPath $_.ScriptPath -Path "ou=Users_Test,dc=omgk.com.ua,dc=ru" -CannotChangePassword $true -ChangePasswordAtLogon $false -PasswordNotRequired $true -Company TEST}
"
Возникли сомнения, по поводу того, что нужно вписывать в значение "dc", вместо "test" и "ru". Можете посмотреть?
no subject
Date: 2012-06-18 08:52 am (UTC)проверяйте код, любой символ может быть кривым
сохраняйте обязательно в кодировке UTF-8, или Unicod (лучше первое)
по-моему просто пробел между Name $
полный путь до OU обязателен, смотрите его в свойствах OU и проверяйте
"ou=Users_testdomain,dc=testdomain,dc=ru" - то есть мы указываем полный путь, используя для обознаяений OU (контейнеров) ou=, а для доменного имени dc=
no subject
Date: 2012-07-18 03:23 am (UTC)no subject
Date: 2012-07-18 05:32 am (UTC)no subject
Date: 2013-10-23 10:39 am (UTC)Не удается привязать аргумента к параметру "String", так как он имеет значение NULL.
и ведь ниче не менял в батниках
полез в инет
нашел свой же пост
проблема оказалась в том, что ЗАБЫЛ поменять точки с запятой (;) на запятые (,)
заменил - понеслась)))
no subject
Date: 2016-09-28 10:24 am (UTC)отображение имен
Date: 2016-10-25 12:59 pm (UTC)этим же циклом добавить юзверей в группы a1 a2 b3
Date: 2016-12-04 11:46 pm (UTC)add-adgroupmember "а1","а2","б3" -Member $_.SamAccountName
не работает, или я не туда вставляю команду?((я только учус, не ругайте
и еще, попутно, не добавляется строка Имя для входа пользователя и @test.local не добавляется, а нижняя строка в пользователе (Пред windows 2000) там логин и домен добавляется правильно..
ну и чтоб совсем вопросов не было больше на первые два дня) что указать чтобы пользователь не мог сменить пароль и сделать пароль вечным, без возможности смены (Запретить смену, срок действия неограничен)
Заранее благодарен
Re: этим же циклом добавить юзверей в группы a1 a2 b3
Date: 2016-12-05 05:33 am (UTC)Get-ADUser -filter {(Department -eq "NAME_PODRAZDELENIA")} | ForEach-Object -process {Add-ADGroupMember -identity "NAME_PODRAZDELENIA" -Members $_.SamAccountName}
*Перед запуском не забываем выполнить
*Set-ExecutionPolicy Unrestricted - разрешения выполнения скриптов (на всякий случай)
*и
*import-module activedirectory (загрузка модуля управления АД)
*детальный разбор:
*Get-ADUser -filter {(Department -eq "Buhgalteria")} - получаем из АД пользователей, отфильровывая их по заполненному полю Department (это поле можно увидеть в свойствах учетки \ вкладка Организация \ строка Отдел)
*| ForEach-Object -process - передаем каждый объект в конвейер обработки
*{Add-ADGroupMember -identity "Buhgalteria" -Members $_.SamAccountName} - для каждого объекта в конвейере выполняется команда добавления в группу "Buhgalteria" на основе свойства SamAccountName.
Имя для входа пользователя - зачем? Мне не было нужно, если вам нужно - ищите во вкладке редактора атрибутов как оно значит, добавляйте параметр в файл для импорта, строку в скрипт
В описанном скрипте именно так:пароль получается "вечным" и менять его пользователь не может (ну в моем домене). Если у вас получается по другому - ппопробуйте заглянуть в default domain policy и полиику для пользователей (если есть), возможно у вас там выставлен параметр "Требовать смены при первом входе"
Re: этим же циклом добавить юзверей в группы a1 a2 b3
Date: 2016-12-05 08:12 am (UTC)