Офтопик
Для реализации описанного процесса необходимо соблюдение определенных требований:
Чтобы использовать PowerShell для управления AD, нужно соблюсти несколько требований. Я собираюсь продемонстрировать, как командлеты для AD работают на примере компьютера на Windows 7.
Чтобы использовать командлеты, контроллер домена у Вас должен быть уровня Windows Server 2008 R2, или же Вы можете скачать и установить Active Directory Management Gateway Service на наследуемых контроллерах домена (legacy DCs). Внимательно прочитайте документацию перед установкой; требуется перезагрузка КД.
На стороне клиента, скачайте и установите Remote Server Administration Tools (RSAT) либо для Windows 7, либо для Windows 8. В Windows 7, Вам необходимо будет открыть в Панели управления (Control Panel) раздел Программы (Programs) и выбрать Включить или выключить функции Windows (Turn Windows Features On or Off). Найдите Remote Server Administration Tools и раскройте раздел Role Administration Tools. Выберите подходящие пункты для AD DS and AD LDS Tools, особенно обратите внимание на то, что должен быть выбран пункт Active Directory Module for Windows PowerShell, как показано на рисунке 1. (В Windows 8 все инструменты выбраны по умолчанию). Теперь мы готовы работать.
Я вошел в систему под учетной записью с правами доменного администратора. Большинство командлетов, которые я буду показывать, позволят Вам уточнить альтернативные полномочия (credentials). В любом случае я рекомендую прочитать справку (Get-Help) и примеры, которые я буду демонстрировать ниже.
Начните сессию PowerShell и просмотрите список модулей:
PS C:\> Get-Module -listavailable
импортируйте модуль AD:
PS C:\> Import-Module ActiveDirectory
В результате импорта создается новый PSDrive, но мы не будем использовать его. Однако, Вы можете посмотреть, какие команды имеются в импортированном модуле.
PS C:\> get-command -module ActiveDirectory
Прелесть этих команд в том, что если я могу использовать команду для одного объекта AD, то ее можно использовать для 10, 100 и даже 1000. Посмотрим, как некоторые из этих командлетов работают.
Для начала необходимо получить список ОС, а затем осуществляем фильтрацию учетных записей по имеющимся ОС.
PS C:\> Get-ADComputer -Filter * -Properties OperatingSystem | Select OperatingSystem -unique | Sort OperatingSystem
Результаты показаны ниже.
Код: Выделить всё
OperatingSystem
---------------
Windows 10 Pro
Windows 7 Professional
Windows 7 Корпоративная
Windows 7 Профессиональная
Windows 8.1 Профессиональная
Windows Server 2008 R2 Enterprise
Windows Server 2008 R2 Standard
Windows Server 2012 R2 Standard
Windows XP Professional
PS C:\> Get-ADComputer -Filter "OperatingSystem -like '*Server*'" -properties OperatingSystem,OperatingSystemServicePack | Select Name,Op* | format-list
Результаты ниже.
Код: Выделить всё
Name : MSK-CO-DC004
OperatingSystem : Windows Server 2008 R2 Standard
OperatingSystemServicePack : Service Pack 1
Name : MSK-CO-DC001
OperatingSystem : Windows Server 2008 R2 Enterprise
OperatingSystemServicePack : Service Pack 1
Name : MSK-CO-DBA005
OperatingSystem : Windows Server 2008 R2 Standard
OperatingSystemServicePack : Service Pack 1
Name : MSK-CO-APP001
OperatingSystem : Windows Server 2008 R2 Enterprise
OperatingSystemServicePack : Service Pack 1
Name : MSK-CO-DBA011
OperatingSystem : Windows Server 2008 R2 Standard
OperatingSystemServicePack : Service Pack 1
Name : MSK-CO-MX002
OperatingSystem : Windows Server 2008 R2 Enterprise
OperatingSystemServicePack : Service Pack 1
Name : MSK-CO-DBA010
OperatingSystem : Windows Server 2008 R2 Enterprise
OperatingSystemServicePack : Service Pack 1
Name : MSK-CO-DBA002
OperatingSystem : Windows Server 2008 R2 Standard
OperatingSystemServicePack : Service Pack 1
Name : MSK-CO-VOICE001
OperatingSystem : Windows Server 2008 R2 Standard
OperatingSystemServicePack : Service Pack 1
Вот Вам бонус: отчет о возрасте пароля пользователя (user password-age report), сохраненный в HTML файле:
PS C:\> Get-ADUser -Filter "Enabled -eq 'True' -AND PasswordNeverExpires -eq 'False'" -Properties PasswordLastSet,PasswordNeverExpires,PasswordExpired | Select DistinguishedName,Name,pass*,@{Name="PasswordAge";Expression={(Get-Date)-$_.PasswordLastSet}} |sort PasswordAge -Descending | ConvertTo-Html -Title "Password Age Report" | Out-File c:\pwage.htm
Хотя это выражение может выглядеть слегка пугающим, при минимальном знании PowerShell им легко воспользоваться. И остается лишь последний совет: как определить кастомное свойство под названием PasswordAge. Значение представляет собой промежуток между сегодняшним днем и свойством PasswordLastSet. Затем я сортирую результаты для моего нового свойства. На рисунке 9 показан выход для моего небольшого тестового домена.