parafoxer: (foxic)
[personal profile] parafoxer
Столкнулся и ничего толкового в инете не нашел. Все какие-то урывки и куски. Батник (просто BAT) у нас есть, но как-то на 2008 сервере уже несерьезно))). Решил написать его сам. Получилось.
Ну и теперь решил описать так, чтобы ЛЮБОМУ было понятно, кто хоть чуть-чуть видел 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)
From: [identity profile] sabaka-xx.livejournal.com
Как заставить этот скрипт работать с поддоменами
У меня домен: domain1.domain2.int я изменил параметр -Path
-Path "OU=Users,DC=donain1,DC=domain2,DC=int"
получаю ошибку "Объект каталога не найден"

Re: Вопрос...

Date: 2012-01-10 03:10 am (UTC)
From: [identity profile] parafoxer.livejournal.com
Не совсем понял про поддомен. Есть лес, в нем есть домены...
Самое простое в вашем случае по-моему просто посмотреть в свойствах объекта каталога правильный путь к нему.
Т.е. открываем оснастку АD, и смотрим свойства каталога, куда требуется создать пользователей (это не обязательно должен быть Users) - вкладка "Объект"
Ну и если вы пишете вот так:
DC=donain1
то тут у вас ошибка в букве do_n_ain1

Re: Вопрос...

Date: 2012-01-11 10:04 am (UTC)
From: [identity profile] sabaka-xx.livejournal.com
У меня скрипт заработал только после добавления параметра -SamAccountName $_.Name

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}

После этого все заработало.

Date: 2012-02-21 11:13 am (UTC)
From: [identity profile] vovkanah.livejournal.com
а будет ли это всё работать на 2k3 Server'е?

Date: 2012-02-21 11:42 am (UTC)
From: [identity profile] parafoxer.livejournal.com
если честно - не пробовал, в домене с КД на 2003 использую старые батники
кто-то из коллег пробовал, но у меня сложилось впечатление что там нужны нехилые пляски с бубном и установка какого-то стороннего софта, кроме пауэршела, квест софтваре что ли.

Date: 2012-03-05 07:58 am (UTC)
From: [identity profile] vovkanah.livejournal.com
был бы признателен, если Вы поделились этими старыми батниками. Посмотреть, допилить, если надо будет

Date: 2012-03-06 08:22 am (UTC)
From: [identity profile] parafoxer.livejournal.com
Ну собственно а почему нет.
синтаксис не такой прозрачный, как в пауэршеле, но основные шаги поясню:

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 категорически не нравится - я не программист, я администратор, и вникать в программные загогулины никакого желания не имею))
Удачного запуска, коллега)))
Edited Date: 2012-03-06 08:25 am (UTC)

Date: 2012-06-14 01:11 pm (UTC)
From: [identity profile] vladimir arnaut (from livejournal.com)
Добрый день. Спасибо за статью. Помогите разобраться с проблемой импорта.
Выбивает ошибку:
"ConvertTo-SecureString : Не удается привязать аргумента к параметру "String", так как он имеет значение NULL.
C:\scripts\CreateUser.ps1:1 знак:547"

я, так понимаю, это связанно с полем пароля в файле исходных данных. Но в чем может быть проблема? Пароль введен "Qq123456".

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

Date: 2012-06-14 01:39 pm (UTC)
From: [identity profile] parafoxer.livejournal.com
сильно не помогу, ибо написал и забыл))) помню только что сразу паролем учетку может не давать создавать, отчего - уже не помню
поэкспериментируйте, создайте без пароля, попробуйте другой пароль(тут важно какие у вас настройки безопасности в домене относительно длины пароля и его сложности - см. дефолт домэйн полиси, политика комп-ра\безопасность). Если создавать без пароля, то, наскоко помню,учетка будет отключена, ее можно включить потом отдельным батником и им же установить пароль...
э, голова другим занята, уж простите
Edited Date: 2012-06-14 01:41 pm (UTC)

Date: 2012-06-14 06:59 pm (UTC)
From: [identity profile] vladimir arnaut (from livejournal.com)
понимаю, бывает))

на счет политики. Идея на счет политик тоже в голову пришла. :) Вписал пароль как надо.
попробую без пароля. Спасибо. Отпишу, как попробую. ;)

Date: 2012-06-15 07:39 am (UTC)
From: [identity profile] vladimir arnaut (from livejournal.com)
убрал поле пароль. Вот что получаю. Почти такая же ошибка, подсказать что-то сможете?;)

Примечание:
файл .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". Можете посмотреть?

Date: 2012-06-18 08:52 am (UTC)
From: [identity profile] parafoxer.livejournal.com
я в поуэршеле не большой спец
проверяйте код, любой символ может быть кривым
сохраняйте обязательно в кодировке UTF-8, или Unicod (лучше первое)
по-моему просто пробел между Name $

полный путь до OU обязателен, смотрите его в свойствах OU и проверяйте

"ou=Users_testdomain,dc=testdomain,dc=ru" - то есть мы указываем полный путь, используя для обознаяений OU (контейнеров) ou=, а для доменного имени dc=
Edited Date: 2012-06-18 08:58 am (UTC)

Date: 2012-07-18 03:23 am (UTC)
From: [identity profile] Александр Курочкин (from livejournal.com)
В csv формат очень хорошо openoffice сохраняет, с кодировками нет проблем.

Date: 2012-07-18 05:32 am (UTC)
From: [identity profile] Александр Курочкин (from livejournal.com)
Да, кстати все работает, спасибо огромное, единственное: "ou" должен быть существующий.

Date: 2013-10-23 10:39 am (UTC)
From: [identity profile] parafoxer.livejournal.com
)))сегодня сам получил ошибку
Не удается привязать аргумента к параметру "String", так как он имеет значение NULL.
и ведь ниче не менял в батниках
полез в инет
нашел свой же пост
проблема оказалась в том, что ЗАБЫЛ поменять точки с запятой (;) на запятые (,)
заменил - понеслась)))

Date: 2016-09-28 10:24 am (UTC)
From: [identity profile] Алексей Кованев (from livejournal.com)
Советую воспользоваться утилитой "Active Directory Bulk Operations". Программа позволяет пакетно создавать и редактировать учетные записи пользователей, а так же копировать учетные записи с сохранением членства в группах и полной иерархией организационных единиц в другой домен! Скачать можно тут: http://www.sysadminsoft.ru/active-directory-bulk-operations

отображение имен

Date: 2016-10-25 12:59 pm (UTC)
From: [identity profile] korneenkov.livejournal.com
Если хотите, чтобы в AD отображалось имя пользователя на русском, то стоит сделать SamAccountName и Name разными столбцами и Name задать на русском.
From: [identity profile] shapovalov dmitriy (from livejournal.com)
подскажите каким образом добавить в этот же цикл автоматическое добавление пользователей в группы безопасности а1 а2 б3

add-adgroupmember "а1","а2","б3" -Member $_.SamAccountName
не работает, или я не туда вставляю команду?((я только учус, не ругайте

и еще, попутно, не добавляется строка Имя для входа пользователя и @test.local не добавляется, а нижняя строка в пользователе (Пред windows 2000) там логин и домен добавляется правильно..

ну и чтоб совсем вопросов не было больше на первые два дня) что указать чтобы пользователь не мог сменить пароль и сделать пароль вечным, без возможности смены (Запретить смену, срок действия неограничен)
Заранее благодарен
From: [identity profile] parafoxer.livejournal.com
Добавление в группу. Для каждой группы придется написать отдельную строчку (метод тупой, зато понятный и без циклов)

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 и полиику для пользователей (если есть), возможно у вас там выставлен параметр "Требовать смены при первом входе"
From: [identity profile] shapovalov dmitriy (from livejournal.com)
Очень Вам благодарен!

Profile

parafoxer: (Default)
parafoxer

September 2025

S M T W T F S
 123456
78910111213
14151617181920
21 222324252627
282930    

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 10th, 2026 11:33 am
Powered by Dreamwidth Studios