ЗАМЕТКИ

Работа с Active Directory c использованием командлетов Powershell

VBScript несколько надоел, решил попробовать что-нибудь новенькое. Выбора большого конечно нет, поэтому заинтересовался управлением объектами AD c помощью командлетов Powershell. Начал ковырять и понял, что по-умолчанию, без установки дополнительных модулей это невозможно. Речь идет про сервера под управлением Windows 2003-2008. В Windows 2008 R2 все намного проще, т.к. все необходимое там уже имеется и неоднократно расписано.

Серверов на Win2008 R2 у меня пока еще нет (видимо не дорос =))) поэтому буду рассматривать на примере Win2003 R2 SP2. (для Win2008 отличия не большие).

Использование командлетов ADPowershell возможно только на платформах Windows 7 и Windows 2008 r2. Т.к. в наличии есть только семерка, то работать будем с нее.

Итак начнем, подготавливать контроллер домена. Ставим Windows Management Framework Core (WinRM 2.0 and Windows PowerShell 2.0) - Скачать можно тут.

Далее необходимо установить службу шлюза управления Active Directory (веб-служба Active Directory для Windows Server 2003 и Windows Server 2008) или сокращенно ADWS. Скачать можно здесь


Обратите внимание, что для устаноки ADWS обязательно должны быть установлены: Службы AD, .NET Framework 3.5 с пакетом обновления 1 (SP1), и обновление KB969429 для Windows 2003 (можете скачать с сайта Microsoft) или обновление KB967574 для Windows 2008 без обновления SP2 (для 2008 sp2 это обновление не требуется). В случае успешной установки перезагружаемся. На этом настройка контроллера заканчивается.

Переходим к 7-ке.

Устанавливаем Remote Server Administration Tools (RSAT), кстати утилиты не помешают и при решении других задач. Скачать можно здесь.

После установки идем в Пуск-Панель управления - Программы и компоненты - Включение и отключение компонентов Windows - Средства удаленного администрирования - Средства администрирования ролей - Средства доменных служб ... и включаем модуль Active Directory для Powershell


Компоненты Windows

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

1. Идем в Администрирование и запускаем - Модуль Active Directory для Windows PowerShell


Модуль Active Directory для Windows PowerShell

2. В текущей сессии Powershell выполняем -
Import-Module ActiveDirectory

Import-Module ActiveDirectory

Если при настройке контроллера вы не накосячили, то увидите процесс подключения и приглашение командной строки.

А если накосячили, то получите ошибку -


Ошибка при инициализации диска по умолчанию

Проверить подключение можно командлетом - Get-PsDrive


Проверка подключений Get-PsDrive

Первая строка показвает, что подключение произведено.

Также подключит диск (диск - это подключение) глобального каталога можно выполнив команду -
New-PSDrive -PSProvider ActiveDirectory -Name GC -Root "" -Server "domain.com:389"
И напоследок небольшой плакатик от MS по командлетам ADPowershell (кликабельно) -

Плакат PowerShell Active Directory

Начнем с вопроса, который часто волнует сисадминов, как узнать какие аккаунты AD уже не используются. Для определения задачи уточним формулировку до какие аккаунты не используются долгое время (например полгода).

Вывод списка компьютеров, не имевших входа в домен более 6 месяцев:
get-adcomputer -properties lastLogonDate -filter * | where { $_.lastLogonDate -lt (get-date).addmonths(-6) } | FT Name,LastLogonDate

Отсортируем немного вывод для удобочитаемости:
get-adcomputer -properties lastLogonDate -filter * | where { $_.lastLogonDate -lt (get-date).addmonths(-6) } | sort Name | FT Name,LastLogonDate

Удаление всех учетных записей компьютеров с отсутствием входа более 6 месяцев (мой совет, не копипастите этот командлет без осознания содеянного):
get-adcomputer -properties lastLogonDate -filter * | where { $_.lastLogonDate -lt (get-date).addmonths(-6) } | Remove-ADComputer


Поиск отключенных аккаунтов пользователей с выводом примерной даты отключения (последнего входа этого пользователя в домен)
Search-ADAccount -accountdisabled | where {$_.lastlogondate -lt (get-date).addmonths(-12)} | FT Name,LastLogonDate


Другие полезные примеры:


Просмотр всех учетных записей компьютеров в домене:
Get-ADComputer –Filter {Name –Like "*"}


Просмотр всех компьютеров не имевших вход 90 дней:
Search-ADaccount -AccountInactive -Timespan 90 -ComputersOnly


или


$lastLogon = (get-date).adddays(-90).ToFileTime()
Get-ADComputer -filter {lastLogonTimestamp -gt $lastLogon}


Поиск и удаление всех отключенных аккаунтов компьютеров в AD
Search-ADAccount -AccountDisabled -ComputersOnly | Sort-Object | Remove-ADComputer


Поиск и удаление отключенных аккаунтов компьютеров в определенном OU
Search-ADAccount -AccountDisabled -Searchbase "OU=IT,DC=Contoso,DC=Com" -ComputersOnly | Sort-Object | Remove-ADComputer


Поиск и удаление всех компьютеров из AD не имеющих входа с 18.12.2011
Search-ADAccount -AccountInactive -DateTime "18.12.2011" –ComputersOnly | Sort-Object | Remove-ADComputer


Вывод списка отключенных учетных записей компьютеров
Search-ADAccount -AccountDisabled -ComputersOnly | Format-Table Name


Перемещение объекта "Компьютер" в другой OU (например: Computer=CLIENT1 в OU=IT )
Get-ADComputer CLIENT1 | Move-ADObject -TargetPath "OU=IT,DC=Contoso,DC=Com"


Просмотреть детали учетной записи компьютера (для примера Computer=CLIENT1)
Get-ADComputer -Filter {Name -Like "CLIENT1"}


Вывод всех свойств учетной записи компьютера (для примера Computer=CLIENT1)
Get-ADComputer "CLIENT1" -Properties *


Вывод списка компьютеров (Имя, Операционная система, Сервис-Пак, Версия ОС)
Get-ADComputer -Filter * -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -Wrap –Auto

Экспорт списка комьютеров (Имя, Операционная система, Сервис-Пак, Версия ОС) в CSV-файл
Get-ADComputer -Filter * -Property * | Select-Object Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion | Export-CSV AllWindows.csv -NoTypeInformation -Encoding UTF8


Получение DNS имени и IP-адреса
Get-ADComputer -Filter {Name -Like "Computer-Name"} -Properties IPv4Address | Format-List Name,DnsHostName,IPv4Address


Список всех компьютеров в определенном (для примера OU=IT, Domain=domain.com)
Get-ADComputer -SearchBase "OU=IT,DC=domain,DC=Com" -filter *


Получение списка всех компьютеров без DNS суффикса
Get-ADComputer -filter "DnsHostName -notlike '*.domain.Com'"


Получение SPNs (Service Principal Name) компьютера
Get-ADComputer "Computer-Name" –Properties ServicePrincipalNames | Select-Object –Expand ServicePrincipalNames


Получение Сида (SIDs) компьютера
Get Computers Security Identifiers (SIDs)
Get-ADComputer -Filter {Name -like "*"} | Select Name,SID | Format-Table -Auto


Список компьютеров созданных за последние 90 дней
Get-ADComputer -Filter * -Properties whenCreated | ? { ((Get-Date) - $_.whenCreated).Days -lt 90} | Format-Table Name,WhenCreated,Name,DistinguishedName -Autosize -Wrap


Список компьютеров созданных 1 декабря 2011 (12/01/2011)
Get-ADComputer -LDAPFilter "(&(objectCategory=person)(whenCreated>=20111201000000.0Z))" -Properties whenCreated | Format-Table Name,whenCreated,distinguishedName -Autosize -Wrap


Список компьютеров созданных в интервал времени, например между 10/01/2011 и 12/01/2011
$Start = Get-Date -Day 01 -Month 10 -Year 2011 -Hour 00
$End = Get-Date -Day 01 -Month 12 -Year 2011 -Hour 23 -Minute 59
Get-ADComputer -Filter * -Properties whenCreated | ? { ($_.whenCreated -gt $Start) -and ($_.whenCreated -le $End) } | Format-Table Name,WhenCreated,DistinguishedName -Autosize -Wrap


Работа с группами:


Просмотра всех участников группы (для примера: Group=Experts)
Get-ADGroupMember Experts | Format-Table Name


Вывод списка свойств для группы (для примера: Group=IT)
Get-ADGroup IT -Properties *


Список только универсальных групп (Universal Security groups)
Get-ADGroup –LDAPFilter "(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=-2147483640))"


Список глобальных групп (Global Security groups)
Get-ADGroup –LDAPFilter "(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=-2147483646))"


Список локальных групп в домене (Local Security groups)
Get-ADGroup –LDAPFilter "(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=-2147483644))"


Узнать список групп в которые включен пользоатель (для примера: User=EdPrice)
Get-ADAccountAuthorizationGroup EdPrice


Перемещение группы в другой OU (для примера: Group=Experts, Old-OU=IT, New-OU=Service, Domain=Contoso.com)
Move-ADObject "CN=Experts,OU=IT,DC=Contoso,DC=com" -TargetPath "OU=Service,DC=Contoso,DC=com"


Добавление пользователя в группу (для примера: Group=Experts, User=EdPrice)
Add-ADGroupmember Experts -Member EdPrice


Удаление группы (для примера: Group=Experts)
Remove-ADGroup Experts


Удаление пользоателя из группы (для примера Group=Experts, User=EdPrice)
Remove-ADGroupMember Experts -Member EdPrice


Установить описание для группы (для примера Group=JoinPC, Description=This group is allowed join PCs to Domain)
Set-ADGroup JoinPC -Description "This group is allowed join PCs to Domain"



Работа с OU


Все OU (Organization Unit или Подразделение) в домене
Get-ADOrganizationalUnit -Filter {Name -like „*“} | FT Name, DistinguishedName -A


Создание OU (для примера OU=IT, Domain=domain.com)
New-ADOrganizationalUnit -Name IT -Path "DC=Domain,DC=Com"


Содержание определенного OU (для примера: OU=IT, Domain=Contoso.com)
Get-ADObject -Filter {Name -Like "*"} -Searchbase "OU=IT,DC=Contoso,DC=Com"


Удаление OU (для примера: Old-Name=IT, New-Name=Admin, Domain=Contoso.com)
Rename-ADObject "OU=IT,DC=Contoso,DC=Com" -NewName Admin


Удаление содержимого OU (для примера: OU=IT, Domain=Contoso.com)
Delete OU including contents (example: OU=IT, Domain=Contoso.com)
Remove-ADOrganizationalUnit IT -Recursive


Удаление пользователя из определенного OU (для примера: User=EdPrice, OU=IT, Domain=Contoso.com )
Remove-ADObject "CN=EdPrice,OU=IT,DC=Contoso,DC=Com"


Перемещение всех объектов из одного OU в другой (для примера: Old-OU=IT, New-OU=Manager, Domain=Contoso.com)
Get-ADObject -Filter {Name -Like "*"} -Searchbase "OU=IT,DC=Contoso,DC=Com" -SearchScope OneLevel | Move-ADObject -TargetPath "OU=Manager,DC=Contoso,DC=Com"



Работа с пользователями


Список всех пользователей домена
Get-ADUser –Filter *


Список пользователей определенного OU (для примера: OU=IT, Domain=Contoso.com)
Get-ADUser –Filter * -Searchbase "OU=IT,DC=Contoso,DC=Com" | FT


Список всех пользователей из определенного города (поле City)
Get ADUser -Filter {city - like "NewYork"} | FT


Список отключенных аккаунтов пользователей домена


Search-ADAccount –AccountDisabled –Usersonly | FT Name


Список всех пользователей, чье имя начинается на Ed
Get-ADUser –Filter {givenName –Like "Ed"} | FT


Список пользователей, чья фамилия Prince
Get-ADUser –Filter {Surname –Like "Price"} | FT


Список аккаунтов пользоатлей определенного департамента (поле Department)
Get-ADUser –Filter {Department –Like "Support"} | FT


Список членства в группах определенного пользователя (для примера:
Get-ADPrincipalGroupMembership -Identity Richard


Поиск пользователей входящих в определенную группу и перемещение их в другой OU (для примера: Group=People, Target OU=NewYork, Domain=Contoso.com)
Get-ADGroupMember People -Recursive | Move-ADObject –TargetPath "OU=NewYork,DC=Contoso,DC=Com"


Удаление всех пользователей OU в определенную группу (для примера: Group=People, OU=NewYork, Domain=Contoso.com)
$Users = Get-ADUser -Filter * -Searchbase "OU=NewYork,DC=Contoso,DC=Com"
Remove-ADGroupMember -Identity People -Member $Users -Confirm:0