Типовые задачи администрирования AD
Всем администраторам Active Directory периодически приходится сталкиваться с рутинными задачами, которые хотелось бы так или иначе автоматизировать. Как правило, это делается с использованием скриптов на наиболее известных языках программирования: VBScript, Jscript, PowerShell. Последний я считаю наиболее удобным. Благодаря некоторым из его особенностей те же процедуры, которые занимают в VBScript десяток строк и требуют понимания работы WMI, LDAP и еще многих китайских слов – в PowerShell занимает всего пять строк и требуют всего лишь знания программирования на уровне школьных уроков информатики. В настоящей статье мы рассмотрим типовые задачи администрирования Active Directory, и их автоматизацию с помощью PowerShell.
P.S. Статья рассчитана на полных, или почти полных «чайников», пару раз видевших или где-то слышавших о PowerShell. На звание Терминатора не претендую, по сему просьба ногами не пинать.
Общие положения
Предполагается, что читатели уже хотя бы немного знакомы с оболочкой PowerShell и написанием скриптов. Тех, кто не знаком – хотелось бы отослать к списку ресурсов в конце статьи.
В первую очередь, необходимо заметить, что для того, чтобы все нормально работало – необходимо иметь хотя бы один контроллер домена Windows Server 2008 R2 с установленной компонентой ActiveDirectory Web Services. Увы и ах, Windows Server 2003 уходит на свалку истории. Для работы с модулем ad_powershell необходимо установить Remote Server Administration Tools, его так же можно установить на рабочем компьютере и запускать скрипты оттуда. Разумеется, ОС на компьютере должна быть не ниже Windows 7. На контроллерах домена Windows Server 2008 R2 необходимые компоненты уже установлены.
Перед тем, как выполнять скрипты – необходимо установить политику выполнения скриптов. По умолчанию, в целях безопасности включена политика Restricted, что означает, что на данном компьютере вообще запрещен запуск любых PowerShell-скриптов. О том, какие еще бывают политики выполнения – можно почитать в мануале:
Get-Help Set-ExecutionPolicy –Detailed
В нашем случае я рекомендую установить политику RemoteSigned, что позволит запускать любые собственноручно написанные скрипты, при этом запуск скриптов, скачанных из Интернета будет возможен только при наличии цифровой подписи с доверенным сертификатом. Запустите оболочку PowerShell с правами администратора (Run as Administrator) и выполните команду
Set-ExecutionPolicy RemoteSigned
Можно так же выбрать политику Unrestricted, что вообще позволит запускать любой скрипт, независимо от того, откуда он взялся – но я делать этого не рекомендую из соображений безопасности.
Теперь можно проверить работу скриптов – написать простейший скрипт «Hello World!». Я предпочитаю пользоваться PowerShell ISE, хотя можно писать и в простейшем Notepad’е. PowerShell ISE – удобная среда программирования для PowerShell с возможностью отладки. Входит в состав ОС Wondows 7 и 2008 R2. В общем, рекомендую.
Теперь переходим непосредственно к автоматизации. Для того, чтобы создать объекты в Active Directory, или изменить какие-либо свойства, нам необходим список объектов со всеми необходимыми параметрами. Например, список пользователей может содержать следующие парамеры: Имя, Фамилия, Логин, Пароль. Проще всего для этого использовать CSV-файл. CSV – это текстовый файл, содержащий список объектов (например – пользователей), с разделением параметров каким-либо символом (как правило, это запятая «,», хотя может быть и точка с запятой, знак табуляции и т.д.). Каждый объект обозначается одной строчкой. Так же, первая строчка может содержать список параметров.
Пример:
Name;Surname;Login;Password
Ivan,Ivanov;i.ivanov;p@ssw0rd1
Petr,Petrov;p.petrov;p@ssw0rd2
Sidor;Sidorov;s.sidorov;p@ssw0rd3
Чтобы получить список объектов из CSV-файла, используется командлет Import-CSV:
$Users = Import-CSV “c:\temp\users.csv”
Такой файл можно создать и в блокноте, но проще всего будет использовать Microsoft Excel. В Excel необходимо при сохранении файла выбрать формат CSV. Интересно, что Excel при сохранении в формат CSV в качестве разделителя использует знак “;”, хотя вроде бы написано «CSV (разделители – запятые) ». PowerShell же по умолчанию считает, что в качестве разделителя используется запятая («,»). Чтобы наш скрипт работал корректно – необходимо либо заменить в CSV-файле все точки с запятой на запятые (используя автозамену в блокноте) либо же, что на мой взгляд правильнее – указать в скрипте использовать точку с запятой в качестве разделителя:
$Users = Import-CSV “c:\temp\users.csv” –Delimiter “;”
Чтобы проверить, как прошел импорт – можно посмотреть, что хранится в переменной $Users.
Как видим, в переменной $Users теперь хранится массив объектов с параметрами Name, Surname, Login, Password. Эти параметры можно использовать для создания учетных записей пользователей в AD.
Прежде чем приступить к работе с Active Directory, необходимо произвести импорт соответствующего модуля в PowerShell. Только после этого появятся команды для работы с AD:
Import-Module ActiveDirectory
Эту строку можно (и даже нужно) вставлять в начало всех скриптов – чтобы не вводить эту команду вручную.
Создание учетных записей пользователей
Каждому, кто работал с ActiveDirectory, приходилось создавать учетные записи пользователей. И хотя это делается легко и просто – в несколько щелчков мышкой – иногда, особенно в крупных организациях, приходится создавать много учетных записей в течение дня. Иногда – в районе сотни.
Для нашего примера, в качестве списка пользователей будем брать CSV-файл со следующими полями:
- Name – имя пользователя
- Surname – фамилия пользователя
- Password – пароль
- OU – организационное подразделение, где будет находиться пользователь (вида Contoso_Users/Fin/Accounting)
Вначале нам нужно импортировать пользователей из списка:
$Users = Import-CSV $1 –Delimiter “;”
Параметр $1 означает, что в качестве пути к CSV-файлу будет использоваться первый по счету параметр командной строки. Запускаться скрипт будет следующим образом:
PS C:\Users\admin > Add_Users.ps1 c:\temp\users.csv
Далее нам нужно пройтись по всему массиву пользователей из списка:
Foreach($CurrentUser in $Users) {
Знак открытой фигурной скобки означает начало цикла. Этот цикл проходит по всем объектам списка, и прискакивает текущий объект переменной $CurrentUser.
Затем, для упрощения – присвоим значения соответствующих полей отдельным переменным:
$Name = $CurrentUser.Name
$Surname = $CurrentUser.Surname
$Password = $CurrentUser.Password
$OU = $CurrentUser.OU
Для того, чтобы задать пароль пользователю – необходимо перевести его в шифрованный формат SecureString:
$SecurePwd = ConvertTo-SecureString -AsPlainText -Force -String $Password
Так же, OU нам нужно перевести в формат, соответствующий стандарту LDAP (для примера выше: “OU=Accounting,OU= Fin,OU= Contoso_Users,DC=contoso,DC=com”).
Для этого вначале разделим строку $OU на отдельные составляющие:
$OUTmp = $OU –Split “/”
В результате переменная $OUTmp будет содержать массив из всех элементов пути:
PS C:\Users\admin> $OUTmp
Contoso_Users
Fin
Accounting
Далее, используя командлет Foreach-Object, получим из нашего массива первую часть LDAP-пути:
$Path = “” #незабудьте проинициализировать переменную!
$OUTmp | ForEach-Object {$Path = "OU=$_," + $Path}
В переменной $Path появляется первая часть LDAP-пути:
PS C:\Users\admin> $Path
OU=Accounting,OU=Fin,OU=Contoso_Users,
Теперь нам нужно получить полный путь, добавив к пути домен:
$Path += “DC=contoso,DC=com”
Получили полный LDAP-путь:
PS C:\Users\admin> $Path
OU=Accounting,OU=Fin,OU=Contoso_Users,DC=contoso,DC=com
Теперь сформируем дисплейное имя пользователя, его логин, User Principal Name.
$Login = $Name[0] + “.” + $Surname #логин формируется из первой буквы имени и фамилии, например: i.ivanov
$Displayname = $Name + “ “ + $Surname #Дисплейное имя: Ivan Ivanov
$UserPrincipalName = $Login + “@contoso.com”
Наконец, можно перейти к самой главной процедуре: созданию учетной записи пользователя.
New-ADUser $Displayname –SamAccountName $Login –UserPrincipalName $UserPrincipalName -DisplayName $DisplayName -AccountPassword $SecurePwd -ChangePasswordAtLogon 1 -Path $Path
Здесь, в принципе, все параметры понятны. Параметр -ChangePasswordAtLogon 1 означает, что пользователю будет предложено сменить пароль сразу после логина.
По умолчанию в PowerShell, в отличие от стандартного визарда в оснастке ActiveDirectory Users And Computers учетные записи только что созданных пользователей будут отключены (Disabled). Поэтому сразу после создания учетные записи нужно включить:
Enable-ADAccount $Login
Теперь нужно закрыть цикл знаком «}». Можно сохранять скрипт и пробовать.
Готовый скрипт будет выглядеть следующим образом:
Import-Module ActiveDirectory
$Users = Import-CSV $1 –Delimiter “;”
Foreach($CurrentUser in $Users) {
$Name = $CurrentUser.Name
$Surname = $CurrentUser.Surname
$Password = $CurrentUser.Password
$OU = $CurrentUser.OU
$SecurePwd = ConvertTo-SecureString -AsPlainText -Force -String $Password
$OUTmp = $OU –Split “/”
$Path = “” #незабудьте проинициализировать переменную!
$OUTmp | ForEach-Object {$Path = "OU=$_," + $Path}
$Path += “DC=contoso,DC=com”
$Login = $Name[0] + “.” + $Surname
$Displayname = $Name + “ “ + $Surname #в кавычках — пробел!
$UserPrincipalName = $Login + “@contoso.com”
New-ADUser $Displayname –SamAccountName $Login –UserPrincipalName $UserPrincipalName -DisplayName $DisplayName -AccountPassword $SecurePwd -ChangePasswordAtLogon 1 -Path $Path
Enable-ADAccount $Login
}
Создание учетных записей компьютеров
Как известно, для работы с Active Directory перво-наперво необходимо вводить компьютеры в домен. Сделать это можно двумя способами:
- Мышкой – самый известный способ, через «Свойства» «Моего компьютера». Легко и просто.
- Командой netdom join. Тоже несложно, и можно использовать в скриптах.
У первого способа есть существенный недостаток: учетные записи компьютеров создаются в дефолтном OU Computers. В организациях же, как правило имеются разные OU для разных типов компьютеров (сервер, десктоп, ноутбук), а так же отдельные OU для разных отделов/департаментов/и т.д., с различными групповыми политиками, действующими для разных OU. Поэтому после ввода компьютеров в домен необходимо переносить учетные записи компьютеров вручную в соответствующий OU, а затем перезагружать компьютер еще раз, чтобы на нем применились все необходимые политики. При использовании команды netdom можно указать нужное OU, но набирать все это с клавиатуры – та еще задачка, особенно – когда компьютеров много, и особенно, что часто бывают – задачку эту поручают простым эникейщикам. Где-то в какой-то букве обязательно ошибется.
Самый лучший выход из этой ситуации – создать учетные записи компьютеров заранее, в соответствующих OU. Тогда компьютер сразу после ввода в домен и перезагрузки применит все соответствующие политики.
Разумеется, учетные записи компьютеров, как и пользователей, можно создавать и вручную. Но, поскольку мы – админы, а не эникейщики – будем использовать PowerShell.
Для учетных записей, как и для компьютеров, используем CSV-файл
ComputerName;OU
Server1;Cnotoso_Computers/Servers
Server2;Cnotoso_Computers/Servers
Desktop1;Cnotoso_Computers/Desktops
Desktop2;Cnotoso_Computers/Desktops
Desktop3;Cnotoso_Computers/Desktops
Laptop1;Cnotoso_Computers/Laptops
Далее, пишем скрипт по аналогии со скриптом для учетных записей пользователей, только он будет немного проще:
Import-Module ActiveDirectory
$Computers = Import-CSV $1 –Delimiter “;”
Foreach($CurrentComputer in $Computers) {
$ComputerName = $CurrentComputer.ComputerName
$OU = $CurrentComputer.OU
$OUTmp = $OU –Split “/”
$Path = “” #незабудьте проинициализировать переменную!
$OUTmp | ForEach-Object {$Path = "OU=$_," + $Path}
$Path += “DC=contoso,DC=com”
New-ADComputer –Name $ComputerName –Path $Path
}
Массовый сброс паролей
Иногда бывает необходимо массово сбросить пароли у множества пользователей.
Структура CSV-файла:
Login – логин пользователя
NewPassword – новый пароль
Import-Module ActiveDirectory
$Users = Import-CSV $1 –Delimiter “;”
Foreach($CurrentUser in $Users) {
$Login = $CurrentUser.Login
$NewPassword = $CurrentUser.NewPassword
$SecurePwd = ConvertTo-SecureString -AsPlainText -Force -String $Password
Set-ADAccountPassword –Identity $Login –Reset –NewPassword $SecurePwd
}
Массовое изменение параметров
Допустим, в вашей организации были приняты новые корпоративные стандарты, которые требуют, чтобы у каждого пользователя в AD были указаны, помимо всего остального: адрес электронной почты, номер мобильного телефона, название организации, должность. Из отдела кадров вам прислали табличку со следующими полями:
- Имя
- Фамилия
- Телефон
- Организация (у компании несколько юр.лиц)
- Должность
Из нее мы создаем CSV-файл с полями:
- Name
- Surname
- Phone
- Organization
- JobTitle
Скрипт будет следующего вида:
Import-Module ActiveDirectory
$Users = Import-CSV $1 –Delimiter “;”
Foreach($CurrentUser in $Users) {
$Name = $CurrentUser.Name
$Surname = $CurrentUser.Surname
$Email = $CurrentUser.E-Mail
$Phone = $CurrentUser.Phone
$Organization = $CurrentUser.Organization
$JobTitle = $CurrentUser.JobTitle
$Login = (Get-ADuser –Filter {GivenName –eq $Name –and Surname –eq $Surname}).SamAccountName #ищем юзера с заданным именем и фамилией и возвращаем его логин
Set-ADUser $Login –EmailAddress $Email –MobilePhone $Phone –Company $Organization –Title $JobTitle
}
Заключение
В этой статье я попытался рассмотреть простейшие скрипты для автоматизации наиболее часто встречающихся задач администрирования Active Directory. На самом деле, я намеренно не стал чересчур усложнять скрипты, чтобы можно было понять логику работы.
Попробуйте сами вооружиться гуглом и ресурсами, указанными в конце статьи и улучшить скрипты самостоятельно.
Например:
- Добавить обработку ошибок (например, если пользователь с таким именем уже существует, или наоборот – не существует) – конструкции типа try… catch…
- Автоматическую генерацию паролей заданной длины и сложности
- Вывод логинов с автоматически сгенерированными паролями для только что созданных учетных записей в CSV-файл — командлет Export-CSV
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.