Работа PowerShell с Active Directory

Используя командлеты можно выполнять все традиционные операции в Active Directory — создавать, удалять, изменять, просматривать свойства объектов, перемещать, переименовывать и восстанавливать объекты, управлять группами, ролями FSMO, доменами и лесами, настраивать политики и многое другое. Хотя нужно отметить, что первое время в PS было мягко говоря мало командлетов для работы с Active Directory. Вся работа через ADSI работающий на достаточно низком уровне, путем опроса пространства имен «System.DirectoryServices» .NET Framework (подробнее msdn.microsoft.com/ru-ru/library/system.directoryservices.aspx). Использование ADSI дает практически безграничные возможности, но даже простые команды выглядят довольно пугающе для новичков, я уже не говорю о сложных конструкциях.
Зададим путь к контейнеру и просмотрим его свойства:

PS> $path = [ADSI]"LDAP://OU=testOU,DC=testdomain,DC=local"
PS> $path | Format-List *

Чтобы создать новый объект следует ввести:

PS> $user = $path.Create('user', 'cn= demo')

И так далее. Выглядит довольно сложно. В состав Windows 2008 входит утилита ADSI Edit, которая упрощает поиск параметров для написания сценариев, в других версиях ОС ее необходимо устанавливать самостоятельно.
В новых ОС Windows 2008R2 и Windows 7 доступен ADPowershell (Active Directory Module for Windows PowerShell), командлеты которые имеют достаточно простой синтаксис. И более того Active Directory Administrative Center (ADAC) полностью реализован на PowerShell 2.0 и ADPowershell.
Чтобы ADPowershell установить в Windows 7, следует инсталлировать RSAT (Microsoft Remote Server Administration Tools, technet.microsoft.com/ru-ru/library/cc730825.aspx) после чего их можно загрузить прямо из меню «Программы и компоненты» (Turn Windows Features on or off — Remote Server Administration Tools — Role Administration Tools — AD DS and LDS Tools — Active Directory PowerShell snap-in). На сервере Windows 2008R2 нужный компонент ставится еще проще:

PS> Add-WindowsFeature -Name "RSAT-AD-PowerShell" –IncludeAllSubFeature

Кроме этого появились командлеты для работы с Active Directory сторонних разработчиков. Очень популярны AD PowerShell cmdlets (их еще называют QAD cmdlets) разработанные Quest Software, которые можно свободно скачать по адресу (www.quest.com/activeroles-server/arms.aspx), реализующие достаточно простые команды.
Так имена командлетов составлены из стандартной пары «действие-объект». На первой позиции стоят все те же английские глаголы — Get-, Set-, New-, Move-, Remove-, Rename- и так далее, на второй — описание объекта с префиксом QAD (-QADUser, -QADComputer, -QADGroup, -QADObject). Получить список QAD командлетов достаточно просто:

PS> Get-QCommand

QAD командлеты понадобятся также в случае использования некоторых GUI к PowerShell в которых имеется функция для работы с ActiveDirectory.

Но есть минус, так как эти командлеты не входят в состав ОС и не поддерживается Microsoft, для их работы необходимо обязательное присутствие соответствующего провайдера. Учитывая, что пока новых ОС от Microsoft в природе нет, а парк машин может быть разным, в дальнейших примерах будем использовать командлеты QAD, как более универсальные. Если работает под обычной учетной записью, подключимся к КД как админ:

PS> $pw = read-host "Enter password" -AsSecureString
***********
PS> Сonnect-QADService -service 'localhost' -proxy -ConnectionAccount 'testdomain\administrator' -ConnectionPassword $pw

Для начала получим список пользователей и затем компьютеров:

PS> Get-QADUser | Get-Member
PS> Get-QADComputer

Все просто. Что узнать информацию по отдельному пользователю и параметру, просто подставляем его в вызов:

PS> Get-ADUser Vasja -Properties ManagedObjects

Теперь просмотрим список пользователей, которые не регистрировались 2 месяца и сохраним в HTML файл для отчета:

PS> $last2months = (Get-Date).AddMonths(-2)
PS> Get-QADUser -IncludedProperties LastLogon | where { $_.lastLogon -le $last2months} | Select DisplayName, LastLogon, AccountIsDisabled | ?{-not $_.AccountIsDisabled} | ConvertTo-Html | Out-File c:\report.html

Чтобы в список не попали отключенные учетные записи, в команде проконтролировали значение AccountIsDisabled. Но следует учитывать, что атрибут LastLogon не реплицируется между контроллерами домена, поэтому если в сети их несколько, то это значение следует получить с каждого контроллера домена. Получим список контроллеров домена и затем опросим каждый на предмет LastLogon:

PS> Get-QADComputer -ComputerRole DomainController | foreach {
(Get-QADUser -Service $_.Name -SamAccountName username).LastLogon.Value
}

Знак «?» является алиасом «Where-Object», специальная переменная «$_», которая часто используется в скриптах PS, указывает на текущий объект.
Например, выберем всех пользователей из отдела Sales проживающих в Москве, и укажем для них новый номер телефона.

PS> Get-QADUser -City Moscow -Department Sales | Set-QADUser -PhoneNumber ‘495-1111111

Создадим новую доменную учетную запись.

PS> New-QADUser -name 'user' -ParentContainer 'OU=testOU,DC=testdomain,DC=local' -UserPassword 'P@ssword'

Чтобы отключить, включить или разблокировать Unlock-QADUser учетную запись следует использовать командлеты Disable-QADUser и Enable-QADUser соответственно. Как видишь все достаточно просто. Также просто создавать и новые объекты:

PS> New-QADObject -type OrganizationUnit -ParentContainer teststomain.local -Name NewOU

Теперь переместим в созданный контейнер ряд учетных записей:

PS> Get-QADUser -Department Sales | Move-QADObject -To testsdomain.local/Sales

Управление группами выглядит аналогично:

Get-QADGroupMember Scorpio\Managers | where { $_.City -eq ‘Ekaterinburg’} | Add-QADGroupMember Scorpio\Ekaterinburg_Managers

Экспериментируя с PowerShell можно запросто ошибиться, поэтому при изменении объектов AD лучше запустить выполение с ключем «-whatif» (что если). В этом случае вместо действительного изменения параметром, скрипт выведет в консоль все, что он должен был сделать. Очень удобно.

Теги: ,

Понравилась статья? Оставьте комментарий или подпишитесь на RSS рассылку.

Комментарии

Комментариев пока что нет

Оставить комментарий

(required)

(required)