Управлять Active Directory (AD) с помощью Windows PowerShell проще, чем кажется на первый взгляд. При упоминании о PowerShell многие ИТ-специалисты полагают, что от них требуется стать знатоками сценариев. Это вовсе не так! PowerShell — механизм управления, который может взаимодействовать с интерактивной консолью управления. Интерактивные команды можно вставить в сценарий, чтобы не тратить усилия на ввод данных, но для использования PowerShell сценарии не обязательны. Наиболее распространенные задачи управления AD можно выполнить без единого сценария.

Дополнительные сведения об этом можно найти в статье «Поиск и управление группами AD», опубликованной в журнале Windows IT Pro/RE № 7 за 2012 год и «Использование PowerShell для массовых операций в AD» опубликованной в Windows IT Pro/RE № 12 за 2010 год.

Требования

Чтобы использовать PowerShell для управления AD, необходимо выполнить ряд требований. Далее я покажу, как использовать команды AD с рабочего стола Windows 7. Можно также задействовать бесплатные команды AD компании Quest Software, но в этом случае синтаксис будет несколько иным.

Для применения команд Microsoft PowerShell необходим контроллер домена (DC) Windows Server 2008 R2. Иначе можно загрузить и установить службу Active Directory Management Gateway Service на контроллерах домена с более старыми версиями операционной системы. Внимательно прочтите комментарии к установке; в процессе установки потребуется перезагрузить DC.

На стороне клиента загрузите и установите набор инструментов Remote Server Administration Tools (RSAT) для Windows 7 или Windows 8. В Windows 7 необходимо открыть раздел Programs на панели управления и выбрать Turn Windows Features On or Off (включение или отключение компонентов Windows). Прокрутите список до Remote Server Administration Tools (средства удаленного администрирования сервера) и разверните Role Administration Tools (средства администрирования ролей). Установите соответствующие флажки в AD DS and AD LDS Tools (средства AD DS и AD LDS), особенно флажок для Active Directory Module for Windows PowerShell (модуль Active Directory для Windows PowerShell), как показано на экране 1. В Windows 8 весь инструментарий активен по умолчанию. После выполнения этих действий все готово к работе.

 

Активизация средств AD DS и AD LDS
Экран 1. Активизация средств AD DS и AD LDS

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

Откройте сеанс PowerShell и импортируйте модуль:

   PS C:> Import-Module ActiveDirectory 

· При импорте создается новый PSDrive, но мы не будем использовать его. Однако стоит посмотреть, какие команды содержатся в модуле:

   PS C:> get-command -module ActiveDirectory 

· Особенность этих команд в том, что если команду можно использовать для одного объекта AD, то ее можно задействовать и для 10, 100 или 1000 объектов. Применим некоторые из этих команд.

Задача 1. Сброс пароля пользователя

Начнем с типичной задачи, возникающей перед ИТ-администратором: сброс пароля пользователя. Это легко сделать с помощью команды Set-ADAccountPassword. Сложность заключается в том, что новый пароль необходимо указать как защищенную строку: зашифрованный фрагмент текста, хранящийся в памяти в течение сеанса PowerShell. Поэтому сначала нужно подготовить переменную с новым паролем:

   PS C:> $new=Read-Host  «Enter  the new  password»  -AsSecureString 

· Затем ввести новый пароль:

PS C:>

После этого можно обратиться к учетной записи (предпочтительно с использованием samAccountname) и указать новый пароль. Так будет выглядеть изменение для пользователя по имени Джек Фрост:

   PS C:> Set-ADAccountPassword jfrost -NewPassword $new 

· К сожалению, в этой команде есть ошибка: -Passthru, -Whatif и -Confirm не работают. Если вы предпочитаете однострочный вариант, попробуйте следующее:

   PS C:> Set-ADAccountPassword jfrost -NewPassword 
   (ConvertTo-SecureString -AsPlainText -String 
        «P@ssw0rd1z3»  -force) 

· Наконец, нужно, чтобы Джек изменил свой пароль при следующей регистрации, поэтому следует изменить учетную запись с использованием Set-ADUser:

   PS C:> Set-ADUser jfrost -ChangePasswordAtLogon $True 

· Команда не выполняет запись в конвейер или консоль, если задействовать параметр -True. Но проверить успешность выполнения можно, извлекая имя пользователя с помощью команды Get-ADUser с указанием свойства PasswordExpired, как показано на экране 2.

 

Результаты выполнения команды Get-ADUser со?свойством PasswordExpired
Экран 2. Результаты выполнения команды Get-ADUser со?свойством PasswordExpired

Таким образом, чтобы изменить пароль пользователя с помощью PowerShell, требуется совсем немного усилий. Конечно, эту задачу легко выполнить с помощью оснастки Active Directory Users and Computers консоли управления MMC. Но PowerShell — хорошая альтернатива; если нужно делегировать задачу, нежелательно развертывать оснастку Active Directory Users and Computers или пароль изменяется в рамках более крупного, автоматизированного ИТ-процесса.

Задача 2. Отключение и включение учетной записи пользователя

Продолжим экспериментировать с тем же пользователем. В следующем фрагменте исходного текста используется параметр -Whatif, присутствующий во многих командах, предназначенных для внесения изменений. Проверим команду, не выполняя ее:

   PS C:> Disable-ADAccount jfrost -whatif 
   What if: Performing operation  «Set»  on Target  «CN=Jack  Frost, 
        OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local».  

· Теперь действительно выполним ее:

   PS C:> Disable-ADAccount jfrost 

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

   PS C:> Enable-ADAccount jfrost 

· Эти команды можно задействовать в конвейерном выражении для включения и отключения какого угодно числа учетных записей. Например, в следующем фрагменте исходного текста отключаются все учетные записи пользователей в отделе продаж (Sales):

       PS C:> get-aduser -filter  «department  -eq  'sales'»  |
       disable-adaccount 

· Конечно, построить фильтр для Get-ADUser может быть довольно сложно, но в этом случае удобно применить параметр -Whatif с командой Disable-ADAccount.

Задача 3. Разблокирование учетной записи пользователя

Наш Джек случайно заблокировал свою учетную запись, пытаясь воспользоваться новым паролем. Вместо того чтобы искать учетную запись в глубинах графического интерфейса, ее можно разблокировать с помощью простой команды:

   PS C:> Unlock-ADAccount jfrost 

· Эту команду можно использовать с параметрами -Whatif и -Confirm.

Задача 4. Удаление учетной записи пользователя

С помощью команды Remove-ADUser легко удалить от 1 до 100 учетных записей пользователя. Я не хочу удалять пользователя по имени Джек Фрост, но если бы такое желание возникло, можно применить следующие команды:

   PS C:> Remove-ADUser jfrost -whatif 
   What if: Performing operation  «Remove»  on Target 
        «CN=Jack Frost,OU=staff,OU=Testing,DC=GLOBOMANTICS,DC=local».  

· Или же можно передать по конвейеру группу пользователей и удалить их одной простой командой:

   PS C:> get-aduser -filter  «enabled  -eq  'false'»    -property WhenChanged -SearchBase  «OU=Employees, DC=Globomantics,DC=Local»  | where {$_.WhenChanged 
   -le (Get-Date).AddDays(-180)} | Remove-ADuser -whatif 

· Эта однострочная команда обнаружит и удалит все отключенные учетные записи в организационной единице (OU) Employees, которые не менялись в течение последних 180 дней.

Задача 5. Поиск пустых групп

Управление группами – дело бесконечное и неблагодарное. Существует много способов найти пустые группы. Некоторые выражения могут функционировать лучше других, в зависимости от организации. Следующий программный код обеспечивает поиск всех групп в домене, в том числе встроенных:

   PS C:> get-adgroup -filter * | where {-Not 
   ($_ | get-adgroupmember)} | Select Name 

· Если в группы входят сотни членов, то применение этих команд может отнимать много времени; Get-ADGroupMember проверяет каждую группу. Постарайтесь ограничить или более точно настроить поиск.

Возможен и другой подход:

   PS C:> get-adgroup -filter  «members  -notlike '*' 
   -AND GroupScope -eq  'Universal'»  -SearchBase 
        «OU=Groups,OU=Employees,DC=Globomantics, DC=local»  | Select Name,Group* 

· Эта команда обнаруживает все универсальные группы, в которых нет членов моей организационной единицы Groups, и которые отображают несколько свойств. Результаты показаны на экране 3.

 

Поиск отфильтрованных универсальных групп
Экран 3. Поиск отфильтрованных универсальных групп

Задача 6. Добавление членов в группу

Добавим пользователя Джека Фроста в группу Chicago IT:

Let's add Jack Frost to the Chicago IT group:

   PS C:> add-adgroupmember  «chicago IT»  -Members jfrost 

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

   PS C:> Add-ADGroupMember  «Chicago Employees»  -member 
   (get-aduser -filter  «city  -eq  'Chicago'»)  

· Я использовал конвейерное выражение в круглых скобках, чтобы найти всех пользователей, у которых свойство City имеет значение Chicago. Программный код в круглых скобках выполняется, и результирующие объекты направляются в параметр -Member. Затем каждый объект пользователя добавляется в группу Chicago Employees. Число пользователей не имеет значения: 5 или 500; обновление членства группы занимает всего несколько секунд. Это выражение можно записать и с помощью более понятного ForEach-Object.

   PS C:> Get-ADUser -filter  «city  -eq  'Chicago'»  | foreach 
   {Add-ADGroupMember  «Chicago Employees»  -Member $_} 

· Задача 7. Перечисление членов группы

Иногда бывает полезно выяснить, кто принадлежит к данной группе. Например, следует периодически проверять, кто входит в группу администраторов домена:

   PS C:> Get-ADGroupMember  «Domain Admins»  

· Результат показан на экране 4.

 

Поиск членов группы администраторов домена
Экран 4. Поиск членов группы администраторов домена

Команда записывает объект AD для каждого члена конвейера. Но как быть с вложенными группами? Моя группа Chicago All представляет собой набор вложенных групп. Чтобы получить все учетные записи пользователей, достаточно воспользоваться параметром -Recursive:

   PS C:> Get-ADGroupMember  «Chicago  All  Users»    -Recursive | Select DistinguishedName 

· Если требуется решить обратную задачу — выяснить, в какие группы входит пользователь — можно взглянуть на свойство MemberOf:

   PS C:> get-aduser jfrost -property Memberof | 
   Select -ExpandProperty memberOf 
   CN=NewTest,OU=Groups,OU=Employees, 
   DC=GLOBOMANTICS,DC=local 
   CN=Chicago Test,OU=Groups,OU=Employees, 
   DC=GLOBOMANTICS,DC=local 
   CN=Chicago IT,OU=Groups,OU=Employees, 
   DC=GLOBOMANTICS,DC=local 
   CN=Chicago Sales Users,OU=Groups,OU=Employees, 
   DC=GLOBOMANTICS,DC=local 

· Параметр -ExpandProperty применяется для вывода имен MemberOf как строки.

Задача 8. Поиск устаревших учетных записей компьютеров

Меня часто спрашивают, как найти устаревшие учетные записи компьютеров. Я всегда задаю встречный вопрос: «Что считать устаревшим?» В различных организациях, скорее всего, будут действовать разные правила относительно того, когда следует считать устаревшей или более неиспользуемой учетную запись компьютера (или пользователя). Проще всего учитывать учетные записи компьютеров, пароль которых не менялся в течение определенного числа дней. Удобный срок — 90 дней. Если пароль компьютера в домене не менялся в течение этого периода, значит, он не подключается к сети и, скорее всего, устарел. Примените команду Get-ADComputer:

   PS C:> get-adcomputer -filter  «Passwordlastset    -lt  '1/1/2012'»  -properties *| Select name,passwordlastset 

· Фильтр работает наиболее эффективно с жестко заданным значением, но этот программный код извлечет все учетные записи компьютеров, чьи пароли не изменились после 1 января 2012 г. Результаты показаны на экране 5.

 

Поиск устаревших учетных записей компьютеров
Экран 5. Поиск устаревших учетных записей компьютеров

Другой вариант: при наличии, по крайней мере, функционального уровня домена Windows 2003 можно организовать фильтр с использованием свойства LastLogontimeStamp. Его значение — число 100-нс интервалов после 1 января 1601 года, сохраненное в формате GMT, поэтому работать с этим значением довольно сложно:

   PS C:> get-adcomputer -filter  «LastlogonTimestamp  -gt  0»    -properties * | select name,lastlogontimestamp, 
        @{Name=«LastLogon»;Expression={[datetime]::FromFileTime    ($_.Lastlogontimestamp)}},passwordlastset | Sort 
   LastLogonTimeStamp 

· Я добавил специальное свойство, которое преобразует значение LastLogonTimeStamp в понятную дату. Результат можно увидеть на экране 6.

 

Преобразование значения LastLogonTimeStamp в?понятную дату
Экран 6. Преобразование значения LastLogonTimeStamp в?понятную дату

 

Получение списка операционных систем
Экран 7. Получение списка операционных систем

 

Поиск систем с серверной операционной системой
Экран 8. Поиск систем с серверной операционной системой

 

Страницы отчета Password-Age Report
Экран 9. Страницы отчета Password-Age Report

Чтобы создать фильтр, нужно преобразовать дату, например 1 января 2012 г., в правильный формат, преобразовав ее в FileTime:

   PS C:> $cutoff=(Get-Date  «1/1/2012»).ToFileTime()    PS C:> $cutoff 
   129698676000000000 

· Далее можно использовать эту переменную в фильтре для Get-ADComputer:

   PS C:> Get-ADComputer -Filter  «(lastlogontimestamp  -lt 
   $cutoff) -or (lastlogontimestamp -notlike  '*')»  -property 
   * | Select Name,LastlogonTimestamp,PasswordLastSet 

На старт, внимание, марш!

Надеюсь, в данной статье убедительно показано, что работать с PowerShell не сложно и не страшно. Но, как и при использовании любого нового инструмента, необходимо проверить все продемонстрированные приемы в тестовой среде. Если вы хотите больше узнать об управлении AD с помощью PowerShell, или о том, как применить команды Quest для решения задач, приведенных в данной статье, обратитесь к книге «Managing Active Directory with Windows PowerShell: TFM 2nd Ed.» (издательство SAPIEN Press, 2010). На семинарах я всегда говорю учащимся: «Вопрос не в том, будете ли вы использовать PowerShell, а в том, когда вы начнете это делать». Конечно, можно управлять AD без PowerShell, но чтобы добиться максимальной эффективности при минимальных затратах, начинайте осваивать продукт уже сегодня.