Заметки о Windows и других программных продуктах Microsoft...

Автоматизируем создание учетных записей с помощью PowerShell

Автоматизируем создание учетных записей с помощью PowerShell

В самом простом варианте создание новой учетной записи пользователя занимает примерно пару минут. Открываем оснастку «Active Directory – Users and Computers», заходим в нужное подразделение (OU), в меню выбираем Создать — Пользователь, вводим имя пользователя и пароль. Все, учетка готова, можно работать.
А теперь представьте, что таким образом вам надо создать не одну, а скажем 50 учетных записей, и делать это регулярно.


Поскольку наврядли кому-то нравится проводить время, тупо набирая учетные данные пользователей, то делаем простой вывод — процесс заведения пользователей надо автоматизировать. И поможет нам в этом PowerShell.

Итак, представим, что нам нужно срочно создать 50 однотипных учетных записей. Пишем вот такой скрипт:

$org=″OU=Students,DC=contoso,DC=com″ 
$username=″student″
$count=1..50
foreach ($i in $count) 
{ New-AdUser -Name $username$i -Path $org -passThru }

создание однотипных учетных записей

 

Запускаем скрипт, и в подразделении Students создается 50 пользователей с именами student1-student50. По умолчанию учетки создаются отключенными, и пользователи все равно будут вынуждены к вам обращаться для их активации. Попробуем этого избежать:

$org=″OU=Students,DC=contoso,DC=com″
$username=″student″
$count=1..50
foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $org -Enabled $True -ChangePasswordAtLogon $true  `
-AccountPassword (ConvertTo-SecureString «p@$$w0rd» -AsPlainText -force) -passThru }

Здесь создаем учетные записи уже активными и задаем p@$$w0rd как  пароль по умолчанию, а также указываем сменить его при первом входе в систему. Чтобы не передавать пароль в открытом виде, используем командлет ConvertTo-SecureString, который  переводит текстовую строку в защищенный формат

Теперь сделаем наш скрипт чуть более гибким. Используя командлет Read-Host заставим наш скрипт запрашивать имя  и количество пользователей:

$org=″OU=Students,DC=contoso,DC=com″
$username=Read-Host ″Enter name″
$number=Read-Host ″Enter number″

$count=1..$number
foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $org -Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString ″p@$$w0rd″ -AsPlainText -force) -passThru }

задаем имя и количество пользователей

 

Учетные записи созданы, пользователи могут заходить в систему и работать. Теперь их надо настроить — добавить в группы безопасности, прописать домашний каталог, сценарии входа и т.п. Сделать это можно с помощью шаблона. Проще говоря, создаем шаблонную учетную запись, полностью настраиваем ее, а затем делаем с нее нужное количество копий с помощью параметра -Instance :

$template = Get-AdUser -Identity ″student″
$org=″OU=Students,DC=contoso,DC=com″  
$username=Read-Host ″Enter name″
$number=Read-Host ″Enter number″

$count=1..$number
foreach ($i in $count)
{ New-AdUser -Name $username$i -UserPrincipalName $username$i -Path $org -Instance `
$template -Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString ″p@$$w0rd″ -AsPlainText -force) -passThru }

копирование пользователя

 

Еще один способ автоматизировать создание учетных записей — импортировать их из CSV-файла. Этот способ подойдет в том случае, если вам предоставили список пользователей, и им надо завести учетные записи в соответствии с этим списком. Как правило, подобные списки создаются в Excel в виде таблицы со столбцами Имя, Должность, Отдел и т.п., примерно такого вида:

список пользователей

 

Наша задача — сохранить его в формате CSV и затем указать в скрипте с помощью командлета Import-CSV. Если ваш CSV-файл содержит все необходимые столбцы, то New-ADUser автоматически свяжет их с правильными атрибутами пользователя :

$csv = Import-CSV -Path ″C:\scripts\users.csv″
$csv | New-AdUser  -Path $org -Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString ″p@$$w0rd″ -AsPlainText -force) -passThru

импорт из файла CSV

 

Таким образом можно импортировать сотни новых пользователей за несколько секунд, но есть в этом методе и подводные камни:

  • Названия столбцов должны полностью совпадать с названиями атрибутов пользователя, например Name (Имя), Organization (Организация), Title (должность), иначе ничего не получиться. Полный список атрибутов можно посмотреть здесь.
  • В таблице обязательно нужно указать SamAccountName, в противном случае будет выдана ошибка о том, что учетная запись уже существует.
  • Если атрибуты задаватьть в русской раскладке, как в нашем примере, то могут возникнуть проблемы с кодировкой. В решении этой проблемы мне помогло извлечение содержимго CSV-файла с помощью командлета Get-Content и сохранение его в другой CSV-файл: Get-Content users.csv >> users1.csv. После этого все русскоязычные атрибуты стали отображаться нормально.

В заключение несколько важных моментов:

Для запуска командлета New-ADUser необходимо предварительно импортировать модуль Active Directory для PowerShell. Делается это командой Import-Module ActiveDirectory, можно просто вставить эту строку в скрипт. Исключение составляет случай, когда вы запускаете скрипт из специальной оснастки «Модуль Active Directory для Windows PowerShell».

Модуль ActiveDirectory доступен на серверах под управлением Windows Server 2008R2/2012, а также на рабочих станциях Windows 7/8 c установленным пакетом администрирования RSAT.

Для работы модуля ActiveDirectory необходима веб-служба Active Directory (ADWS), предоставляющая веб-интерфейс для доступа к службе каталогов. По умолчанию эта служба устанавливается автоматически при добавлении ролей сервера AD DS и AD LDS на серверах под управлением Windows Server 2008R2 и выше. Для Windows Server 2003\2008 эту службу можно установить отдельно, скачав отсюда.

 
 
Комментарии

1) Скрипты настроил. PowerShell пишет, что пользователи созданы. Но в AD они не появляются. при повторном запуске скрипта выдаются сообщения об ошибке, что такие пользователи уже созданы.
2) Нигде не нашел как импортировать настройки шаблона в CSV файл, чтобы там были все поля. При импорте из AD создаются только три поля (имя, тип, описание). Как получить имена всех полей в нужном порядке?
Подскажите пожалуйста.
С уважением,
Сергей Пензов

1) Если скрипт отрабатывает без ошибок, то пользователи скорее всего созданы. По дефолту все новые учетки попадают в подразделение Users, поищите там или воспользуйтесь поиском по AD.
2) Если речь идет об экспорте пользователей в csv-файл, то можно воспользоваться специально предназначенной для этого утилитой csvde.exe, либо командлетом Get-ADUser, который тоже умеет делать вывод в csv.

A mozhete objasnitj cto znachit «$i» v skripte?

Это переменная в цикле, т.е. для каждого значения $i из массива $count.

Александр

Добрый день!
Привел скрипт к виду:
$org=»OU=11CLASS,OU=HIGHSCHOOL,OU=ACCOUNTS,DC=SCHOOL,DC=LAN»
$username=»stud-2003-»
$count=10..50
foreach ($i in $count)
{ New-AdUser -Name $username$i -Path $org -Enabled $True -ChangePasswordAtLogon $true `
-AccountPassword (ConvertTo-SecureString «password» -AsPlainText -force) -passThru }

Однако при запуске скрипта ничего не происходит

Подскажите пожалуйста в чем ошибка?

Александр

При копировании в сообщение кавычки изменили свой вид, в срипте они введены правильно

Ошибка может быть в том, что пароль не соответствует требованиям политики (мин. длина, сложность и т.п), или не создана OU для учетных записей. А вообще должно выводиться сообщение об ошибке.

Александр

в политике требования для пароля выставлены минимальные, вручную пользователи создаются с таким паролем, контейнер OU создан, смотрел ещё раз в редакторе ADSI. В том то и дело, что вообще ничего не выводится…

Сам скрипт написан правильно. Попробуйте добавить в начало скрипта команду Start-Transcript -Path «file.txt», в конец — Stop-Transcript. Все действия скрипта будут записаны в указанный файл.

Александр

Kirill, Файл тоже не создается по указанному в скрите пути….

Ну прям чудеса 🙂
Проверьте, разрешено ли выполнение скриптов. Из консоли с правами администратора, командой Get-ExecutionPolicy

Александр

Restricted

Александр, предыдущий комментарий удалил, уж слишком большая портянка получилась.
Смысл ошибки в том, что модуль для Active Directory не загружен в текущем сеансе. Надо в скрипт, в начало, добавить команду Import-Module ActiveDirectory. И еще, этот модуль дефолту установлен только на контроллерах домена, на рядовых серверах его надо добавлять отдельно.

Александр

Огромное спасибо, получилось!

Александр

Дело в том, что это и есть контроллер домена, поэтому даже подумать не мог, что могут быть такие траблы

Добрый день. Последнее время появилось потребность в написании скрипта для создания пользователей. Я мало что в этом понимаю, но понять хочу) Сначала хотелось бы задать идиотский вопрос — заработает ли этот скрипт на Windows 7, при том, что установлен Remote Server Administration Tools???

Что я не пробовал — ничего не работает. Я, видимо, что-то глобально важное и начальное упустил…

Скрипт можно запускать и на семерке с установленным RSAT. Из глобального и важного:
1) Для работы с AD необходим домен-контроллер Windows Server 2008R2 (или выше);
2) Обязательно надо сделать импорт модуля AD;
3) Консоль PS надо запускать с правами администратора;
4) Скрипт для создания пользователей надо запускать под учетной записью, имеющей соответствующие права в домене.

Вооот… Я полный утюг, и поэтому прошу вас расписать пункты 1 и 2. Как это сделать? И что это значит?

1) В домене должен быть хотя бы один контроллер под управлением Windows Server 2008R2 (и выше). На Windows Server 2003\2008 все вышеописанное не работает.
2) В начало скрипта вставить команду Import-Module ActiveDirectory. Эта команда импортирует в текущий сеанс необходимые командлеты.

То есть, мне всё равно нужно установить Windows Server 2008R2? Ведь там же нужно добавлять контроллер домена?
Или можно как-то создать контроллер из-под Win7 ?

Стесняюсь спросить 🙂 , у вас домен есть ?

Ну,насколько я смог понять, его можно создать в Win Server 2008, типа contoso.com или domain.local. Это вы имеете в виду?

Именно это. Если у вас нет домена Active Directory, то что же вы собирались автоматизировать?

ну значит домен присутствует.
1. Get-Module не показывает наличие ActiveDirectory.
2. Import-Module AD — не работает.

3. вот, пробовал выполнить скрипт.
**********************
Windows PowerShell Transcript Start
Start time: 20131027204738
Username : CORP\Administrator
Machine : WIN-LR9TXBBBSHG (Microsoft Windows NT 6.0.6002 Service Pack 2)
**********************
Transcript started, output file is report.txt
Import-Module : The specified module ‘ActiveDirectory’ was not loaded because no valid module file was found in any mod
ule directory.
At C:\scripts\user_add.ps1:2 char:14
+ Import-Module <<<< ActiveDirectory
+ CategoryInfo : ResourceUnavailable: (ActiveDirectory:String) [Import-Module], FileNotFoundException
+ FullyQualifiedErrorId : Modules_ModuleNotFound,Microsoft.PowerShell.Commands.ImportModuleCommand

Enter name: Student
Enter number: 2
The term 'New-AdUser' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\scripts\user_add.ps1:8 char:13
+ { New-AdUser <<<< -Name $username$i -Path $org -Enabled $True -ChangePasswordAtLogon $true `
+ CategoryInfo : ObjectNotFound: (New-AdUser:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

The term 'New-AdUser' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the
spelling of the name, or if a path was included, verify that the path is correct and try again.
At C:\scripts\user_add.ps1:8 char:13
+ { New-AdUser <<<< -Name $username$i -Path $org -Enabled $True -ChangePasswordAtLogon $true `
+ CategoryInfo : ObjectNotFound: (New-AdUser:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException

**********************
Windows PowerShell Transcript End
End time: 20131027204751
**********************

Судя по логу, у вас нет необходимого модуля.
Чтобы не повторять каждый раз, в конце статьи добавил необходимые требования.

Да, про эту службу я тоже слышал. Но и тут у меня проблемка — захожу из-под своей Windows Server 2008 (32-bit) и при установке выдает такое — «Обновление не применимо к этой системе».

Помогите, пожалуйста, решить эту проблему.

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

Поставил заново Windows Server 2008R2. Вроде бы всё — финиш, но нет… И тут ошибочка —
New-ADUser: Объект каталога не найден. Я зашел в «Пользователи и компьютеры» и там создал свою группу Students, с типом «Безопасность» и областью «Глобальная».

Скажите, пожалуйста, ну что я ещё не так сделал?)

Я полагаю, надо создать не группу безопасности Students, а Organisation Unit (OU) c таким именем. Либо убрать из скрипта параметр -Path, тогда все учетки будут помещены в OU Users.

Я хочу сказать Вам ОГРОМНОЕ СПАСИБО, за оказанную помощь! Без Вас, я бы не справился! Всё получилось, всё работает)

Рад что смог помочь 🙂

Помогите пожалуйста.
Добавляю пользователей через CSV, там такие вот поля: Name, AccountPassword, GivenName, Surname, DisplayName, UserPrincipalName, SamAccountName, ProfilePath, Path.
Пользователи добавляются нормально, кроме пароля, то есть он получается пустым и я могу зайти под него указав только логин.

Вот скрипт:
Import-Module ActiveDirectory
$Users = Import-CSV users.csv –Delimiter «;»
$Users | New-ADUser -Enabled $True -ChangePasswordAtLogon $False -CannotChangePassword $True -PasswordNeverExpires $True

Что я делаю не так?)

У вас есть строка -AccountPassword (ConvertTo-SecureString ″p@$$w0rd″ -AsPlainText -force) но получается что у всех один пароль но мне так не надо, как в эту строку вместо p@$$w0rd поставить значение из CSV?

поставь переменную и назначь поле с CSV

Настройки политик паролей вот такие:

Вести журнал паролей сохранено паролей: 0
Максимальный срок действия пароля: 0 дн
Минимальная длина пароля знаков: 0
Минимальный срок действия пароля: 0 дн
Пароль должен отвечать требованиям сложности: Отключено
Хранить пароли, используя обратимое шифрование: Отключено

Можно передать значение столбца AccountPassword через переменную:
-AccountPassword (ConvertTo-SecureString $_.AccountPassword -AsPlainText -force)
Хотя я бы сделал -ChangePasswordAtLogon $True, а уже пользователи сами при первом входе сменят пароль.

Сделал как вы и сказали и получил ошибку:
Не удается привязать аргумента к параметру «String», так как он имеет значение NULL

Здесь надо цикл делать, примерно так:
$Users | Foreach-Object -Process {New-ADUser -Name $_.Name -Enabled $True -ChangePasswordAtLogon $False -CannotChangePassword $True -PasswordNeverExpires $True -AccountPassword (ConvertTo-SecureString $_.AccountPassword -AsPlainText -force)}

Хорошо попробую завтра.

Все получилось. Спасибо большое!!!

Добрый день! А не подскажите как модифицировать чтоб можно было параметр Path добавлять из csv файла?

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

да все заработало ) был неправильно вбит этот параметр ибо на работе и дома отличаются OU и DC

Добрый день еще раз.
Подскажите пожалуйста какой атрибут отвечает за членство в группе? Что то не нашел такого). Мне надо поменять группу «Пользователь домена» на скажем «Student».

Если речь о группе безопасности Domain Users, то сменить ее нельзя, в нее входят все пользователи домена без исключения. Да и зачем это делать, мне не очень понятно. А вот добавить пользователей в группу можно, например так:
Get-ADUser -Filter ‘Name -like ″student*″’ | Add-ADprincipalGroupMemberShip -MemberOf Student

А может кто подскажет какой параметр отвечает за пункт «Срок действия пароля не ограничен»

-PasswordNeverExpires $True

А можно при создании пользователя запросить пароль так: Read-host «Enter a Password:» -assecurestring
И как потом как я понимаю переменную $pwd_secure_string прикруть к параметру -AccountPassword ?
Можно просто указать её как значение типа -AccountPassword ( $pwd_secure_string) -passThru }
Спасибо

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

Import-Module ActiveDirectory
$org=»OU=test,DC=region,DC=corp,DC=local»
$csv = Import-CSV -Path «C:\users.csv»
$csv | New-AdUser -Path $org -Enabled $True -ChangePasswordAtLogon $true `-AccountPassword (ConvertTo-SecureString «BHk*^%jhjh» -AsPlainText -force) -passThru

получаю ошибку
New-ADUser : Не удается найти позиционный параметр, принимающий аргумент «System.Security.SecureString».

подскажите плз.

Возможно проблемы с кавычками, попробуйте вводить команды руками, в одну строку. И пароль можно придумать попроще, может PoSh воспринимает какой то из символов как управляющий.

и с кавычками и без кавычек и с разными кавычками и руками пробовал и пароль пробовал разный валится эта ошибка. Очень понравилась простота скрипта, хотелось бы закостомайзить его под себя.

А если так:
$pwd = ConvertTo-SecureString ″BHk*^%jhjh″ -AsPlainText -force
$csv | New-AdUser -Path $org -Enabled $True -ChangePasswordAtLogon $true -AccountPassword $pwd -passThru

Уважаемые гуру powershell у меня проблема с импортом csv. Выдает ошибку:
New-ADUser : Не удается привязать объект ввода к любым параметрам команды, так как команда не принимает входные данные конвейера, либо входные д
анные и их свойства не совпадают с любыми из параметров, принимающих входные данные конвейера.

Ума не приложу в чем касяк((( Помогите пожалуйста, подскажите чем лечить, куда копать?

Для начала почитать про конвейер https://technet.microsoft.com/en-us/library/hh847902.aspx

Для того чтобы нормально импортировался файл CSV с русскими именами его надо выгружать в кодировке UTF-8. Самое простое открыть его нотепадом и потом сохранить как с выбором кодировки.

Добрый день, а можно ли прикрутить скрипт к серверу(2008r2) без домена

Нет, нельзя. Управление локальными учетками — это отдельная тема.

Андрей

Здравствуйте. Подскажите, пожалуйста, как обновить параметры у уже имеющихся учетных записей? Например, добавить всем № телефона или почту прописать. Спасибо.

С помощью командлета Set-AdUser.

Добрый день. Спасибо огромное за статью. Использую вариант импорта пользователей из CSV. все работает отлично подскажите как модифицировать скрипт что бы пользователи в момент добавления добавлялись в группу указанную в том же CSV. Заранее очень благодарен!

Алексей

Советую воспользоваться утилитой «Active Directory Bulk Operations». Программа позволяет пакетно создавать и редактировать учетные записи пользователей, а так же копировать учетные записи с сохранением членства в группах и полной иерархией организационных единиц в другой домен! Скачать можно тут: http://www.sysadminsoft.ru/active-directory-bulk-operations

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

Заранее очень благодарен!

Можно с помощью Start-Transcript\Stop-Transcript, подробно описано здесь: http://windowsnotes.ru/powershell-2/start-transcript-i-stop-transcript/

Добрый день Кирилл, спасибо за ваш ответ. Последние время я импортирую пользователей с разных офисов из CSV-файла, добавляю их в группы безопасности, добавляю адреса электронной почты и другие атрибуты,
подскажите пожалуйста как использовать (powershell logging) функцию, вместо » Start-Transcript» cdmleta.
Заранее очень благодарен!

Михаил

Я в системном администрировании плохо разбираюсь. Помогите разобраться.
У меня есть VPS сервер на Windows, домена на нем нет и не нужно.
Задача: создание большого количества локальных учетных записей с правами администратора, с последующим периодическим удалением. Ну то есть создал учетки и спустя допустим 10 дней удалил.
Сейчас я работаю так: захожу на сервер и создаю учетки в ручную через lusrmgr.msc. Хотелось бы автоматизировать этот процесс. Готов заплатить!
Кто готов помочь пишите, пожалуйста на почту m.kamenev89@yandex.ru