Любой системный администратор Windows должен уметь пользоваться не только графическими оснастками AD (чаще всего это ADUC – Active Directory Users and Computer), но и командлетами PowerShell для выполнения повседневных задач администрирования Active Directory. Чаще всего для администрирования домена, управления объектами (пользователями, компьютерами, группами) используется модуль Active Directory для Windows PowerShell. В этой статье мы рассмотрим, как установить модуль RSAT-AD-PowerShell, его базовый функционал и популярные командлеты, которые должны быть полезными при управлении и работе с AD.
Содержание:
- Как установить модуль Active Directory для PowerShell в Windows 10 и 11?
- Установка модуля RSAT-AD-PowerShell в Windows Server
- Основные командлеты модуля Active Directory для PowerShell
- Импорт модуля Active Directory PowerShell с удаленного компьютера
- Администрирование AD с помощью модуля Active Directory для PowerShell
Как установить модуль Active Directory для PowerShell в Windows 10 и 11?
Вы можете установить модуль RSAT-AD-PowerShell не только на серверах, но и на рабочих станциях. Этот модуль входит в состав пакета RSAT (Remote Server Administration Tools) для Windows.
В современных билдах Windows 11 и Windows 10 компоненты RSAT устанавливаются онлайн в виде Features on Demand. Вы можете установить модуль с помощью команды:
Add-WindowsCapability -online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
Или через панель Settings -> Apps -> Optional features -> Add a feature -> RSAT: Active Directory Domain Services and Lightweight Directory Services Tools.
Для предыдущих версий Windows пакет RSAT нужно было качать и устанавливать вручную. После этого нужно активировать модуль AD для PowerShell из панели управления (Control Panel -> Programs and Features -> Turn Windows features on or off -> Remote Server Administration Tools-> Role Administration Tools -> AD DS and AD LDS Tools).
Для использования командлетов AD в PowerShell Core 6.x, 7.x сначала нужно установить модуль WindowsCompatibility:
Install-Module -Name WindowsCompatibility
Затем загрузите модуль в сессию с помощью команд:
Import-Module -Name WindowsCompatibility
Import-WinModule -Name ActiveDirectory
Теперь вы можете использовать командлеты AD в ваших скриптах на PowerShell Core 7.
Установка модуля RSAT-AD-PowerShell в Windows Server
В Windows Server вы можете установить модуль Active Directory для Windows PowerShell из графической консоли Server Manager или с помощью PowerShell.
Вы можете проверить, что модуль Active Directory установлен с помощью команды:
Get-WindowsFeature -Name «RSAT-AD-PowerShell»
Если модуль отсутствует, установите его:
Install-WindowsFeature -Name "RSAT-AD-PowerShell" –IncludeAllSubFeature
Для установки модуля через панель управления Server Manager, перейдите в Add Roles and Features -> Features -> Remote Server Administration tools -> Role Administration Tools -> AD DS and AD LDS Tools -> выберите Active Directory module for Windows PowerShell.
Не обязательно использовать контроллер домена для администрирования Active Directory с помощью модуля RSAT-AD-PowerShell. Этот модуль можно установить на любом сервере или рабочей станции. На контроллерах домена AD модуль устанавливается автоматически при развертывании роли ADDS (при повышении сервера до DC).
Модуль взаимодействует с AD через службу Active Directory Web Services, которая должна быть запущена на контроллере домена и доступна клиентам по порту TCP 9389. Проверьте, что порт доступен на DC с помощью командлета Test-NetConnection:
tnc MSK-DC01 -port 9389
Основные командлеты модуля Active Directory для PowerShell
В модуле Active Directory для Windows PowerShell имеется большое командлетов для взаимодействия с AD. В текущей версии модуля для Windows Server 2022/Windows 11 доступно 147 PowerShell командлетов для AD.
Проверьте, что модуль установлен на компьютере:
Get-Module -Name ActiveDirectory –ListAvailable
Перед использованием командлетов модуля, его нужно импортировать в сессию PowerShell (начиная с Windows Server 2012 R2/ Windows 8.1 и выше модуль импортируется автоматически):
Import-Module ActiveDirectory
Проверьте, что модуль AD загружен в вашу сессию PowerShell:
Get-Module
Вы можете вывести полный список доступных командлетов с помощью команды:
Get-Command –module activedirectory
Общее количество команд в модуле:
Get-Command –module activedirectory |measure-object
Большинство командлетов модуля RSAT-AD-PowerShell начинаются с префикса Get-, Set-или New-.
- Командлеты класса Get— используются для получения различной информации из AD (Get-ADUser — свойства пользователей, Get-ADComputer – параметры компьютеров, Get-ADGroupMember — состав групп и т.д.). Для их выполнения не нужно быть администратором домена, любой пользователь домена может выполнять скрипты PowerShell для получения значений большинства атрибутов объектов AD (кроме защищенных, как в примере с LAPS).
- Командлеты класса Set— служат для изменения параметров объектов в AD, например, вы можете изменить свойства пользователя (Set-ADUser), компьютера (Set-ADComputer), добавить пользователя в группу и т.д. Для выполнения этих операций у вашей учетной записи должны быть права на объекты, которые вы хотите изменить (см. статью Делегирование прав администратора в AD).
- Команды, начинающиеся с New- позволяют создать объекты AD: создать пользователя — New-ADUser, группу — New-ADGroup, создать Organizational Unit — New-ADOrganizationalUnit.
- Командлеты, начинающиеся с Add—: добавить пользователю в группу (Add-ADGroupMember), создать гранулированные политики паролей (Add-ADFineGrainedPasswordPolicySubject);
- Командлеты Remove— служат для удаления объектов AD (Remove-ADGroup, Remove-ADComputer, Remove-ADUser).
Есть специфические командлеты PowerShell для управления только определенными компонентами AD:
-
Enable-ADOptionalFeature
– включить компоненты AD (например, корзину AD для восстановления удаленных объектов) -
Install-ADServiceAccount
– настроить учетную запись для службы (MSA, gMSA) -
Search-ADAccount
– позволяет найти в AD отключенные, неактивные, заблокированные учетные записи пользователей и компьютеров -
Enable-ADAccount
/
Disable-ADAccount
/
Unlock-ADAccount
– включить/отключить/ разблокировать учетную запись
По умолчанию командлеты PowerShell подключаются к вашему ближайшему контроллеру в вашем домене (LOGONSERVER). С помощью параметра -Server вы можете подключиться к ADDS на другом контроллере домена или в другом домене (список DC в другом домене можно вывести с помощью команды
nltest /dclist:newdomain.com
). Параметр -Server доступен почти для всех командлетов модуля. Например:
Get-ADuser aaivanov -Server msk-dc01.winitpro.ru
Также вы можете указать учетную запись для подключения к AD с помощью параметра -Credential.
$
creds = Get-Credential
Get-ADUser -Filter * -Credential $creds
Получить справку о любом командлете можно так:
get-help New-ADComputer
Примеры использования командлетов Active Directory можно вывести так:
(get-help Set-ADUser).examples
В PowerShell ISE при наборе параметров командлетов модуля удобно использовать всплывающие подсказки.
Импорт модуля Active Directory PowerShell с удаленного компьютера
Не обязательно устанавливать модуль AD PowerShell на все компьютеры. Администраора может удаленно импортировать это модуль с контроллера домена (нужны права администратора домена) или с любого другого компьютера.
Для подключения к удаленном компьютеру исопьзуется PowerShell Remoting. Это требует, чтобы на удаленном компьютере был включен и настроен Windows Remote Management (WinRM).
Создайте новую сесиию с удаленнм компьютером, на котором установлен модуль AD PowerShell:
$rs = New-PSSession -ComputerName DC_or_Comp_with_ADPosh
Импортируйте модуль ActiveDirectory с удаленного компьютера в вашу локальную сессию:
Import-Module -PSsession $rs -Name ActiveDirectory
Теперь вы можете выполнять любые команды из модуля Active Directory на своем компьютере, как будто это модуль установлен локально. При этом они выполняются на удаленном хосте.
Вы можете добавить эти команды в ваш файл профиля PowerShell (например,
notepad $profile.CurrentUserAllHosts
), чтобы автоматически импортировать модуль из удаленной сессии при запуске консоли powershell.exe.
Завершить удалённую сессию можно командой:
Remove-PSSession -Session $rs
Этот же способ с импортом модуля AD через PoweShell implicit remoting позволит вам использовать командлеты PowerShell с хостов Linux and macOS, на которые нельзя установить локальную копию модуля.
Также вы можете использовать модуль Active Directory для PowerShell без установки RSAT. Для этого достаточно скопировать с компьютера с установленным модулем RSAT-AD-PowerShell:
- Каталог C:WindowsSystem32WindowsPowerShellv1.0Modules
- Файл ActiveDirectory.Management.dll
- Файл ActiveDirectory.Management.resources.dll
Затем нужно импортировать модуль в сессию:
Import-Module C:pathMicrosoft.ActiveDirectory.Management.dll
Import-Module C:pathMicrosoft.ActiveDirectory.Management.resources.dll
После этого вы можете использовать все командлеты из модуля AD без установки RSAT.
Администрирование AD с помощью модуля Active Directory для PowerShell
Рассмотрим несколько типовых задач администратора, которые можно выполнить с помощью команд модуля AD для PowerShell.
Полезные примеры использования различных командлетов модуля AD для PowerShell уже описаны на сайте. Следуйте ссылкам по тексту за подробными инструкциями.
New-ADUser: Создать пользователя в AD
Для создания нового пользователя в AD используется использовать командлет New-ADUser. Создать пользователя можно командой:
New-ADUser -Name "Andrey Petrov" -GivenName "Andrey" -Surname "Petrov" -SamAccountName "apetrov" -UserPrincipalName "[email protected] " -Path "OU=Users,OU=Ufa,DC=winitpro,DC=loc" -AccountPassword(Read-Host -AsSecureString "Input Password") -Enabled $true
Более подробно о команде New-ADUser (в том числе пример массового создания учетных записей в домене) читайте в статье .
Get-ADComputer: Получить информацию о компьютерах домена
Чтобы вывести информацию о компьютерах в определённом OU (имя компьютера и дата последней регистрации в сети) используйте командлет Get-ADComputer:
Get-ADComputer -SearchBase ‘OU=Russia,DC=winitpro,DC=ru’ -Filter * -Properties * | FT Name, LastLogonDate -Autosize
Add-AdGroupMember: Добавить пользователя в группу AD
Чтобы добавить пользователей в существующую группу безопасности в домене AD, выполните команду:
Add-AdGroupMember -Identity MskSales -Members apterov, divanov
Вывести список пользователей в группе AD и выгрузить его в файл:
Get-ADGroupMember MskSales -recursive| ft samaccountname| Out-File c:scriptexport_users.csv
Более подробно об управлении группами AD из PowerShell.
Set-ADAccountPassword: Сброс пароля пользователя в AD
Чтобы сбросить пароль пользователя в AD из PowerShell, выполните:
Set-ADAccountPassword apterov -Reset -NewPassword (ConvertTo-SecureString -AsPlainText “[email protected]” -Force -Verbose) –PassThru
Блокировка/разблокировка пользователя
Отключить учетную запись:
Disable-ADAccount apterov
Включить учетную запись:
Enable-ADAccount apterov
Разблокировать аккаунт после блокировки парольной политикой:
Unlock-ADAccount apterov
Search-ADAccount: Поиск неактивных компьютеров в домене
Чтобы найти и заблокировать в домене все компьютеры, которые не регистрировались в сети более 100 дней, воспользуйтесь командлетом Search-ADAccount:
$timespan = New-Timespan –Days 100
Search-ADAccount -AccountInactive -ComputersOnly –TimeSpan $timespan | Disable-ADAccount
New-ADOrganizationalUnit: Создать структуру OU в AD
Чтобы быстро создать типовую структуры Organizational Unit в AD, можно воспользоваться скриптом PowerShell. Допустим, нам нужно создать несколько OU с городами, в которых создать типовые контейнеры. Вручную через графическую консоль ADUC такую структуру создавать довольно долго, а модуль AD для PowerShell позволяет решить такую задачу за несколько секунд (не считая время на написание скрипта):
$fqdn = Get-ADDomain
$fulldomain = $fqdn.DNSRoot
$domain = $fulldomain.split(".")
$Dom = $domain[0]
$Ext = $domain[1]
$Sites = ("SPB","MSK","Sochi")
$Services = ("Users","Admins","Computers","Servers","Contacts")
$FirstOU ="Russia"
New-ADOrganizationalUnit -Name $FirstOU -Description $FirstOU -Path "DC=$Dom,DC=$EXT" -ProtectedFromAccidentalDeletion $false
foreach ($S in $Sites)
{
New-ADOrganizationalUnit -Name $S -Description "$S" -Path "OU=$FirstOU,DC=$Dom,DC=$EXT" -ProtectedFromAccidentalDeletion $false
foreach ($Serv in $Services)
{
New-ADOrganizationalUnit -Name $Serv -Description "$S $Serv" -Path "OU=$S,OU=$FirstOU,DC=$Dom,DC=$EXT" -ProtectedFromAccidentalDeletion $false
}
}
После выполнения скрипта у нас в AD появилась такая структура OU.
Для переноса объектов между контейнерами AD можно использовать командлет Move-ADObject:
$TargetOU = "OU=Buhgalteriya,OU=Computers,DC=corp,DC=winitpro,DC=ru"
Get-ADComputer -Filter 'Name -like "BuhPC*"' | Move-ADObject -TargetPath $TargetOU
Get-ADReplicationFailure: Проверка репликации в AD
С помощью командлета Get-ADReplicationFailure можно проверить состояние репликации между контроллерами домена AD:
Get-ADReplicationFailure -Target DC01,DC02
Получить информацию обо всех DC в домене с помощью командлета Get-AdDomainController:
Get-ADDomainController –filter * | select hostname,IPv4Address,IsGlobalCatalog,IsReadOnly,OperatingSystem | format-table –auto
В этой статье мы рассмотрели, как установить и использовать модулья AD PowerShell для администрирования домена. Надеюсь, эта статья подтолкнет вас к дальнейшему исследованию возможностей этого модуля и автоматизации большинства задач управления AD.
Джеффери Хикс подготовил статью на Windows IT Pro, посвященную использования PowerShell для администрирования AD. В качестве исходного пункта автор решил взять 10 типичных задач администрирования AD и рассмотреть то, как их можно упростить, используя PowerShell:
- Сбросить пароль пользователя
- Активировать и деактивировать учетные записи
- Разблокировать учетную запись пользователя
- Удалить учетную запись
- Найти пустые группы
- Добавить пользователей в группу
- Вывести список членов группы
- Найти устаревшие учетные записи компьютеров
- Деактивировать учетную запись компьютера
- Найти компьютеры по типу
Помимо этого автор ведет блог (по PowerShell, конечно), рекомендуем заглянуть — jdhitsolutions.com/blog. А самое актуальное Вы можете получить из его твиттера twitter.com/jeffhicks.
Итак, ниже приводим перевод статьи “Top 10 Active Directory Tasks Solved with PowerShell”.
Управление Active Directory (AD) с помощью Windows PowerShell – это проще, чем Вы думаете, и я хочу доказать Вам это. Вы можете просто взять приведенные ниже скрипты и с их помощью решить ряд задач по управлению AD.
Требования
Чтобы использовать 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 все инструменты выбраны по умолчанию). Теперь мы готовы работать.
Рис.1 Включение AD DS и AD LDS Tools
Я вошел в систему под учетной записью с правами доменного администратора. Большинство командлетов, которые я буду показывать, позволят Вам уточнить альтернативные полномочия (credentials). В любом случае я рекомендую прочитать справку (Get-Help) и примеры, которые я буду демонстрировать ниже.
Начните сессию 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 – лучший вариант) и задать новый пароль. Вот пример для пользователя Jack Frost:
PS C:> Set-ADAccountPassword jfrost -NewPassword $new
К сожалению, в случае с этим командлетом наблюдается баг: -Passthru, -Whatif, и –Confirm не работают. Если Вы предпочитаете короткий путь, попробуйте следующее:
PS C:> Set-ADAccountPassword jfrost -NewPassword
(ConvertTo-SecureString -AsPlainText -String
"P@ssw0rd1z3" -force)
В итоге мне необходимо, чтобы Jack сменил пароль при следующем входе в систему, и я модифицирую учетную запись используя Set-ADUser.
PS C:> Set-ADUser jfrost -ChangePasswordAtLogon $True
Результаты выполнения командлета не пишутся в консоль. Если это необходимо сделать, используйте –True. Но я могу узнать, успешно или нет прошла операция, произведя извлечения имени пользователя с помощью командлета Get-ADUser и уточнив свойство PasswordExpired, как показано на рисунке 2.
Рис. 2. Результаты работы командлета Get-ADUser Cmdlet со свойством PasswordExpired
Итог: сбросить пароль пользователя с помощью PowerShell совсем не сложно. Признаюсь, что сбросить пароль также просто через оснастку Active Directory Users and Computers консоли Microsoft Management Console (MMC). Но использование PowerShell подходит в том случае, если Вам необходимо делегировать задачу, Вы не хотите разворачивать вышеупомянутую оснастку или сбрасываете пароль в ходе большого автоматизированного ИТ-процесса.
Задача 2: Активировать и деактивировать учетные записи
А теперь давайте деактивируем учетную запись. Продолжим работать с Jack Frost. Этот код использует параметр –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
Эти командлеты могут быть использованы в конвейерном выражении (pipelined expression), позволяя активировать или деактивировать столько учетных записей, сколько душе угодно. Например, этот код деактивирует все учетные записи в отделе продаж (Sales)
PS C:> get-aduser -filter "department -eq 'sales'" |
disable-adaccount
Конечно, писать фильтр для Get-ADUser довольно-таки сложно, но именно здесь использование параметра –Whatif вместе с командлетом Disable-ADAccount приходит на помощь.
Задача 3: Разблокировать учетную запись пользователя
Рассмотрим ситуацию, когда Jack заблокировал свою учетную запись, пытаясь ввести новый пароль. Вмест того, чтобы пытаться найти его учетную запись через GUI, процедуру разблокировки можно осуществить с помощью простой команды.
PS C:> Unlock-ADAccount jfrost
Командлет также поддерживает параметры -Whatif и -Confirm.
Задача 4: Удалить учетную запись
Неважно, сколько пользователей Вы удаляете, — это просто осуществить с помощью командлета Remove-ADUser. Мне не хочется удалять Jack Frost, но если бы я захотел, то использовал бы такой код:
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: Поиск пустых групп
Управление группами – занятие бесконечное и неблагодарное. Существует множество способов найти пустые группы. Некоторые выражения могут работать лучше, чем другие, в зависимости от Вашей организации. Код, приведенный ниже, позволит найти все группы в домене, включая встроенные (built-in).
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*
Эта команда находит все универсальные группы (Universal groups), которые не имеют членство в OU Groups и выводит некоторые из свойств. Результат приведен на рисунке 3.
Рис. 3. Поиск и фильтрация универсальных групп
Задача 6: Добавление пользователей в группу
Давайте добавим Jack Frost в группу Chicago IT:
PS C:> add-adgroupmember "chicago IT" -Members jfrost
Да, все так просто. Вы можете также легко добавлять сотни пользователей в группы, хотя, на мой взгляд, это слегка неудобно:
PS C:> Add-ADGroupMember "Chicago Employees" -member
(get-aduser -filter "city -eq 'Chicago'")
Я использовал вводное конвейерное выражение (parenthetical pipelined expression), чтобы найти всех пользователей, у которых имеется свойство City в Chicago. Код в скобках выполняется, и полученные объекты передаются в параметр –Member. Каждый пользовательский объект добавляется в группу Chicago Employees. Неважно, имеем ли мы дело с 5 или 5000 пользователей, обновление членства в группах занимает всего несколько секунд. Это выражение может также быть написано с использованием ForEach-Object, что может быть удобнее:
PS C:> Get-ADUser -filter "city -eq 'Chicago'" | foreach
{Add-ADGroupMember "Chicago Employees" -Member $_}
Задача 7: Выводим список членов группы
Вы возможно захотите узнать, кто находится в определенной группе. Например, Вы должны периодически узнавать, кто входит в группу доменных администраторов (Domain Admins):
PS C:> Get-ADGroupMember "Domain Admins"
На рисунке 4 приведен результат.
Рис. 4. Члены группы Domain Admins
Командлет выводит объект AD для каждого члена группы. А что делать с вложенными группами? Моя группа Chicago All Users является коллекцией вложенных групп. Чтобы получить список всех учетных записей, я всего лишь должен использовать параметр –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 показан результат.
Рис. 6. Конвертируем значение LastLogonTimeStamp в привычный формат
Чтобы создать фильтр, мне необходимо конвертировать дату, например, 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
Приведённый код находит те же самые компьютеры, что были показаны на рисунке 5.
Задача 9: Деактивировать учетную запись компьютера
Возможно, когда Вы найдете неактивные или устаревшие учетные записи, Вы захотите деактировать их. Сделать это довольно просто. Мы будем использовать тот же командлет, что использовали в работе с учетными записями пользователей. Вы можете уточнить его, использовав samAccountname учетной записи.
PS C:> Disable-ADAccount -Identity "chi-srv01$" -whatif
What if: Performing operation "Set" on Target "CN=CHI-SRV01,
CN=Computers,DC=GLOBOMANTICS,DC=local".
Или же использовав конвейерное выражение:
PS C:> get-adcomputer "chi-srv01" | Disable-ADAccount
Я также могу использовать мой код, чтобы найти устаревшие учетные записи и все их деактивировать:
PS C:> get-adcomputer -filter "Passwordlastset
-lt '1/1/2012'" -properties *| Disable-ADAccount
Задача 10: Найти компьютеры по типу
Мне также часто задают вопрос, как найти учетные записи компьютеров по типу, например, серверы или рабочие станции. С вашей стороны это требует определенной креативности. В AD нет ничего такого, чтобы отличало сервер от клиента, разве что ОС. Если Ваш компьютер работает под Windows Server 2008, придется слегка сделать несколько дополнительных действий.
Для начала необходимо получить список ОС, а затем осуществляем фильтрацию учетных записей по имеющимся ОС.
PS C:> Get-ADComputer -Filter * -Properties OperatingSystem |
Select OperatingSystem -unique | Sort OperatingSystem
Результаты показаны на рисунке 7.
Рис. 7. Извлечение списка ОС
Я хочу найти все компьютеры, на которых стоит серверная ОС:
PS C:> Get-ADComputer -Filter "OperatingSystem -like
'*Server*'" -properties OperatingSystem,OperatingSystem
ServicePack | Select Name,Op* | format-list
Результаты приведены на рисунке 8.
Как и другими командлетами AD Get, Вы можете настроить поисковые параметры и ограничить запрос отдельными OU, если это необходимо. Все выражения, которые я показал, могут быть интегрированы в большие PowerShell выражения. Например, Вы можете сортировать, группировать, применять фильтры, экспортировать в CSV или создавать и отправлять на почту HTML отчеты – и все это из PowerShell! При этом Вам не придется писать ни единого скрипа.
Вот Вам бонус: отчет о возрасте пароля пользователя (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:Workpwage.htm
Хотя это выражение может выглядеть слегка пугающим, при минимальном знании PowerShell им легко воспользоваться. И остается лишь последний совет: как определить кастомное свойство под названием PasswordAge. Значение представляет собой промежуток между сегодняшним днем и свойством PasswordLastSet. Затем я сортирую результаты для моего нового свойства. На рисунке 9 показан выход для моего небольшого тестового домена.
Upd:
В посте приведен перевод статьи на портале WindowsITPro
Top 10 Active Directory Tasks Solved with PowerShell
Бонус: PowerShell для целей системного администрирования \ Статьи на Хабре
- Уведомления об истечении срока действия пароля в Active Directory средствами PowerShell
- Аудит удаления и доступа к файлам и запись событий в лог-файл средствами Powershell
- Аудит Active Directory средствами Powershell с оповещением об изменениях. Часть 1 и Часть 2
- Потерянная группа. Выясняем назначение «странных» групп в AD
А как вы используете PowerShell для того, чтобы упростить вашу работу?
Когда Windows PowerShell только появился, многие стали спрашивать, можно ли управлять Active Directory (AD) с использованием PowerShell. В те времена ответ Microsoft был не таким, какой хотелось бы услышать большинству администраторов. В PowerShell имелся встроенный «акселератор типов» Active Directory Service Interfaces (ADSI) для доступа к объектам AD, но пользователю приходилось в основном самостоятельно выяснять, как применить PowerShell для решения задач администрирования AD. Значительные изменения произошли с выпуском Windows Server 2008 R2, в котором появился модуль PowerShell для Active Directory. В модуль AD входит набор команд для управления AD, а также AD Provider, с помощью которого можно перемещаться по AD, как по диску с символьным обозначением. В этой статье я покажу, как установить модуль AD, и подробно опишу его функционирование
Когда Windows PowerShell только появился, многие стали спрашивать, можно ли управлять Active Directory (AD) с использованием PowerShell. В те времена ответ Microsoft был не таким, какой хотелось бы услышать большинству администраторов. В PowerShell имелся встроенный «акселератор типов» Active Directory Service Interfaces (ADSI) для доступа к объектам AD, но пользователю приходилось в основном самостоятельно выяснять, как применить PowerShell для решения задач администрирования AD. Спустя некоторое время компания Quest Software предоставила бесплатный набор команд для административных задач AD, в том числе создания, изменения и удаления объектов AD, и поиска объектов в AD. В течение длительного периода состояние PowerShell и управления AD было таким.
Значительные изменения произошли с выпуском Windows Server 2008 R2, в котором появился модуль PowerShell для Active Directory. В модуль AD входит набор команд для управления AD, а также AD Provider, с помощью которого можно перемещаться по AD, как по диску с символьным обозначением. В этой статье я покажу, как установить модуль AD, и подробно опишу его функционирование.
Установка Active Directory Module
В отличие от предыдущих инструментов, в которых для связи с AD применялся протокол LDAP, модуль AD использует протоколы Active Directory Web Services (ADWS) для обмена данными с контроллером домена (DC) AD. Эти протоколы подробно описаны в блоге MSDN «Active Directory Web Services Overview», но достаточно отметить, что команды PowerShell в модуле AD и Active Directory Administrative Center (ADAC) используют ADWS для связи и получения информации из AD.
При установке контроллеров домена Windows Server 2012 или Server 2008 R2 в домене AD протокол ADWS устанавливается и запускается по умолчанию на каждом из них. Если ваш домен состоит целиком из контроллеров домена Windows Server 2008 или Windows Server 2003, необходимо установить ADWS отдельно. Microsoft бесплатно предоставляет пакет Active Directory Management Gateway Service для этой цели. Если установить пакет по крайней мере на одном контроллере домена AD Server 2008 или Server 2003, то можно использовать модуль AD для PowerShell наряду с ADAC.
Собственно модуль AD устанавливается по умолчанию на любом DC с операционной системой Server 2012 или Server 2008 R2. На компьютерах Windows 8 и Windows 7 (или любом компьютере, кроме DC, работающем с Server 2012 или Server 2008 R2), необходимо установить средства удаленного администрирования сервера Remote Server Administration Tools из центра загрузки Microsoft.
Независимо от того, установлены Remote Server Administration Tools на компьютере заранее или отдельно, следующий шаг — открыть раздел установки и удаления программ Add/Remove Programs в панели управления и выбрать пункт включения или отключения компонентов Windows — Turn Windows features on or off — в меню слева. Прокрутите диалоговое окно компонентов Windows Feature вниз до раздела Remote Server Administration Tools. Найдите флажок Active Directory Module for Windows PowerShell в папке Remote Server Administration ToolsRole Administration ToolsAD DS and AD LDS Tools, как показано на экране 1. Установите флажок и нажмите кнопку OK, чтобы установить модуль.
Экран 1. Установка модуля AD для PowerShell |
После этого вы должны увидеть ярлык Active Directory Module for Windows PowerShell в разделе Administrative Tools меню Start. Щелкните этот ярлык, чтобы запустить PowerShell с загруженным модулем AD. Если вы уже работаете в PowerShell и хотите просто загрузить модуль, чтобы он стал доступным для использования, можно ввести следующую команду и получить доступ к командам AD и AD Provider:
Import-Module ActiveDirectory
Теперь посмотрим, как перемещаться по AD с помощью AD Provider.
Использование Active Directory Provider
В PowerShell реализована концепция дисков PowerShell, которые я буду называть просто дисками PS. Упрощенно можно назвать диск PS представлением ресурса, такого как пригодная для навигации файловая система, состоящая из папок и конечных элементов. Не каждый ресурс можно представить таким образом, но многие (в том числе AD и реестр) хорошо вписываются в эту модель. Модуль AD содержит провайдера для диска PS AD. Соответственно, можно перемещаться и даже изменять AD, как будто это файловая система.
Как же перемещаться по AD, используя AD Provider? Предполагается, что PowerShell открыт и модуль AD загружен. В этом случае первый шаг — запустить команду Set-Location, которая имеет несколько псевдонимов, в том числе sl и cd:
Set-Location AD:
Эта команда изменяет текущее рабочее положение диска PS AD. В результате приглашение PowerShell покажет AD: вместо C:. Затем, чтобы увидеть элементы в диске PS AD, можно применить команду Get-ChildItem с псевдонимом dir:
Get-ChildItem
На экране 2 показан пример результата на моем компьютере.
Экран 2. Список разделов домена, доступных в PS-диске AD |
Как мы видим, команда возвращает список всех доступных разделов домена. Самый интересный, на мой взгляд, — раздел домена с именем cpandl, который содержит имена пользователей и компьютеров. Чтобы изменить этот домен, достаточно ввести команду:
Set-Location «dc=cpandl,dc=com»
Обратите внимание, что используется команда Set-Location с различающимся именем (DN) моего домена AD. Это требуется для корректной навигации. После перехода в каталог домена (на что указывает приглашение AD:dc=cpandl,dc=com в PowerShell), можно использовать команду Get-ChildItem, чтобы увидеть структуру AD верхнего уровня (экран 3).
Экран 3. Просмотр верхнего уровня иерархии AD |
Если нужно взглянуть на пользователей в организационной единице (OU) SDM, то для перехода в эту OU достаточно ввести:
Set-Location «OU=SDM»
Командная строка PowerShell будет иметь вид AD:ou=SDM,dc=cpandl,dc=com. На данном этапе можно использовать команду Get-ChildItem, чтобы увидеть все объекты пользователя в этом OU. Если нужно изменить свойство Description на объекте пользователя, представляющем мою учетную запись пользователя Darren Mar-Elia. Для этого есть команда! Команда Set-ItemProperty позволяет изменить свойство в объекте AD. Если нужно изменить описание учетной записи пользователя на Chief Techie, следует выполнить команду:
Set-ItemProperty -Path '.CN=Darren Mar-Elia' ` -Name «Description» -Value «Chief Techie»
Как мы видим, здесь используется параметр –Path для указания моей учетной записи пользователя в текущем каталоге. Я также использую параметр -Name, дабы указать, что нужно изменить свойство Description, и параметр –Value, для указания описания Chief Techie.
Обратите внимание, что если нужно найти все объекты с определенным значением свойства, можно задействовать Get-ItemProperty. Если требуется просто получить ссылку на объект AD, используйте Get-Item.
Как видите, работать с AD таким образом довольно просто. Механизм вряд ли подходит для массовых изменений, однако он удобен для работы с AD как с файловой системой. При этом, как я выяснил, большинство администраторов использует команды вместо диска PS AD для управления AD. Посмотрим, как действуют некоторые из этих команд.
Применение команд Active Directory
Модуль для AD, поставляемый с Windows 7, содержит 76 команд для управления AD. Их можно использовать почти для любых целей, в том числе поиска объектов AD, создания и удаления объектов AD и манипуляций с информацией о настройках AD (например, режим леса и детальная политика паролей). Обычно команды группируются по глаголам, таким как Add-, Remove-, Get- и Set-. Обратите внимание, что не каждая команда Get- имеет соответствующую команду Set- и наоборот, поэтому иногда приходится потратить усилия, чтобы найти нужную команду для задачи. Например, можно установить уровень функциональности леса AD с использованием Set-ADForestMode, но чтобы выяснить текущий уровень функциональности леса, необходимо задействовать команду Get-ADForest и посмотреть свойство ForestMode на возвращенном объекте.
Рассмотрим несколько типовых задач, которые можно выполнить с помощью команд AD. В частности, далее будет показано, как добавить учетные записи пользователя, управлять членством в группе, сбросить пароли учетных записей пользователя и выполнять поиск объектов AD.
Добавление учетных записей пользователя
Команда New-ADUser обеспечивает простой способ добавлять учетные записи пользователя в AD. Если нужно добавить новую учетную запись пользователя с именем Bill Smith в организационную единицу SDM, то в самом простом случае можно создать учетную запись нового пользователя с помощью команды:
New-ADUser -Name «Bill Smith» -SamAccountName «bsmith» ` -GivenName «Bill» -Surname «Smith» ` -DisplayName «Bill Smith» -Path «OU=SDM,DC=cpandl,DC=com»
В этой команде вводится основная информация об учетной записи пользователя. В частности, параметр -SamAccountName служит для предоставления имени учетной записи SAM, необходимой для создания объекта пользователя. Также применяется параметр –Path, чтобы сообщить команде место, куда следует поместить объект — в данном случае в организационную единицу SDM в домене cpandl.com. Кроме того, указано имя пользователя (параметр -GivenName), фамилия (параметр -Surname) и отображаемое имя (параметр -DisplayName).
Выполнение этой команды приведет к созданию учетной записи пользователя, но есть две проблемы. Во-первых, учетная запись будет отключена. Во-вторых, с учетной записью не будет связан пароль, что требуется в большинстве доменов.
Чтобы избежать необходимости активировать учетную запись и назначать пароль отдельно, можно изменить команду New-ADUser. New-ADUser автоматически активирует учетную запись, если указать параметр -Enabled $true в команде. Для активирования требуется пароль, поэтому необходимо также указать его в команде.
Чтобы предоставить пароль, можно использовать параметр –AccountPassword. Однако нельзя ввести пароль простым текстом в командной строке. Этот параметр требует, чтобы пароль был введен в защищенной строке (то есть имел тип данных SecureString). Существует два способа преобразовать пароль в защищенную строку, и в обоих случаях используется переменная.
В первом методе применяется команда ConvertTo-SecureString, которая преобразует строки простого текста в защищенные строки. Например, если нужно преобразовать пароль P@ssw0rd12 в защищенную строку и назначить его переменной $pwd, следует выполнить команду:
$pwd = ConvertTo-SecureString -string «P@ssw0rd12» ` -AsPlainText –force
Это не самый безопасный метод назначения пароля, так как кто-то может заглянуть вам через плечо при вводе команды. Более надежный способ, если команда New-ADUser запросит пароль и будет скрывать вводимые символы. Это можно сделать с помощью команды Read-Hostcmdlet с параметром –AsSecureString:
$pwd = Read-Host -AsSecureString
После выполнения этой команды вы увидите на экране знакомый символ «*» при вводе пароля. Завершив ввод, нажмите клавишу Enter.
После того, как пароль сохранен в переменной $pwd, можно передать его в команду New-ADUser:
New-ADUser -Name»Bill Smith«-SamAccountName»bsmith«` -GivenName»Bill«-Surname»Smith«` -DisplayName»Bill Smith«` -Path»OU=SDM,DC=cpandl,DC=com«` -Enabled $true -AccountPassword $pwd
Как мы видим, команда содержит параметры -Enabled и –AccountPassword, которые активируют учетную запись и безопасно назначают ей пароль.
Создание пользовательских учетных записей по одной — аккуратный способ, но иногда требуется создать несколько учетных записей одновременно. PowerShell прекрасно подходит для этой цели. Например, если нужно создать три учетных записи пользователя, то можно подготовить файл с разделением запятыми (CSV), который содержит информацию об учетной записи, а затем использовать команду Import-CSV для передачи этой информации в New-ADUser.
На экране 4 показан файл CSV с именем userlist.csv.
Экран 4. Применение CSV-файла для создания нескольких пользовательских учетных записей одновременно |
Обратите внимание, что в этом файле заголовки столбцов соответствуют именам параметров, предоставленных в предыдущей команде New-ADUser. Это сделано специально. Когда данные CSV передаются в New-ADUser, команда выберет эти имена параметров из конвейера PowerShell и их не придется указывать в самой команде. Вот команда, применявшаяся для создания трех учетных записей пользователя:
Import-CSV -Path C:datauserlist.csv | New-ADUser -Enabled $true -AccountPassword $pwd
Как можно заметить, выходные строки команды Import-CSV поступают в команду New-ADUser. Конвейер распознает, что заголовки столбца в CSV-файле представляют собой имена параметров, а остальные строки содержат значения, поэтому нужно лишь предоставить параметры -Enabled и –AccountPassword. Это превосходная возможность конвейера. Благодаря ей удается гораздо эффективнее использовать PowerShell для задач автоматизации такого типа.
Управление членством в группах
Добавление учетных записей пользователей и компьютеров — типичная задача управления AD. С помощью модуля AD выполнить ее сравнительно несложно. Используя команду Add-ADGroupMember, можно добавить в группу одну или несколько учетных записей. Например, если нужно добавить трех новых пользователей в группу Marketing Users. Самый простой способ — использовать команду:
Add-ADGroupMember -Identity»Marketing Users«` -Members jadams,tthumb,mtwain
В этой команде параметр -Identity служит для того, чтобы предоставить имя группы. Также применяется параметр -Members для предоставления имен учетных записей SAM пользователей. Если имеется несколько имен учетных записей SAM, то их следует указать в файле с разделителями в виде запятых.
Можно объединить операции создания трех учетных записей и их добавления в группу Marketing Users в одной команде, чтобы решить задачу одним действием. Однако команда Add-ADGroupMember не поддерживает передачу имен членов группы в конвейер. Поэтому необходимо использовать команду Add-ADPrincipalGroupMembership, если требуется задействовать конвейер. Эта команда может принимать объекты пользователя, компьютера или группы как входные из конвейера и добавлять эти объекты в указанную группу.
Соединить операцию создания пользователей с операцией добавления новых пользователей в группу Marketing Users в одной команде можно следующим образом:
Import-CSV -Path C:datauserlist.csv | New-ADUser -Enabled $true -AccountPassword $pass ` -PassThru | Add-ADPrincipalGroupMembership ` -MemberOf»Marketing Users«
Обратите внимание, что к части New-ADUser команды добавлен параметр –PassThru. Этот параметр указывает New-ADUser, что нужно передать созданные объекты пользователя в конвейер. Если данный параметр не указан, то выполнение команды Add-ADPrincipalGroupMembership завершится неудачей.
Также примечательно, что используется только параметр -MemberOf для указания имени группы в разделе Add-ADPrincipalGroupMembership команды. Конвейер обеспечивает остальное, добавляя каждого из трех пользователей в группу Marketing Users.
Итак, с помощью одной команды PowerShell было создано три новых пользователя, они были размещены в OU, получили пароли и были добавлены в группу Marketing Users. Теперь рассмотрим некоторые другие типичные задачи обслуживания AD, которые можно автоматизировать с использованием PowerShell и модуля AD.
Сброс паролей учетных записей пользователя
Иногда пользователям требуется сбросить пароль учетной записи. Эту задачу легко автоматизировать с помощью команды Set-ADAccountPassword, изменив или сбросив пароль учетной записи. Чтобы изменить пароль, необходимо знать старый пароль и ввести новый. Чтобы сбросить пароль, достаточно предоставить новый пароль. Однако необходимо разрешение Reset Password на объект пользователя в AD, чтобы выполнить сброс пароля.
Как и параметр -AccountPassword команды New-ADUser, команда Set-ADAccountPassword использует тип данных SecureString для паролей, поэтому необходимо задействовать один из методов преобразования простых текстовых паролей в защищенные строки. Например, если нужно сбросить пароль для учетной записи пользователя Tom Thumb, то после сохранения нового пароля как защищенной строки в переменной $pass можно выполнить команду:
Set-ADAccountPassword -Identity»tthumb«` -NewPassword $pass –Reset
В этой команде я использую параметр –Identity, чтобы назначить имя учетной записи SAM для учетной записи пользователя Tom Thumb. Я также ввожу параметр -NewPassword с переменной $pass, чтобы предоставить новый пароль. Наконец, задается параметр –Reset, дабы указать, что выполняется сброс, а не изменение пароля.
Еще одна дополнительная задача: переключить флаг учетной записи пользователя Tom Thumb, чтобы заставить его изменить пароль при следующей регистрации. Это обычный прием, когда нужно сбросить пароль пользователя. Данную задачу можно выполнить с помощью команды Set-ADUser, присвоив параметру -ChangePasswordAtLogon значение $true:
Set-ADUser -Identity tthumb -ChangePasswordAtLogon $true
Возникает вопрос, почему не был использован конвейер для передачи вывода команды Set-ADAccountPassword в команду Set-ADUser, чтобы выполнить обе операции в одной команде PowerShell. Я попробовал этот подход, он не работает. Вероятно, в команде Set-ADAccountPassword есть какое-то ограничение, не позволяющее успешно выполнить единую команду. В любом случае, достаточно просто переключить флаг с использованием команды Set-ADUser, как показано выше.
Поиск объектов Active Directory
Другая типичная задача AD — поиск объектов AD, соответствующих определенным критериям. Например, можно найти все компьютеры с определенной версией операционной системы Windows в домене AD. Команда Get-ADObject — самая удобная для поиска LDAP. Например, чтобы найти компьютеры Server 2008 R2 в домене cpandl.com, была применена команда:
Get-ADObject -LDAPFilter ` »(&(operatingSystem=Windows Server 2008 R2 Enterprise)` (objectClass=computer))«-SearchBase»dc=cpandl,dc=com«` -SearchScope Subtree
Эта команда использует три параметра для выполнения задачи: -LDAPFilter, -SearchBase и -SearchScope. Параметр -LDAPFilter принимает в качестве входного стандартный запрос LDAP. В этом примере запрашиваются все объекты компьютера, у которых атрибут OperatingSystem имеет значение Windows Server 2008 R2 Enterprise. Параметр -SearchBase указывает команде, где начать поиск в иерархии AD. В данном случае выполняется поиск из корневого каталога домена AD, но не составляет труда ограничить поиск определенной OU. Параметр –SearchScope указывает команде, следует ли обходить все контейнеры под базой поиска, обнаруживая указанные объекты. В этом случае используется параметр Subtree, чтобы команда проверяла все нижележащие контейнеры.
При запуске команды отображаются объекты, соответствующие критерию. Или же можно направить результаты в другую команду для обработки найденных объектов.
Обратите внимание, что для масштабных поисков полезно задействовать параметр –ResultPageSize, чтобы управлять разбиением результатов поиска на страницы. Обычно я присваиваю этому параметру значение 1000, и команда Get-ADObject возвращает 1000 объектов за один раз. В противном случае можно не получить ожидаемый результат, так как число возвращаемых объектов превышает максимально предусмотренное политикой, установленной для одного запроса поиска.
Другая команда для поиска, предоставленная компанией Microsoft, — Search-ADAccount. Эта команда особенно полезна для поиска с различными заранее заданными условиями, например отключенных учетных записей, учетных записей с просроченными паролями и блокированных учетных записей. Так, следующая команда отыскивает все учетные записи пользователя с просроченными паролями в OU SDM:
Search-ADAccount -PasswordExpired -UsersOnly ` -SearchBase»OU=sdm,dc=cpandl,dc=com«` -SearchScope OneLevel Search-ADAccount -PasswordExpired -UsersOnly ` -SearchBase»OU=sdm,dc=cpandl,dc=com" ` -SearchScope OneLevel
В этой команде используется параметр –PasswordExpired, указывающий, что нужны учетные записи с просроченными паролями. Параметр -UsersOnly указывает, что нужно искать только объекты пользователя (то есть исключить объекты «компьютер»). Как в предыдущем примере, используются параметры -SearchBase и –SearchScope, чтобы указать область поиска. Но в данном случае я использую параметр OneLevel для поиска только в ближайшем OU (то есть исключая любые дочерние организационные единицы).
Это лишь поверхностный рассказ о модуле AD, но надеюсь, вы получили представление о заложенных в нем возможностях. Как отмечалось выше, в модуле более 70 команд. Среди тем, которые не были затронуты в статье, — удаление объектов с использованием команды Remove-, восстановление удаленных объектов с помощью команды Restore-ADObject и удаление свойств UAC на объектах пользователя посредством команды Set-ADAccountControl. Существуют команды почти для любых административных задач AD.
Table of Contents
- Computer object commands
- Group object commands
- Organizational Unit (OU) commands
- User object commands
- See Also
Computer object commands
List all computer accounts in a domain
Get-ADComputer –Filter {Name –Like «*»}
View all computers that are logged in for 90 days to the Active Directory
Search-ADaccount -AccountInactive -Timespan 90 -ComputersOnly
OR
$lastLogon = (get-date).adddays(-90).ToFileTime()
Get-ADComputer -filter {lastLogonTimestamp -gt $lastLogon}
Find and delete all disabled Computer accounts in Active Directory
Search-ADAccount -AccountDisabled -ComputersOnly | Sort-Object | Remove-ADComputer
Find and delete disabled computer accounts from a specific OU
Search-ADAccount -AccountDisabled -Searchbase «OU=IT,DC=Contoso,DC=Com» -ComputersOnly | Sort-Object | Remove-ADComputer
Find and delete all computer accounts that no longer have signed up since 11/20/2011 to the Active Directory
Search-ADAccount -AccountInactive -DateTime «20.11.2011» –ComputersOnly | Sort-Object | Remove-ADComputer
List only disabled Computer accounts in Domain
Search-ADAccount -AccountDisabled -ComputersOnly | Format-Table Name
Move Computer to other OU (example: Computer=CLIENT1 to OU=IT)
Get-ADComputer CLIENT1 | Move-ADObject -TargetPath «OU=IT,DC=Contoso,DC=Com»
See Computer account detail (example: Computer=CLIENT1)
Get-ADComputer -Filter {Name -Like «CLIENT1»}
Get a specific computer showing all the properties (example: Computer=CLIENT1)
Get-ADComputer «CLIENT1» -Properties *
List Computers (Name, Operating System, Service Pack, Operating System version)
Get-ADComputer -Filter * -Property * | Format-Table Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion -Wrap –Auto
Export Computers List (Name, Operating System, Service Pack, Operating System version)to CSV File
Get-ADComputer -Filter * -Property * | Select-Object Name,OperatingSystem,OperatingSystemServicePack,OperatingSystemVersion | Export-CSV AllWindows.csv -NoTypeInformation -Encoding UTF8
Get Computer IPv4 Address and DnsHostName
Get-ADComputer -Filter {Name -Like «Computer-Name»} -Properties IPv4Address | Format-List Name,DnsHostName,IPv4Address
Get all Computers in a specific OU (example: OU=IT, Domain=Contoso.com)
Get-ADComputer -SearchBase «OU=IT,DC=Contoso,DC=Com» -filter *
Get all the Computers without a specific DNS suffix
Get-ADComputer -filter «DnsHostName -notlike ‘*.Contoso.Com'»
Get Computer Service Principal Names (SPNs)
Get-ADComputer «Computer-Name» –Properties ServicePrincipalNames | Select-Object –Expand ServicePrincipalNames
Get Computers Security Identifiers (SIDs)
Get-ADComputer -Filter {Name -like «*»} | Select Name,SID | Format-Table -Auto
All computer accounts that were created in the last 90 days in the Active Directory
Get-ADComputer -Filter * -Properties whenCreated | ? { ((Get-Date) — $_.whenCreated).Days -lt 90} | Format-Table Name,WhenCreated,Name,DistinguishedName -Autosize -Wrap
All computer accounts that were created as of December 1, 2011 (12/01/2011) in the Active Directory
Get-ADComputer -LDAPFilter «(&(objectCategory=person)(whenCreated>=20111201000000.0Z))» -Properties whenCreated | Format-Table Name,whenCreated,distinguishedName -Autosize -Wrap
All computer accounts that were created here in a given time, between the 10/01/2011 and 12/01/2011 in Active Directory
$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
All computer accounts, Last Password Set in a given time, between the 10/01/2011 and 12/01/2011 in Active Directory
$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 PasswordLastSet | ? { ($_.PasswordLastSet -gt $Start) -and ($_.PasswordLastSet -le $End) } | Format-Table Name,WhenCreated,DistinguishedName -Autosize -Wrap
All computer accounts, Last Password Set in the last 90 days in Active Directory
$Date = (Get-Date).AddDays(-90)
Get-ADComputer -Filter * -Properties PasswordLastSet | where { $_.PasswordLastSet -le $Date } | Format-Table Name,PasswordLastSet,DistinguishedName -Autosize -Wrap
Group object commands
List all members of a group (example: Group=Experts)
Get-ADGroupMember Experts | Format-Table Name
All properties of a group (example: Group=IT)
Get-ADGroup IT -Properties *
List only Universal Security groups
Get-ADGroup –LDAPFilter «(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=-2147483640))»
List only Global Security groups
Get-ADGroup –LDAPFilter «(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=-2147483646))»
List only Domain Local Security groups
Get-ADGroup –LDAPFilter «(&(objectCategory=group)(groupType:1.2.840.113556.1.4.803:=-2147483644))»
List all Group memberships for a user (example: User=EdPrice)
Get-ADAccountAuthorizationGroup EdPrice
Move a Group to another OU (example: 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»
Add members to a group (example: Group=Experts, User=EdPrice)
Add-ADGroupmember Experts -Member EdPrice
Delete Group (example: Group=Experts)
Remove-ADGroup Experts
Delete a User from a Group (example: Group=Experts, User=EdPrice)
Remove-ADGroupMember Experts -Member EdPrice
Set Description for a Group (example: Group=JoinPC, Description=This group is allowed join PCs to Domain)
Set-ADGroup JoinPC -Description «This group is allowed join PCs to Domain»
Add Users from one Group to another Group (example: from Group1=DataUsers to Group2=SQLUsers)
Get-ADGroupMember DataUsers | Select sAMAccountName | ForEach { Add-ADGroupMember SQLUsers -Members $_.sAMAccountName }
Comparing two Groups to see the Group memberships (example: Group1=Administratorso, Group2=DNSAdmins)
Compare-Object ( Get-ADGroupMember Administrators) ( Get-ADGroupMember DNSAdmins) -IncludeEqual
Organizational Unit (OU) commands
All OUs in Domain
Get-ADOrganizationalUnit -Filter {Name -like „*“} | FT Name, DistinguishedName -A
Create OU (example: OU=IT, Domain=Contoso.com)
New-ADOrganizationalUnit -Name IT -Path «DC=Contoso,DC=Com»
Contents of a specific OU (example: OU=IT, Domain=Contoso.com)
Get-ADObject -Filter {Name -Like «*»} -Searchbase «OU=IT,DC=Contoso,DC=Com»
Rename OU (example: Old-Name=IT, New-Name=Admin, Domain=Contoso.com)
Rename-ADObject «OU=IT,DC=Contoso,DC=Com» -NewName Admin
Delete OU including contents (example: OU=IT, Domain=Contoso.com)
Remove-ADOrganizationalUnit IT -Recursive
Delete user from specific OU (example: User=EdPrice, OU=IT, Domain=Contoso.com)
Remove-ADObject «CN=EdPrice,OU=IT,DC=Contoso,DC=Com»
Move all objects from one OU to another OU (example: 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»
User object commands
List all User accounts in the Domain
Get-ADUser –Filter *
List all User accounts in a specific OU (example: OU=IT, Domain=Contoso.com)
Get-ADUser –Filter * -Searchbase «OU=IT,DC=Contoso,DC=Com» | FT
List all User accounts from specific City (example: City=NewYork)
Get ADUser -Filter {city — like «NewYork»} | FT
List only disabled User accounts in Domain
Search-ADAccount –AccountDisabled –Usersonly | FT Name
List all User accounts whose First Name is Ed
Get-ADUser –Filter {givenName –Like «Ed»} | FT
List all User accounts whose Last Name is Price
Get-ADUser –Filter {Surname –Like «Price»} | FT
List all User accounts from the specific Department (example: Department=Support)
Get-ADUser –Filter {Department –Like «Support»} | FT
List a User’s Group memberships (example: User=Richard)
Get-ADPrincipalGroupMembership -Identity Richard
List all Users from specific Group and move Users to another OU
(example: Group=People, Target OU=NewYork, Domain=Contoso.com)
Get-ADGroupMember People -Recursive | Move-ADObject –TargetPath «OU=NewYork,DC=Contoso,DC=Com»
Remove all users in an OU from a specific Group
(example: 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
See Also
Here are two great article about Active Directory LDAP Syntax and Active Directory Characters to Escape:
- Active Directory: Characters to Escape (Richard Mueller — MVP)
- Active Directory: LDAP Syntax Filters (Richard Mueller — MVP)
- Move (Transfering or Seizing) FSMO roles with AD-Powershell command
to another Domain Controller - How To Revert Back or downgrade Windows Server 2008 R2 Forest and Domain
functional Level - PowerShell Portal
- Wiki: Portal of TechNet Wiki Portals
Ниже я собрал некоторые из лучших скриптов Active directory Powershell, которые, несомненно, сэкономят ваше время. Управление доменом – это работа Active Directory, и понимание каждого компонента является обязательным. Active Directory состоит из пользователей, групп, которые можно проверить в Active directory users and computers (ADUC). Создание пользователя в домене или сохранение пользователя в домене – это работа системного администратора windows.
Работая много лет, я столкнулся со многими проблемами в качестве системного администратора windows. Иногда создание пользователей или групп в домене занимает значительное время. Это процесс можно автоматизировать, чтобы сэкономить время. В данной статье есть скрипты DNS powershell, скрипты DHCP powershell.
Полезные команды Powershell для Active Directory
Получить всех пользователей AD в домене
Get-aduser -properties * -filter *
Модуль импорта Active Directory
Import-module activedirectory
Получить все компьютеры из домена
Get-adcomputer -properties * -filter *
Отключить пользователя AD по имени учетной записи SAM
Disable-ADaccount -identity "Name"
Экспорт данных в формат CSV
Get-adcomputer -properties * -filter * |export-csv "give path"
Получить имя учетной записи AD Groups SAM
Get-ADgroup -identity "provide group name"
Выбрать конкретный атрибут пользователя
Get-aduser -properties * -filter *
Получить информацию о домене
Get-ADdomain
Установите роль Active Directory
Install-windowsfeature AD-Domain-Services
Получить список контроллеров домена
Get-ADDomainController
Восстановление пользователей AD
Восстановление удаленного пользователя из контроллера домена. Иногда мы сталкиваемся со многими проблемами при очистке AD, иногда мы удаляем пользователей AD, и это создает хаос среди наших пользователей. Вот решение этой проблемы.
Как это работает
Предоставляем решение этой проблемы в виде скриптов Active Directory Powershell.
Вероятный результат
После запуска этого скрипта выполните поиск пользователя в dsa.msc, он должен вернуться без потери информации. Этот скрипт очень удобно использовать, и я предпочитаю использовать его вместо GUI.
AD-User Recover Powershell Scripts
###### Make sure the AD recyclebin is enabled ###### $Name=read-host "Enter the deleted user" Get-ADObject -Filter 'samaccountname -eq $name' -IncludeDeletedObjects | Restore-ADObject write-host "User $Name is recovered" -ForegroundColor DarkGreen
Добавление сервера в домен
Добавление сервера в домен, смена IP – это большая задача, которая иногда становится утомительной, так почему бы не автоматизировать ее. Скрипт работает безупречно и без каких-либо заминок. Это отличный вариант в категории скриптов Active Directory Powershell.
Как это работает
Обычно скрипт просит предоставить IP контроллера домена, что является главным требованием при добавлении сервера в домен. После этого он обычно просит указать имя домена, например xyz.com, и перезагружает сервер без предварительного запроса.
Вероятный результат
После запуска этого скрипта первым делом войдите в систему с доменными учетными данными, чтобы проверить, можете ли вы войти в систему или нет.
Adding Servers into Domain Powershell Scripts
## Pre-requisite:- #1). Update the Primary DNS IP in the Network adapter before joining servermachine to domain by running below cmd. ## For single servermachine to be added to domain. set-DnsClientServerAddress-InterfaceIndex 2 -ServerAddresses ("Primary DNS IP address") set-DnsClientServerAddress -InterfaceAlias Ethernet -AddressFamily IPv4 |Select-Object ServerAddresses #Once DNS IP is updated, then execute below cmd. Add-Computer -ComputerName $computers -Domain "YourDomainName" -Restart #Give your domain credentials in the credential request window. *************************************************************************************************************************************** ## For multiple servermachine to be added to domain. set-DnsClientServerAddress -InterfaceIndex 2 -ServerAddresses ("Primary DNS IP address") set-DnsClientServerAddress -InterfaceAlias Ethernet -AddressFamily IPv4 |Select-Object ServerAddresses #Once DNS IP is updated on machines, then execute below cmd. $computers = Get-Content -Path c:testdesktopcomputers.txt Add-Computer -ComputerName $computers -Domain "YourDomainName" -Restart #Give your domain credentials in the credential request window.
Передача роли FSMO
Cкрипт просит указать предпочтение от 1 до 5, какую роль вы хотите назначить другому DC. Аналогично, если мы делаем это с помощью GUI, это долго, а через powershell это быстро и просто. В этом скрипте при успешной передаче вы получите сообщение об успешной передаче роли.
Вероятный результат
После запуска этого скрипта вы сможете перенести роли с одного DC на другой. Роли FSMO очень важны, поэтому делайте это очень осторожно.
FSMO Role Transfer Powershell Scripts
#Provide the destination DC in which you want to transfer the fsmo role $destinationdc= Read-Host "Provide the Destination domain controller" #Choose the role you want to transfer $role=read-host "Choose the role" Switch($role) { 1 { $result = 'DomainNamingMaster'} 2 { $result = 'PDCEmulator'} 3 { $result = 'RIDMaster'} 4 { $result = 'SchemaMaster'} 5 { $result = 'InfrastructureMaster'} 6 {$result = 'All'} } if($role -gt 6) { Write-host "Choose correct option" -ForegroundColor Cyan } #This will transfer DomainNamingMaster role to destination server if ($role -eq 1) { Move-ADDirectoryServerOperationMasterRole -OperationMasterRole DomainNamingMaster -Identity $destinationDc -confirm:$false Write-host "$result is transferred successfully to $destinationDc" -ForegroundColor DarkGreen -BackgroundColor Cyan netdom query fsmo |Select-String "Domain Naming Master" } #This will transfer PDCEmulator role to destination server if ($role -eq 2) { Move-ADDirectoryServerOperationMasterRole -OperationMasterRole PDCEmulator -Identity $destinationDc -confirm:$false Write-host "$result is transferred successfully to $destinationDc" -ForegroundColor DarkGreen -BackgroundColor Cyan netdom query fsmo |Select-String "PDC" } #This will transfer RID pool manager role to destination server if ($role -eq 3) { Move-ADDirectoryServerOperationMasterRole -OperationMasterRole RIDMaster -Identity $destinationDc -confirm:$false Write-host "$result is transferred successfully to $destinationDc" -ForegroundColor DarkGreen -BackgroundColor Cyan netdom query fsmo |Select-String "RID pool manager" } #This will transfer Schema Master role to destination server if ($role -eq 4) { Move-ADDirectoryServerOperationMasterRole -OperationMasterRole SchemaMaster -Identity $destinationDc -confirm:$false Write-host "$result is transferred successfully to $destinationDc" -ForegroundColor DarkGreen -BackgroundColor Cyan netdom query fsmo |Select-String "Schema Master" } #This will transfer Infrastructure Master role to destination server if ($role -eq 5) { Move-ADDirectoryServerOperationMasterRole -OperationMasterRole InfrastructureMaster -Identity $destinationDc -Credential -confirm:$false Write-host "$result is transferred successfully to $destinationDc" -ForegroundColor DarkGreen -BackgroundColor Cyan netdom query fsmo |Select-String "Infrastructure Master" } #This will transfer All roles to destination server if ($role -eq 6) { Move-ADDirectoryServerOperationMasterRole -OperationMasterRole DomainNamingMaster,PDCEmulator,RIDMaster,SchemaMaster,InfrastructureMaster -Identity $destinationDc -confirm:$false Write-host "$result roles are transferred successfully to $destinationDc" -ForegroundColor DarkGreen -BackgroundColor Cyan netdom query fsmo }
Отключение неактивных пользователей в AD
Отключение пользователей AD – это ежемесячная работа, и ее может быть трудно выполнить через графический интерфейс, если пользователей много. Я предлагаю вам сценарий, в котором вы можете отключить большое количество пользователей с помощью Powershell.
Как это работает
Скрипт запросит идентификатор пользователя, которого вы хотите отключить, а для массового отключения потребуется список пользователей, и он будет идентифицировать, используя учетную запись Sam. Выглядит просто, если использовать powershell, то да, это очень просто.
Disable Active directory User Powershell Scripts
#Wintel-AD-Disable Active Directory User: #for single: Import-Module ActiveDirectory Disable-ADAccount -Identity user1 #for bulk: #imports active directory module to only corrent session as it is related to AD Import-Module ActiveDirectory #Takes input from users.csv file into this script Import-Csv "C:Users.csv" | ForEach-Object { #assign input value to variable-samAccountName $samAccountName = $_."samAccountName" #get-aduser will retrieve samAccountName from domain users. if we found it will disable else it will go to catch try { Get-ADUser -Identity $samAccountName | Disable-ADAccount } #It will run when we can't find user catch { #it will display the message Write-Host "user:"$samAccountname "is not present in AD" } }
Отчет по неактивным пользователям
Во время аудита вам будет предложено предоставить список пользователей, которые не используют свои компьютеры или не заходят в систему в течение определенного периода времени, так вот, этот скрипт делает то же самое и значительно упрощает задачу.
Как это работает
Скрипт собирает данные о тех, кто не заходил в систему в течение определенного времени, например, 90 дней, и отправляет нам почту. Убедитесь, что у вас указан правильный SMTP, чтобы вы могли получать почту.
Вероятный результат
Скрипт покажет вам результаты неактивных пользователей, которые не заходили в систему в течение указанного периода времени.
AD-InActive Users Report-90 Days Powershell Scripts
#Imports active directory module to only current session Import-Module activedirectory #Get-Date gives the present date in the server and is assigned to the variable presentdate $presentdate= Get-Date #User names whose lastlogondate is less than the presentdate-90days and those usernames are given to the variable output $output=Get-ADUser -Filter * -Properties lastlogondate | Where-Object {$_.lastlogondate -lt $presentdate.adddays(-90)} | select name #This output is exported to a .csv file $output | Export-Csv C:inactiveusers.csv -NoTypeInformation #This prints the users who are inactive by taking from the output Write-Host "The following users are inactive : " -ForegroundColor DarkYellow $output
Как это работает
Скрипт получает список компьютеров в окружении и экспортирует его в csv.
Вероятный результат
Мы можем получить файл csv со списком компьютеров.
AD computers to csv Powershell Scripts
get-adcomputer -properties* -filter * | export-csv "provide path"
Включение recyclebin в AD является обязательным условием, если вы не хотите потерять информацию об удаленном пользователе. Преимущество включения этой функции в том, что мы можем легко восстановить любого пользователя в несколько кликов или с помощью скрипта.
Как это работает
Это просто набор команд для включения корзины, не используя настройки Windows. Скрипт прост и может быть выполнен без каких-либо проблем.
Вероятный результат
После выполнения скрипта вы можете проверить в ADUC, включен ли он, а также проверить, что показывает вывод после выполнения сценария.
Enable Recycle bin Powershell Scripts
$domain= read-host "Provide the domain name" $DCserver = read-host "Provide DC server name" Enable-ADOptionalFeature -Identity 'Recycle Bin Feature' -Scope ForestOrConfigurationSet -Target $domain -Server $DCserver -Confirm:$false
Удаление объектов AD
Объектом AD может быть компьютер или пользователь, и этот скрипт предоставляет вам возможность удалить пользователя и его машину из окружения. Больше не нужно идти и удалять пользователя/компьютер из GUI.
Как это работает
Этот скрипт использует переключатель, чтобы вы могли выбрать правильный вариант между удалением пользователя или компьютера, удаляет выбранный вариант и показывает результат на экране.
Вероятный результат
Пользователь или компьютер будет удален из домена AD.
AD-object-deletion Powershell Scripts
#Provide the input to choose to delete either User and Computer $input = read-host "Enter your choice" Switch($input) { 0 { $result = 'User Deletion'} 1 { $result = 'Computer Deletion'} } #If input is greater than 1 it will throw error. if ($input -gt 1) { Write-host "$input is not mentioned in the provided choices" -ForegroundColor Cyan } #If 0 is selected then provide the user name that needs to deleted. if($input -eq 0) { $user = Read-host "Provide user Name" Try{ Remove-aduser $user -confirm:$false Write-host "User $user is deleted" -foregroundcolor DarkGreen} Catch{ Write-host "$user is not present in AD or the Username is incorrect" -Foregroundcolor DarkRed } } #If 1 is selected then provide the computer name that needs to deleted. if ($input -eq 1) { $computer = Read-host "Provide Computer Name" Try{ Remove-ADComputer $computer -confirm:$false Write-host "User $computer is deleted" -BackgroundColor DarkGreen} Catch{ Write-host "$Computer is not present in AD or the Computer name is incorrect" -BackgroundColor DarkRed } }
Создайте несколько групп AD за один запуск. Просто укажите данные из CSV, скрипт получит результаты и создаст необходимые группы AD. Один из самых популярных скриптов, на который стоит обратить внимание.
Как это работает
Сценарий получает данные из CSV-файла и создает необходимую группу под определенным OU.
Вероятный результат
Группы AD будут созданы автоматически без каких-либо ручных операций по проверке. Просто предоставьте необходимые данные.
Create Multiple AD Groups Powershell Scripts
#\\\Create multiple AD Groups///////# $csv = Import-csv -Path "C:UserstestDesktopgroups.csv" $name=$item.GroupName Foreach ($item in $csv) { try { New-ADGroup -Name $item.GroupName -GroupCategory $item.GroupCategory -groupScope $item.groupScope -Path $item.OU Write-Host -ForeGroundColor Green "Group $($item.GroupName) created!" } catch { Write-Host "Group already exists $name" } }
Сбор данных о пользователях AD – это ежемесячный процесс, который используется при проведении аудита. Получение информации о пользователях AD – это то, к чему стремится каждая организация. Это простой скрипт для получения всех данных о пользователях.
Как это работает
После запуска скрипта он сохранит все данные о пользователях в файл формата csv.
Вероятный результат
Вы можете определить, требуется ли какая-либо выборка по дате последнего входа в систему и другие атрибуты.
AD user to csv Powershell Scripts
get-aduser -properties* -filter * | export-csv "provide path"
ADuser – Memberof – WhenCreated
Как это работает
Этот скрипт проверяет пользователя и членство, которое он имеет, а также получает дату создания учетной записи пользователя.
Вероятный результат
Вы получите представление о том, в какой группе состоит пользователь и когда он был создан в домене.
AD-when-created-memberof Powershell Scripts
$a=(Get-aduser -filter * -properties *).Name foreach($b in $a){ $c=(Get-aduser -identity $b -properties *).Whencreated $d=((Get-aduser -identity $b -properties *).memberof|Get-Adgroup).Name -join ',' write-host "$b | $c | $d " }
Дата последней установки пароля
Дата последней установки пароля не может быть получена непосредственно из powershell, нам необходимо несколько изменить скрипт. Если вы попытаетесь получить дату последней установки пароля, она покажет дату в 1601 году. Поэтому я создал скрипт для получения даты последнего пароля заданного samaccount.
Как это работает
Сценарий получает атрибут последнего установленного пароля пользователя и изменяет его на правильную дату. Список пользователей может быть предоставлен с помощью файла txt.
Вероятный результат
Скрипт получит атрибут последнего установленного пароля пользователя и изменяет его на правильную дату. Список пользователей может быть предоставлен с помощью txt-документа.
Last password set Powershell Scripts
$a="Provide path for list of user in txt doc" foreach($b in $a){ $g=get-aduser -Identity $b -Properties Name,pwdlastset $date=[datetime]$g.pwdLastSet $pwdlast =$date.AddYears(1600).ToLocalTime() "$b,$pwdlast"}
Создание OU Разовое и массовое
Для создания OU без каких-либо дополнительных шагов, я подготовил скрипт. Он создает одну OU или в нужном количестве.
Как это работает
Создание OU – это одна команда в Powershell, но массовое создание требует данных, которые могут быть представлены в CSV или текстовом файле, что и делается в этом скрипте.
Вероятный результат
Если вы все сделаете правильно, вы сможете увидеть созданные OU в dsa.msc.
Create OU Powershell Scripts
create active directory OU.txt
#Wintel-AD-Create Active Directory OU: for single: ----------- New-ADOrganizationalUnit -Name abc -Path "OU=Employees,DC=contoso,DC=com" -Description "if any" -PassThru For Bulk: --------- #Take input from ou_names file import-csv c:ou_names.csv | ForEach-Object { #Assign input values to variable-ouname $ouname = $_."ouname" #It will search for given OU already exists in AD $ADOU=get-ADOrganizationalunit -Filter 'Name -like $ouname' try{ #It will compare given OU and AD searched OU if($ouname -eq $ADOU){ #If it already in AD, it will go to caught statement write-host "given OU-" $ouname "is already there in AD"} #It will create OU if not exits else { New-ADOrganizationalUnit -Name $ouname -path "DC=contoso,DC=com" -PassThru } } #It will show the path of OU which already exists catch{ write-host $ouname "is exists in AD" write-host $ADOU } }
ou_names.csv
ouname ou1 ou2 ou3 ou4 ou5
readme.txt
This script will create OU's in AD. Prerequisites: 1.We should provide the OU names which needs to created in AD. Steps to run the script: 1.Provide OU names in csv file to script. 2.It will check for OU in AD whether it already exists. 3.If it doesn't exist in AD, it will create else it will provide path od OU.
Разовое удаление пользователей AD или массовое
Нужно удалить пользователя без каких-либо дополнительных кликов, данный скрипт именно для этого. Вы можете удалить одного пользователя или удалить пользователей в массовом порядке.
Как это работает
Удаление пользователя – это отдельная команда в Powershell, но для массового удаления требуются данные, которые могут быть получены их CSV или текстового файла, что и делается в этом скрипте.
Вероятный результат
Если вы все сделаете правильно, то удаленные пользователи не будут видны в dsa.msc.
Delete-user-account Powershell Scripts
Delete Active Directory User.txt
#Wintel-AD-Disable Active Directory User: #for single: Import-Module ActiveDirectory Remove-ADAccount -Identity user1 ###################for bulk################################ #imports active directory module to only corrent session as it is related to AD Import-Module ActiveDirectory #Takes input from users.csv file into this script Import-Csv "C:Users.csv" | ForEach-Object { #assign input value to variable-samAccountName $samAccountName = $_."samAccountName" #get-aduser will retrieve samAccountName from domain users. if we found it will disable else it will go to catch try { Get-ADUser -Identity $samAccountName | Remove-ADAccount } #It will run when we can't find user catch { #it will display the message Write-Host "user:"$samAccountname "is not present in AD" } }
users.csv
samAccountName akhila user1
readme.txt
This script will disable particularly given user accounts in AD. Prerequisites: 1.We should provide the user accounts which are in AD. Steps to run the script: 1.Provide user names in csv file to script. 2.It will check for user in AD. 3.if it is there, it will disable else it will provide a message like user is not present in AD.
Статус репликации AD
Если вы хотите узнать статус репликации AD в вашем домене, этот скрипт является наиболее подходящим для этого. Он предоставляет статус репликации и, если есть какая-либо ошибка, показывает ее.
Как это работает
Он похож на repadmin/replsum и выдает тот же результат в формате html.
Вероятный результат
Вы можете запланировать выполнение этого скрипта на регулярной основе, если возникнут ошибки, вы сможете проверить и устранить их.
AD-Replication-status Powershell Scripts
$myRepInfo = @(repadmin /replsum * /bysrc /bydest /sort:delta) # Initialize our array. $cleanRepInfo = @() # Start @ #10 because all the previous lines are junk formatting # and strip off the last 4 lines because they are not needed. for ($i=10; $i -lt ($myRepInfo.Count-4); $i++) { if($myRepInfo[$i] -ne ""){ # Remove empty lines from our array. $myRepInfo[$i] -replace 's+', " " $cleanRepInfo += $myRepInfo[$i] } } $finalRepInfo = @() foreach ($line in $cleanRepInfo) { $splitRepInfo = $line -split 's+',8 if ($splitRepInfo[0] -eq "Source") { $repType = "Source" } if ($splitRepInfo[0] -eq "Destination") { $repType = "Destination" } if ($splitRepInfo[1] -notmatch "DSA") { # Create an Object and populate it with our values. $objRepValues = New-Object System.Object $objRepValues | Add-Member -type NoteProperty -name DSAType -value $repType # Source or Destination DSA $objRepValues | Add-Member -type NoteProperty -name Hostname -value $splitRepInfo[1] # Hostname $objRepValues | Add-Member -type NoteProperty -name Delta -value $splitRepInfo[2] # Largest Delta $objRepValues | Add-Member -type NoteProperty -name Fails -value $splitRepInfo[3] # Failures #$objRepValues | Add-Member -type NoteProperty -name Slash -value $splitRepInfo[4] # Slash char $objRepValues | Add-Member -type NoteProperty -name Total -value $splitRepInfo[5] # Totals $objRepValues | Add-Member -type NoteProperty -name "% Error" -value $splitRepInfo[6] # % errors $objRepValues | Add-Member -type NoteProperty -name ErrorMsg -value $splitRepInfo[7] # Error code # Add the Object as a row to our array $finalRepInfo += $objRepValues } } $html = $finalRepInfo|ConvertTo-Html -Fragment $xml = [xml]$html $attr = $xml.CreateAttribute("id") $attr.Value='diskTbl' $xml.table.Attributes.Append($attr) $rows=$xml.table.selectNodes('//tr') for($i=1;$i -lt $rows.count; $i++){ $value=$rows.Item($i).LastChild.'#text' if($value -ne $null){ $attr=$xml.CreateAttribute('style') $attr.Value='background-color: red;' [void]$rows.Item($i).Attributes.Append($attr) } else { $value $attr=$xml.CreateAttribute('style') $attr.Value='background-color: green;' [void]$rows.Item($i).Attributes.Append($attr) } } #embed a CSS stylesheet in the html header $html=$xml.OuterXml|Out-String $style='<style type=text/css>#diskTbl { background-color:black ; } td, th { border:1px solid black; border-collapse:collapse; } th { color:black; background-color:yellow; } table, tr, td, th { padding: 2px; margin: 0px } table { margin-left:50px; }</style>' ConvertTo-Html -head $style -body $html -Title " AD Replication Report"|Out-File C:Scripts_newReplicationReplicationReport.htm $html1=get-content C:Scripts_newReplicationReplicationReport.htm $smtpServer = "" $smtpFrom = "" $smtpTo = "" $messageSubject = "" $message = New-Object System.Net.Mail.MailMessage $smtpfrom, $smtpto $message.Subject = $messageSubject $message.IsBodyHTML = $true $message.Body =$html1 $smtp = New-Object Net.Mail.SmtpClient($smtpServer) $smtp.Send($message) #send-MailMessage -From "Replication@lycra.mail.onmicrosoft.com" -to "dhrub.bharali@capgemini.com" -Subject "Lycra AD Replication Report(Do not reply)" -SmtpServer "lycra-com.mail.protection.outlook.com" -body -BodyAsHtml
Отчет об устаревших объектах
Хотите узнать, какие объекты еще присутствуют в вашем домене, тогда это отличный скрипт, который найдет их и поможет вам полностью создать объекты. Это самый интересный скрипт в категории скриптов Active Directory Powershell.
Как он работает
С помощью этого скрипта можно найти неиспользуемые объекты в течение определенного промежутка времени.
Вероятный результат
Вы можете удалить неиспользуемые объекты, если они соответствуют вашим критериям поиска.
Stale comp reports Powershell Scripts
############################################### #Description: #This script will fetch stale computer objects beyond 90 days . And should run in any of the AD servers. ################################################################################################ #FIND INACTIVE COMPUTERS #------------------------------- Import-Module ActiveDirectory #Get AD Computers that haven't logged on in xx days $DaysInactive = 90 $InactiveDate = (Get-Date).Adddays(-($DaysInactive)) $Computers = Get-ADComputer -Filter { LastLogonDate -lt $InactiveDate -and Enabled -eq $true } -Properties LastLogonDate | Select-Object Name, LastLogonDate, DistinguishedName # REPORTING #------------------------------- # Export results to CSV $Computers | Export-Csv C:UserstestDesktopInactiveComputers.csv -NoTypeInformation
Добавление или удаление нескольких пользователей из нескольких групп
Как это работает
Скрипт использует файл csv для получения входных данных и выполняет их в вашей среде.
Вероятный результат
После выполнения скрипта вероятным результатом будет удаление пользователя или добавление его в необходимую группу безопасности.
Multiple user remove from groups Powershell Scripts
{<######### CSV format ########## > user,group test1,"domain admins" test2,Administrators #>} Import-CSV c:usersdbharalidesktoplist.csv | % { $check1= Get-ADGroupMember -Identity ($_.group) | select -ExpandProperty Name if ($check1 -contains $_.user){ write-host "$($_.User) is a member of $($_.Group) !" -ForegroundColor DarkYellow try{ remove-ADGroupMember -Identity $_.group -Member $_.User -Confirm:$false Write-host "Removing $($_.User) from $($_.Group).......... " -ForegroundColor cyan $check2 = Get-ADGroupMember -Identity ($_.group) | select -ExpandProperty Name if ($check2 -notcontains $_.user){ write-host "$($_.User) is successfully removed from $($_.Group) !" -ForegroundColor green } } catch{ Write-Warning "Exception String: $($_.Exception.Message)" } } else { Write-host $($_.user) is not a member of $($_.group) -ForegroundColor red } }
Add multiple user to multiple groups Powershell Scripts
{<######### CSV format ########## > user,group test1,"domain admins" test2,Administrators #>} $ErrorActionPreference = "SilentlyContinue" Import-CSV c:usersdbharalidesktoplist.csv | % { $check1= Get-ADGroupMember -Identity ($_.group) | select -ExpandProperty Name if ($check1 -contains $_.user){ write-host "$($_.User) is already a member of $($_.Group) !" -ForegroundColor red } else { Try{ Write-host "Checking $($_.Users) in $($_.Group).......... " -ForegroundColor cyan Add-ADGroupMember -Identity $_.group -Member $_.User -ErrorAction SilentlyContinue $check2 = Get-ADGroupMember -Identity ($_.group) | select -ExpandProperty Name if ($check2 -contains $_.user){ write-host "$($_.User) is successfully added to $($_.Group) !" -ForegroundColor green } } catch{ Write-Warning "Exception String: $($_.Exception.Message)" } } }
Получение источника NTP из нескольких серверов
Когда мы сталкиваемся с проблемой синхронизации времени, лучше проверить источник, из которого сервер получает время.
Как он работает
Он считывает введенный список серверов и пытается найти источник NTP из предоставленного списка.
Вероятный результат
Считывает входные данные списка серверов и пытается найти источник NTP из предоставленного списка.
NTP Source Powershell Scripts
$Inventory = New-Object System.Collections.ArrayList $AllComputers = gc C:usersadmindesktopserver.txt foreach($computers in $allcomputers){ $Computers $ComputerInfo = New-Object System.Object $ntp = w32tm /query /computer:$computers /source $ComputerInfo |Add-Member -MemberType NoteProperty -Name "ServerName" -Value "$Computers" $ComputerInfo |Add-Member -MemberType NoteProperty -Name "NTP Source" -Value "$Ntp" $Inventory.Add($ComputerInfo) | Out-Null } $Inventory | Export-Csv C:usersadmindesktopNTP.csv -NoTypeInformation
Сравнение групп AD
Иногда это превращается в сложную задачу, когда вам нужно сравнить две группы AD и найти ту, в которой отсутствует один пользователь из-за того, что несколько пользователей добавлены в определенные группы. Я создал простой скрипт, чтобы сэкономить время, поэтому делюсь им с вами.
Как это работает
Сценарий сравнивает 2 предоставленные группы и показывает, чего не хватает в этих двух группах. Если значение показывает “==”, значит пользователь есть в обеих группах, если “=>” или “<=”, значит некоторые пользователи отсутствуют в одной из групп.
Вероятный результат
С помощью скрипта вы узнаете, какой пользователь отсутствует или какая группа безопасности отсутствует.
Compare ad groups Powershell Scripts
$group1 = read-host "Enter group 1" $group2 = read-host "Enter group 2" $a= get-adgroupmember -identity $group1 |select -expandproperty Name $b= get-adgroupmember -identity $group2 |select -expandproperty Name compare $b $a -includeequal
Зеркальные группы AD
Вы когда-нибудь думали о том, как добавить похожих пользователей в разные группы, чтобы они были зеркальным отражением друг друга? Этого можно легко добиться с помощью Powershell и сэкономить массу драгоценного времени.
Как это работает
Сценарий получает список пользователей из обеих групп AD, и если в целевой группе AD отсутствует член эталонной группы AD, то пользователь будет добавлен в целевую группу.
Вероятный результат
Обе группы AD – эталонная и целевая – будут иметь одинаковых членов.
Add missing AD group members Powershell Scripts
$group1 = read-host "Enter group 1" $group2 = read-host "Enter group 2" $a= get-adgroupmember -identity $group1 |select -expandproperty Name write-host "$group1 members are $a" $b= get-adgroupmember -identity $group2 |select -expandproperty Name write-host "$group2 members are $b" Foreach($c in $a) { Foreach($d in $b) { if ($c -notcontains $d) { write-host "adding $c to $group2" add-adgroupmember -members $c -identity $group2 write-host "$c is added to $group2" } else {write-host "$c is not copied"} } } write-host "$group2 members are" get-adgroupmember -identity $group2 |select -expandproperty Name
Модуль Active Directory для Windows PowerShell — один из основных инструментов для администрирования домена, управления объектами в Active Directory и получения различной информации о компьютерах AD, пользователях, группах и т. д. Любой администратор Windows должен знать, как использовать как графическую оснастку AD (обычно это ADUC — Active Directory Users & Computers) и командлеты модуля RSAT-AD-PowerShell для выполнения повседневных задач администрирования Active Directory. В этой статье мы рассмотрим, как установить модуль PowerShell Active Directory в Windows, познакомимся с его основными функциями и популярными командлетами, которые полезны для управления и взаимодействия с AD.
Установка модуля Powershell Active Directory на Windows Server
Active Directory для Windows PowerShell уже встроен в операционные системы Windows Server (начиная с Windows Server 2008 R2), но по умолчанию не включен.
В Windows Server 2016, 2019 и 2022 вы можете установить модуль AD для PowerShell из Диспетчера серверов (Добавить роли и компоненты → Функции → Инструменты удалённого администрирования сервера → Инструменты администрирования ролей → Инструменты AD DS и AD LDS → Модуль Active Directory для Windows PowerShell).
В англоязычной версии сервера это соответственно в Server Manager: Add Roles and Features → Features → Remote Server Administration Tools → Role Administration Tools → AD DS and AD LDS Tools → Active Directory module for Windows PowerShell.
Если вы уже установили роль Active Directory Domain Services, то это означает, что модуль Powershell Active Directory уже активирован и дополнительных действий предпринимать не нужно.
Смотрите также: Полное руководство по Active Directory, от установки и настройки до аудита безопасности. Ч. 4: Установка Active Directory Domain Services в Windows Server 2022
Вы также можете установить модуль из консоли PowerShell с помощью команды:
Install-WindowsFeature -Name "RSAT-AD-PowerShell" -IncludeAllSubFeature
Смотрите также: Управление ролями и функциями Windows Server с помощью PowerShell
Вы можете установить RSAT-AD-PowerShell не только на контроллеры домена. Подойдёт любой рядовой сервер домена или даже рабочая станция. Модуль PowerShell Active Directory устанавливается автоматически при развёртывании роли доменных служб Active Directory (AD DS) (при повышении уровня сервера до контроллера домена AD).
Модуль взаимодействует с AD через веб-службу Active Directory, которая должна быть установлена на вашем контроллере домена (связь осуществляется через TCP-порт 9389).
Как установить модуль Active Directory PowerShell в командной строке
Вы можете установить модуль RSAT-AD-PowerShell не только на Windows Server, но и на свои рабочие станции.
Если вы попытаетесь выполнить приведённую выше PowerShell команду:
Install-WindowsFeature -Name "RSAT-AD-PowerShell" -IncludeAllSubFeature
то получите сообщение об ошибке:
Install-WindowsFeature: Целевым объектом указанного командлета не может быть клиентская операционная система Windows.
Причём независимо от того, какая у вас редакция Windows: Home, Pro, Enterprise.
Тем не менее, в Windows 10 build 1809 или новее пакет RSAT интегрирован в образ Windows (как компоненты по запросу), поэтому вы можете использовать эту команду PowerShell для установки модуля Active Directory:
Add-WindowsCapability -online -Name "Rsat.ActiveDirectory.DS-LDS.Tools"
Предыдущую команду нужно выполнять в командной строке с правами администратора.
Связанная статья: Как запустить PowerShell с правами администратора
Как установить модуль Active Directory PowerShell в Windows 11 в графическом интерфейсе
Для установки модуля Active Directory PowerShell в графическом интерфейсе в Windows 11 откройте «Settings» (Параметры), для этого нажмите Win+i и выберите вкладку «Apps» (Приложения), а затем перейдите в «Optional Features» (Дополнительные компоненты).
Теперь выберите «View features» (Просмотр компонентов) в строке «Add an optional feature» (Добавить компонент).
Для установки средств удалённого администрирования Active Directory найдите «RSAT: Active Directory Domain Services and Lightweight Directory Services Tools» (Средства удалённого администрирования сервера: средства доменных служб Active Director и служб облегчённого доступа к каталогам), поставьте галочку и нажмите на кнопку «Next» (Далее),
затем нажмите «Install» (Установить).
Примечание: если при поиске того или иного компонента вы не можете его найти, то, возможно, данный компонент уже установлен.
Чтобы в этом убедиться в строке поиска под надписью «Installed features» (Установленные компоненты) введите название искомого компонента.
Также помните, что в английской и локализованных версиях Windows данные компоненты называются по-разному!
Как установить модуль Active Directory PowerShell в Windows 10 в графическом интерфейсе
Для установки модуля Active Directory PowerShell в графическом интерфейсе, нажмите Win+x, затем в открывшемся меню выбираем «Apps and Features» (Приложения и возможности).
Далее выбираем «Optional Features» (Дополнительные компоненты).
Теперь выбираем «Add a feature» (Добавить компонент).
Для установки средств удалённого администрирования Active Directory выбираем «RSAT: Active Directory Domain Services and Lightweight Directory Services Tools» (Средства удалённого администрирования сервера: средства доменных служб Active Director и служб облегчённого доступа к каталогам) и нажимаем на кнопку «Install» (Установить).
Командлеты Active Directory PowerShell
В модуле Active Directory для Windows PowerShell есть множество командлетов для взаимодействия с AD. Каждая новая версия RSAT содержит больше командлетов, чем предыдущая. В Windows Server 2022 доступно 147 командлетов PowerShell для Active Directory.
Перед использованием командлетов модуля Active Directory вам необходимо импортировать его в сеанс PowerShell:
Import-Module ActiveDirectory
Начиная с Windows Server 2012 R2, Windows 8.1 и в последующих версиях модуль импортируется автоматически.
Если модуль Active Directory не установлен на вашем компьютере, вы можете импортировать его со своего контроллера домена (для этого вам нужны права администратора домена) или с другого настольного компьютера:
$psSess = New-PSSession -ComputerName ИМЯ_КОМПЬЮТЕРА Import-Module -PSsession $psSess -Name ActiveDirectory
В этих командах ИМЯ_КОМПЬЮТЕРА — это компьютер, который является Контроллером Домена, либо компьютером, на котором установлен модуль Powershell Active Directory.
Вы можете отобразить полный список доступных командлетов Active Directory с помощью команды:
Get-Command -module ActiveDirectory
Чтобы посчитать общее количество командлетов в модуле AD выполните команду:
Get-Command -module ActiveDirectory | measure-object | select count
Большинство командлетов RSAT-AD-PowerShell начинаются с префиксов Get-, Set- или New-.
- Командлеты Get- класса используются для получения различной информации из Active Directory (Get-ADUser — свойства пользователя, Get-ADComputer — настройки компьютера, Get-ADGroupMember — членство в группе и так далее). Чтобы запустить их, вам не нужно быть администратором домена. Любой пользователь домена может запускать команды PowerShell для получения значений атрибутов объекта AD (кроме конфиденциальных, как в примере с LAPS);
- Командлеты класса Set- используются для установки (изменения) параметров объекта в Active Directory. Например, вы можете изменить свойства пользователя (Set-ADUser), настройки компьютера (Set-ADComputer), добавить пользователя в группу и так далее. Для этого у вашей учётной записи должны быть разрешения на изменение свойств объекта;
- Команды, начинающиеся с New- позволяют создавать объекты AD (создать пользователя – New-ADUser, создать группу – New-ADGroup);
- Командлеты Remove- используются для удаления объектов AD.
Так вы можете получить помощь по любому командлету:
Get-Help КОМАНДЛЕТ Get-Help КОМАНДЛЕТ -Full
Смотрите также: Как получить справку по командам PowerShell
Вы можете отобразить примеры использования командлетов Active Directory следующим образом:
(Get-Help КОМАНДЛЕТ).examples
Или:
Get-Help КОМАНДЛЕТ -Examples
Всплывающие подсказки удобно использовать при вводе параметров командлета в PowerShell ISE.
Администрирование Active Directory с помощью модуля RSAT-AD-PowerShell
Давайте посмотрим на некоторые типичные задачи администратора, которые вы можете выполнять с помощью командлетов Active Directory для PowerShell.
Вы можете найти больше полезных примеров использования командлетов PowerShell для AD на веб-сайте pwsh.ru. Чтобы получить подробные инструкции и примеры использования, переходите по ссылкам, присутствующим в кратком описании каждого командлета.
New-ADUser: создание пользователей AD
Чтобы создать нового пользователя AD, вы можете использовать командлет New-ADUser. Вы можете создать пользователя с помощью следующей команды:
New-ADUser -Name "Mila Beck" -GivenName "Mila" -Surname "Beck" -SamAccountName "mbeck" -UserPrincipalName "mbeck@hackware.ru" -Path "OU=Users,OU=Berlin,OU=DE,DC=ds,DC=hackware,DC=ru" -AccountPassword(Read-Host -AsSecureString "Input User Password") -Enabled $true
Get-ADComputer: получение свойств компьютера
Чтобы отобразить информацию о свойствах компьютера в конкретном подразделении (имя компьютера и дата последнего входа в систему), используйте командлет Get-ADComputer:
Get-ADComputer -SearchBase 'OU=CA,OU=USA,DC=ds,DC=hackware,DC=ru' -Filter * -Properties * | FT Name, LastLogonDate -Autosize
Смотрите также «Get-ADComputer: поиск сведений о компьютерах и фильтр компьютеров по их свойствам в Active Directory».
Add-AdGroupMember: добавить пользователя AD в группы
Чтобы добавить пользователей в существующую группу безопасности в вашем домене AD, выполните эту команду:
Add-AdGroupMember -Identity LondonSales -Members e.braun, l.wolf
Отобразить список пользователей в группе AD и экспортировать его в файл CSV:
Get-ADGroupMember LondonSales -recursive | ft samaccountname | Out-File c:psexport_ad_users.csv
В предыдущей команде «ft» это командлет Format-Table.
Смотрите также: Управление группами Active Directory с помощью PowerShell
Set-ADAccountPassword: сброс пароля пользователя в AD
Чтобы сбросить пароль пользователя AD из PowerShell, выполните следующую команду:
Set-ADAccountPassword m.lorenz -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "Ne8Pa$$0rd1" -Force -Verbose) -PassThru
Как разблокировать, включить и отключить учётную запись AD?
Чтобы отключить учётную запись пользователя AD:
Disable-ADAccount m.lorenz
Чтобы включить учётную запись:
Enable-ADAccount m.lorenz
Чтобы разблокировать учётную запись после того, как она была заблокирована политикой паролей домена:
Unlock-ADAccount m.lorenz
Search-ADAccount: как найти неактивные и отключённые объекты?
Чтобы найти и отключить все компьютеры в домене AD, которые не входили в систему более 90 дней, используйте командлет Search-ADAccount:
$timespan = New-Timespan -Days 90 Search-ADAccount -AccountInactive -ComputersOnly -TimeSpan $timespan | Disable-ADAccount
New-ADOrganizationalUnit: создание организационной единицы в AD
Чтобы быстро создать типичную структуру организационной единицы в AD, вы можете использовать сценарий PowerShell. Предположим, вы хотите создать несколько подразделений с именами состояний и создать в них типичные контейнеры объектов. Создание этой структуры AD вручную с помощью графической оснастки ADUC занимает довольно много времени. Модуль AD для PowerShell позволяет сделать это за секунды (кроме времени на написание скрипта):
$fqdn = Get-ADDomain $fulldomain = $fqdn.DNSRoot $domain = $fulldomain.split(".") $Dom = $domain[0] $Ext = $domain[1] $Sites = ("Nevada","Texas","California","Florida") $Services = ("Users","Admins","Computers","Servers","Contacts","Service Accounts") $FirstOU ="USA" New-ADOrganizationalUnit -Name $FirstOU -Description $FirstOU -Path "DC=$Dom,DC=$EXT" -ProtectedFromAccidentalDeletion $false ForEach-Object ($S in $Sites) { New-ADOrganizationalUnit -Name $S -Description "$S" -Path "OU=$FirstOU,DC=$Dom,DC=$EXT" -ProtectedFromAccidentalDeletion $false ForEach-Object ($Serv in $Services) { New-ADOrganizationalUnit -Name $Serv -Description "$S $Serv" -Path "OU=$S,OU=$FirstOU,DC=$Dom,DC=$EXT" -ProtectedFromAccidentalDeletion $false } }
После запуска сценария в Active Directory появляется следующая структура подразделений.
Move-ADObject: перемещение объектов между контейнерами AD
Чтобы перемещать объекты между контейнерами AD, вы можете использовать командлет Move-ADObject:
$TargetOU = "OU=Sales,OU=Computers,DC=ds,DC=hackware,DC=ru" Get-ADComputer -Filter 'Name -like "SalesPC*"' | Move-ADObject -TargetPath $TargetOU
Get-ADReplicationFailure: проверка сбоев репликации AD
Используя командлет Get-ADReplicationFailure, вы можете проверить состояние репликации между контроллерами домена AD:
Get-ADReplicationFailure -Target NY-DC01,NY-DC02
Get-ADDomainController: Получение информации о контроллерах домена
Чтобы получить информацию обо всех контроллерах домена в домене, используйте командлет Get-AdDomainController:
Get-ADDomainController -filter * | select hostname,IPv4Address,IsGlobalCatalog,IsReadOnly,OperatingSystem | format-table -auto
Итак, мы рассмотрели основные возможности модуля Active Directory PowerShell для администрирования домена AD. Я надеюсь, что это побудит вас продолжить изучение других функций модуля и автоматизировать большую часть задач управления AD.
Связанные статьи:
- Как установить Active Directory Domain Services с помощью PowerShell (65.1%)
- Get-ADComputer: поиск сведений о компьютерах и фильтр компьютеров по их свойствам в Active Directory (64.7%)
- Как определить причину блокировки учётной записи в домене Active Directory (63.5%)
- Управление группами Active Directory с помощью PowerShell (60.2%)
- Снижение уровня контроллеров домена в Windows Server в PowerShell и графическом интерфейсе (56.1%)
- Как настроить Windows Server 2022 с помощью PowerShell (RANDOM — 53.4%)
Коротко о PowerShell
Способы работы с Active Directory
ADSI
Провайдер AD
Командлеты AD
Управление Active Directory
Получение информации
Работа с группами
Создание объектов
И многое другое
Заключение
В ноябрьском номере КомпьютерПресс мы ознакомили вас с ключевыми возможностями Windows PowerShell — новой среды командной строки и языка сценариев от компании Microsoft. Сегодня мы рассмотрим применение этой среды для администрирования корпоративной директории Active Directory (AD).
Коротко о PowerShell
Windows PowerShell — новая командная строка и язык сценариев от компании Microsoft. PowerShell является компонентом Windows Server 2008 (надо только выбрать его в Server Manager) и доступна для загрузки со странички www.microsoft.com/powershell для Windows XP, Windows Server 2003 и Windows Vista.
Если вы не знакомы с Windows PowerShell, то рекомендуем вам сначала прочитать статью «Windows PowerShell. Коротко о главном» в КомпьютерПресс № 11’2007. В данной публикации мы ограничимся лишь кратким повторением основ и сразу перейдем к главной теме статьи.
Итак, команды PowerShell называются командлетами (cmdlet) и состоят из глагола (например, get, set, new, remove, move, connect) и существительного в единственном числе, описывающего объект действия. Между ними ставится дефис. Получается что-то вроде: get-process, stop-service и т.п.
Команды, как правило, связываются конвейером, обозначаемым вертикальной чертой (|). Этот знак означает, что вся коллекция объектов из предыдущей команды передается на вход следующей.
Такая объектная ориентированность очень удобна, поскольку позволяет легко оперировать объектами и связывать команды вместе. В этой статье мы расскажем, как подобный подход облегчает управление корпоративной директорией на базе Active Directory.
Способы работы с Active Directory
Директория Active Directory является основой корпоративных сетей на базе Windows Server 2000, 2003 и 2008. Именно там хранятся все учетные записи пользователей, информация о группах, компьютерах сети, ящиках электронной почты и многом другом.
Всем этим богатством надо управлять, для чего предназначен соответствующий инструментарий, входящий в состав Windows Server, но именно PowerShell позволяет легко автоматизировать массовые действия, направленные на большое количество объектов.
Существует три основных способа работы с Active Directory в Windows PowerShell:
- с помощью интерфейса Active Directory Service Interfaces (ADSI) — этот способ является наиболее сложным, но работает в любой установке PowerShell и не требует дополнительных модулей. Он также наиболее близок к способу управления, который использовался в языке сценариев VBScript;
- с помощью провайдера Active Directory, входящего в расширения PowerShell, — этот способ позволяет подключить директорию в виде диска на вашем компьютере и перемещаться по ней с помощью соответствующих команд: dir, cd и т.д. Данный способ требует установки дополнительного модуля с сайта codeplex;
- с помощью командлетов управления Active Directory — это наиболее удобный способ манипулирования объектами директории, но он тоже требует дополнительной инсталляции соответствующих модулей.
ADSI
Active Directory Service Interfaces (ADSI) хорошо знаком всем, кто пытался писать сценарии на языке VBScript. В PowerShell этот интерфейс реализован с помощью так называемого адаптера. Указав в квадратных скобках название адаптера (ADSI) и путь к объекту в директории на языке LDAP-запроса (Lightweight Directory Access Protocol — протокол работы с директориями, который поддерживает и AD), мы получаем доступ к объекту из директории и можем дальше вызывать его методы.
Например, подсоединимся к одному из контейнеров директории и создадим в нем новую пользовательскую учетную запись.
$objOU = [ADSI]”LDAP://mydc:389/ou=CTO,dc=Employees,dc=testdomain,dc=local”
Итак, теперь у нас переменная $objOU содержит информацию о контейнере (имена переменных в PowerShell начинаются со значка доллара).
Вызовем метод Create и создадим в контейнере нового пользователя:
$objUser = $objOU.Create(“user”, “cn=Dmitry Sotnikov”)
Теперь мы можем устанавливать различные атрибуты:
$objUser.Put(«sAMAccountName”, «dsotnikov”)
И наконец, укажем директории, что эти изменения надо применить:
$objUser.SetInfo()
Преимуществами использования адаптера ADSI являются:
- его наличие в любой поставке PowerShell. Если у вас установлен PowerShell и есть директория, с которой вам надо работать, — вы имеете все, что вам надо;
- применение подхода, близкого к VBScript. Если у вас богатый опыт работы с директорией на языке сценариев VBScript или в приложениях .NET, вы сможете уверенно себя чувствовать, используя этот подход.
К сожалению, у метода есть и недостатки:
- сложность — это самый сложный способ работы с директорией. Писать путь к объекту в виде запроса LDAP нетривиально. Для любой работы с атрибутами требуется указание их внутренних имен, а значит, надо помнить, что атрибут, обозначающий город пользователя, называется не «City», а «l» и т.д.;
- громоздкость — как видно из примера, простейшая операция создания одной учетной записи занимает как минимум четыре строчки, включая служебные операции подсоединения к контейнеру и применения изменений. Таким образом, даже относительно простые операции становятся похожи на сложные сценарии.
Провайдер AD
PowerShell позволяет представлять различные системы в виде дополнительных дисков компьютера с помощью так называемых провайдеров. Например, в состав поставки PowerShell входит провайдер реестра и мы можем перемещаться по реестру с помощью знакомых и любимых всеми нами команд cd и dir (для любителей UNIX команда ls тоже поддерживается).
Провайдера Active Directory в составе PowerShell нет, но его можно установить, зайдя на сайт проекта расширений PowerShell — PowerShell Community Extensions: http://www.codeplex.com/PowerShellCX.
Это проект с открытым кодом, который добавляет большое количество команд в систему PowerShell, а кроме того, устанавливает провайдера AD.
Использование провайдера Active Directory
После установки расширений, набрав Get-PSDrive, мы видим, что к прежним дискам добавился диск текущей активной директории.
Теперь мы можем зайти в эту директорию, набрав cd и указав имя домена, а в любом контейнере использовать команду dir, чтобы увидеть его содержимое.
С объектами дальше можно работать так же, как это делалось с применением адаптера ADSI.
Кроме того, можно вызывать и другие привычные команды управления файлами (например, del).
К несомненным преимуществам использования провайдера можно отнести:
естественность представления структуры директории — директория AD по своей природе иерархична и похожа на файловую систему;
удобство нахождения объектов — применять cd и dir куда удобнее, чем составлять запрос на языке LDAP.
Из недостатков бросаются в глаза:
- сложность внесения изменений в объекты — провайдер помогает легко добраться до объекта, но чтобы что-либо поменять, нам опять приходится использовать все те же директорные объекты, что и в методе ADSI, а для этого надо оперировать на низком уровне служебных методов и атрибутов AD;
- необходимость дополнительной установки — провайдер не входит в состав PowerShell, и для его применения необходимо скачать и установить расширения PowerShell;
- третьестороннее происхождение — расширения PowerShell не являются продуктом компании Microsoft. Они созданы энтузиастами проекта. Вы вольны их использовать, но за технической поддержкой придется обращаться не в Microsoft, а на сайт проекта.
Командлеты AD
Кроме описанного выше провайдера, для работы с AD существует и набор командлетов (часто называемых также AD cmdlets или QAD cmdlets), доступный с сайта http://www.quest.com/activeroles_server/arms.aspx.
Командлеты состоят из стандартных глаголов операций (get-, set-, rename-, remove-, new-, move-, connect-) и существительных объектов с префиксом QAD (-QADUser, -QADGroup, -QADComputer, -QADObject).
Например, чтобы создать новую четную запись пользователя, понадобится выполнить такую команду:
New-QADUser -ParentContainer scorpio.local/Employees -Name ‘Dmitry Sotnikov’
Преимущества данного подхода таковы:
- простота — использование командлетов скрывает от вас сложность директории, ее схемы и внутренних атрибутов. Вы работаете с объектами директории на уровне понятных названий объектов (user, group, computer), их свойств (name, password, city, department) и действий над ними (get, set, remove, move, new);
- краткость и выразительность — как мы видели, большую часть действий с помощью командлетов можно выразить в виде простых и естественных однострочных операций.
Недостатками такого подхода можно считать:
- необходимость дополнительной установки — командлеты, как и провайдер, не входят в состав PowerShell, и для их использования необходимо скачать и установить соответствующую библиотеку;
- третьестороннее происхождение — командлеты для работы с AD не являются продуктом компании Microsoft. Они созданы партнером Microsoft — компанией Quest Software. Вы вольны их применять, но за технической поддержкой придется обращаться не в Microsoft, а на форумы по работе с Active Directory на сайте PowerGUI.org.
На наш взгляд, данные недостатки с лихвой компенсируются простотой и естественностью в использовании, так что практические примеры будут приведены с применением именно этого подхода.
Управление Active Directory
Давайте посмотрим, как PowerShell позволяет выполнять основные операции по работе с директорией AD:
- получение информации;
- изменение свойств;
- работа с группами;
- создание новых объектов;
- изменение структуры директории
Получение информации
Получение информации осуществляется в PowerShell с помощью командлетов с глаголом Get.
Например, чтобы получить список всех пользователей, наберем:
Get-QADUser
Для групп:
Get-QADGroup
Для записей компьютеров:
Get-QADComputer
Если вам нужны не все записи, а какие-то конкретные, вы можете выбрать именно их с помощью параметров команд.
Получение списка пользователей
Все группы из контейнера Users:
Get-QADGroup -SearchRoot scorpio.local/users
Все пользователи из отдела продаж московского офиса, чьи имена начинаются на букву A:
Get-QADUser -City Moscow -Department Sales -Name a*
При этом вы можете сказать PowerShell’y, в каком виде вы хотите видеть получаемую информацию.
Таблица с именами, городами и подразделениями сотрудников:
Get-QADUser | Format-Table Name, City, Department
То же самое с сортировкой по городам:
Get-QADUser | Sort City | Format-Table DisplayName, City, Department
Сортировка значений и выбор полей для вывода
Для списочного представления той же информации просто используем команду Format-List:
Get-QADUser | Format-List Name, City, Department
Экспортировать информацию в файл CSV (comma-separated values — значения через запятую):
Get-QADUser | Select Name, City, Department | Out-CSV users.csv
Создать отчет в формате HTML:
Get-QADUser | Select Name, City, Department | ConvertTo-HTML | Out-File users.html
Таким образом, одной строчкой простой команды PowerShell вы можете создавать сложные отчеты в удобном для вас формате.
PowerShell позволяет менять атрибуты множества
записей одной командой
Изменение свойств
После того как мы освоились с получением информации из директории, пришла пора что-нибудь в ней поменять.
Свойствами объектов можно манипулировать с помощью команд Set-*.
Например, поменяем мне телефон:
Set-QADUser ‘Dmitry Sotnikov’ -Phone ‘111-111-111’
Но, разумеется, куда более интересны массовые изменения. Для этого мы можем применять конвейер PowerShell, то есть получать список нужных нам объектов с помощью команд Get- и отправлять их в команду Set- для внесения изменений.
Например, наш пермский офис переехал в новое помещение. Возьмем всех пользователей Перми и присвоим им новый номер телефона:
Get-QADUser -City Perm | Set-QADUser -PhoneNumber ‘+7-342-1111111’
Для более сложных манипуляций можно использовать командлет ForEach-Object. Например, каждому пользователю присвоим описание, состоящее из его отдела и города:
Get-QADUser | ForEach-Object { Set-QADUser $_ -Description (S_.City + « « + $_.Department) }
Переменная $_ в данном примере обозначает текущий объект коллекции.
PowerShell предоставляет возможности удобной работы
с группами пользователей
Работа с группами
Работа с группами и членством в них — еще одна массовая операция, которую часто хочется автоматизировать. PowerShell предоставляет такую возможность.
Получение членов группы производится с помощью командлета Get-QADGroupMember:
Get-QADGroubMember Managers
Добавить объект в группу тоже несложно:
Add-QADGroupMember ScorpioManagers -Member dsotnikov
Аналогично удаление из группы осуществляется с помощью командлеты Remove-QADGroupMember.
Но, разумеется, наиболее полезными являются массовые манипуляции. Добавим всех менеджеров в соответствующую группу:
Get-QADUser -Title Manager | Add-QADGroupMember ScorpioManagers
Скопируем членство в группе:
Get-QADGroupMember ScorpioManagers | Add-QADGroupMember ScorpioManagers_Copy
Используем фильтр, чтобы скопировать не всех членов группы, а только тех, кто отвечает определенному критерию (например, находится в нужном регионе):
Get-QADGroupMember ScorpioManagers | where { $_.City -eq ‘Ekaterinburg’} | Add-QADGroupMember ScorpioEkaterinburg_Managers
Обратите внимание, как мы отфильтровали пользователей с помощью команды where и логического условия (логический оператор -eq — это оператор равенства в PowerShell, от англ. equals).
Создание объектов
Создание объектов, как мы уже видели, осуществляется командами New:
New-QADUser -ParentContainer scorpio.local/Employees -Name ‘Dmitry Sotnikov’
New-QADGroup -ParentContainer scorpio.local/Employees -Name ‘Managers’ -Type Security -Scope Global
Вы можете установить и любые другие атрибуты в процессе создания записи:
New-QADUser -ParentContainer scorpio.local/Employees -Name ‘Dmitry Sotnikov’ -samAccountName dsotnikov -City ‘Saint-Petersburg’ -Password ‘P@ssword’
Чтобы активировать запись, просто отправьте ее по конвейеру в Enable-QADUser (не забудьте установить пароль — иначе операция не пройдет):
New-QADUser -ParentContainer scorpio.local/Employees -Name ‘Dmitry Sotnikov’ -Password ‘P@ssword’ | Enable-QADUser
Можно прочитать список пользователей и из файла. Например, если у нас есть файл, в котором через запятую перечислены атрибуты новых пользователей, то мы можем смело отправлять их на создание с помощью Import-CSV:
Import-CSV new_users.csv | ForEach-Object { New-QADUser -ParentContainer scorpio.local/users -Name ($_.Familia + ‘, ’ + $_.Imya) -samAccountName ($_.Imya[0] + $_.Familia) -Department $_.Department -Title $_.Title}
Обратите внимание на то, что мы на лету составляем название учетной записи из фамилии и имени пользователя.
Пример использования файла импорта
записей
Изменение структуры директории
И наконец, конечно же, можно управлять структурой директории.
Например, можно создавать новые контейнеры:
New-QADObject -type OrganizationUnit -ParentContainer scorpio.local -Name NewOU
и перемещать в них объекты по одному:
Move-QADObject MyServer -To scorpio.local/servers
или оптом:
Get-QADUser -Disabled | Move-QADObject -To scorpio.local/Disabled
Импортируем файл и создаем новые учетные записи
Мы легко можем выбрать учетные записи, удовлетворяющие
определенному критерию,
и переместить их в другой контейнер
И многое другое
ММы рассмотрели только малую часть сценариев по управлению активной директорией. Чтобы получить полный перечень командлетов для AD, выполните команду:
Get-Command *-QAD*
Чтобы получить справку по любой команде:
Get-Help Get-QADUser
Чтобы узнать, какие свойства есть у выдаваемого командой объекта:
Get-User | Get-Member
Возможности PowerShell практически безграничны, но при этом найти их достаточно легко.
Заключение
ККак мы видели, PowerShell является отличным средством управления Active Directory. Часть свойств (ADSI) доступна в любой установке PowerShell. Некоторые (провайдер и командлеты) требуют дополнительных модулей. Все они предоставляют огромные возможности, чтобы автоматизировать управление вашей корпоративной директорией, а значит, уменьшить риски, избавиться от рутины и увеличить вашу эффективность на работе.
Главное — эти технологии уже доступны и способны помочь вам в администрировании вверенных систем уже сегодня. В заключение процитируем системного администратора ЗАО «УК «ЕвразФинанс» Василия Гусева: «В нашей компании, как и практически везде, Active Directory является одним из самых используемых и критичных сервисов. С помощью PowerShell и AD Cmdlets многие задачи стало проще выполнять через командную строку, нежели через ADUC (Active Directory Users and Computers. — Прим. ред.). Никогда еще автоматизация Active Directory не была столь легкой и доступной».
КомпьютерПресс 6’2008
Windows OS Hub / PowerShell / How to Install the PowerShell Active Directory Module and Manage AD?
Every Windows system administrator should be able to use not only graphical AD snap-ins (usually it is ADUC, Active Directory Users and Computers), but also PowerShell cmdlets to perform everyday Active Directory administration tasks. Most commonly, the Active Directory module for Windows PowerShell is used for domain and object management tasks (users, computers, groups). In this article, we will look at how to install theRSAT-AD-PowerShell
module on Windows, discover its basic features, and popular cmdlets that are useful to manage and interact with AD.
Contents:
- How to Install the Active Directory PowerShell Module on Windows 10 and 11?
- Installing the RSAT-AD-PowerShell Module on Windows Server
- Active Directory Administration with PowerShell
- Importing Active Directory PowerShell Module from a Remote Computer
- Common PowerShell Commands for Active Directory
How to Install the Active Directory PowerShell Module on Windows 10 and 11?
You can install the RSAT-AD PowerShell module not only on servers but also on workstations. This module is included in the RSAT (Remote Server Administration Tools) package for Windows.
In current builds of Windows 11 and Windows 10, the RSAT components are installed online as Features on Demand. You can install the module by using the command:
Add-WindowsCapability -online -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0
Or through via the Settings -> Apps -> Optional features -> Add a feature -> RSAT: Active Directory Domain Services and Lightweight Directory Services Tools.
The RSAT package had to be manually downloaded and installed on previous versions of Windows. After that, you need to enable the AD module for PowerShell from the Control Panel: Programs and Features -> Turn Windows features on or off -> Remote Server Administration Tools-> Role Administration Tools -> AD DS and AD LDS Tools.
You must first install the WindowsCompatibility module to use AD cmdlets in PowerShell Core 6.x, 7.x:
Install-Module -Name WindowsCompatibility
Then load the module into your session:
Import-Module -Name WindowsCompatibility
Import-WinModule -Name ActiveDirectory
Now you can use AD cmdlets in your PowerShell Core 7.x scripts.
Installing the RSAT-AD-PowerShell Module on Windows Server
On Windows Server, you can install the Active Directory Module for Windows PowerShell from the Server Manager graphical console or by using PowerShell.
You can check that the Active Directory module is installed with the command:
Get-WindowsFeature -Name "RSAT-AD-PowerShell"
If the module is missing, install it:
Install-WindowsFeature -Name "RSAT-AD-PowerShell" –IncludeAllSubFeature
To install the module through the Server Manager, go to Add Roles and Features -> Features -> Remote Server Administration Tools -> Role Administration Tools -> AD DS and AD LDS Tools -> enable the Active Directory module for Windows PowerShell.
You do not need to use a local domain controller session to manage Active Directory by using the RSAT-AD PowerShell module. This module can be installed on any member server or workstation. On AD domain controllers, the module is automatically installed when the Active Directory Domain Services (AD DS) role is deployed (when the server is promoted to a DC).
The module interacts with AD through the Active Directory Web Service that must be running on your domain controller and available to clients on a TCP port 9389. Use the Test-NetConnection cmdlet to verify that this port is not blocked by a firewall on the DC:
Test-NetConnection MUN-DC1 -port 9389
Active Directory Administration with PowerShell
The Active Directory module for Windows PowerShell has a large number of cmdlets for interacting with AD. There are 147 AD PowerShell cmdlets available in the current version of the module for Windows Server 2022/Windows 11.
Check that the module is installed on the computer:
Get-Module -Name ActiveDirectory –ListAvailable
Before you can use the Active Directory module cmdlets, you must import it into your PowerShell session (starting from Windows Server 2012 R2/ Windows 8.1 the module is imported automatically).
Import-Module ActiveDirectory
Make sure that the AD module is loaded in your PowerShell session:
Get-Module
You can display a complete list of available Active Directory cmdlets:
Get-Command –module ActiveDirectory
The total number of cmdlets in the AD module:
Get-Command –module ActiveDirectory |measure-object|select count
Most of the RSAT-AD PowerShell module cmdlets begin with the Get-
, Set-
or New-
prefixes.
- Get– class cmdlets are used to get different information from Active Directory (
Get-ADUser
— user properties,Get-ADComputer
– computer settings,Get-ADGroupMember
— group membership, etc.). You do not need to be a domain administrator to use these cmdlets. Any domain user can run PowerShell commands to get the values of the AD object attributes (except confidential ones, like in the example with LAPS); - Set- class cmdlets are used to set (change) object properties in Active Directory. For example, you can change user properties (Set-ADUser), computer settings (Set-ADComputer), etc. To perform these actions, your account must have write permissions on the objects you want to modify (see the article How to Delegate Administrator Privileges in Active Directory);
- Commands that start with New- allow you to create AD objects (create a user —
New-ADUser
, create a group —New-ADGroup
, create an Organizational Unit —New-ADOrganizationalUnit
); - Cmdlets starting with Add-: add a user to a group (
Add-ADGroupMember
), add a Fine-Grained Password Policy (Add-ADFineGrainedPasswordPolicySubject
); - Remove- cmdlets are used to delete AD objects
Remove-ADGroup
,Remove-ADComputer
,Remove-ADUser
).
There are specific PowerShell cmdlets that you can use to manage only certain AD components:
Enable-ADOptionalFeature
– enable optional AD features (for example, AD Recycle Bin to restore deleted objects);Install-ADServiceAccount
– configure managed service account (MSA, gMSA);Search-ADAccount
– allows you to find disabled, inactive, locked user and computer accounts in Active Directory;Enable-ADAccount
/Disable-ADAccount
/Unlock-ADAccount
– enable/disable/unlock an account.
By default, the PowerShell cmdlets connect to the nearest domain controller in your environment (LOGONSERVER). With the -Server parameter, you can connect to ADDS on a different domain controller or in a different domain (you can display a list of DCs in another domain using the nltest /dclist:newad.com
command).
The -Server parameter is available for nearly all of the module cmdlets. For example
Get-ADuser j.smith -Server mun-dc1.woshub.com
You can also use the -Credential parameter to specify alternative Active Directory user credentials.
$creds = Get-Credential
Get-ADUser -Filter * -Credential $creds
Here is how you can get help on any cmdlet
get-help Set-ADUser
You can display the examples of using Active Directory cmdlets as follows:
(get-help New-ADComputer).examples
Importing Active Directory PowerShell Module from a Remote Computer
It is not necessary to install the AD PowerShell module on all computers. An administrator can remotely import this module from a domain controller (domain administrator privileges are required) or from any other computer.
PowerShell Remoting is used to connect to a remote computer. This requires that Windows Remote Management (WinRM) is enabled and configured on the remote host.
Create a new session with the remote computer that has the AD PowerShell module installed:
$psSess = New-PSSession -ComputerName DC_or_Comp_with_ADPosh
Import the ActiveDirectory module from the remote computer into your local PS session:
Import-Module -PSsession $psSess -Name ActiveDirectory
Now you can run any commands from the Active Directory module on your computer as if the module was installed locally. However, they will be executed on a remote host.
You can add these commands to your PowerShell profile file to automatically import the module from the remote session when you start the powershell.exe console. Run the notepad $profile.CurrentUserAllHosts
to open your PS profile file.
You can end a remote session with the command :
Remove-PSSession -Session $psSess
This method of importing the AD module through PowerShell implicit remoting allows you to use PowerShell cmdlets from Linux and MacOS hosts that cannot install a local copy of the module.
You can also use the Active Directory Module for PowerShell without installing RSAT. To do
this, simply copy some files from a computer where the RSAT-AD PowerShell module is installed:
- Directory
C:WindowsSystem32WindowsPowerShellv1.0Modules
- File
ActiveDirectory.Management.dll
- File
ActiveDirectory.Management.resources.dll
Then you need to import the module into your current session:
Import-Module C:PSADmoduleMicrosoft.ActiveDirectory.Management.dll
Import-Module C:PSADmoduleMicrosoft.ActiveDirectory.Management.resources.dll
After that, you can use all of the AD module cmdlets without installing RSAT.
Common PowerShell Commands for Active Directory
Let’s take a look at some typical administrative tasks that can be performed using the Active Directory for PowerShell cmdlets.
You can find some useful examples of how to use Active Directory for PowerShell module cmdlets on the WOSHub website. Follow the links to get detailed instructions.
New-ADUser: Creating AD Users
To create a new AD user, you can use the New-ADUser cmdlet. You can create a user with the following command:
New-ADUser -Name "Mila Beck" -GivenName "Mila" -Surname "Beck" -SamAccountName "mbeck" -UserPrincipalName "mbeck@woshub.com" -Path "OU=Users,OU=Berlin,OU=DE,DC=woshub,DC=com" -AccountPassword(Read-Host -AsSecureString "Input User Password") -Enabled $true
For detailed info about the New-ADUser cmdlet (including an example on how to create user domain accounts in bulk), see this article.
Get-ADComputer: Getting Computer Object Properties
To get the properties of computer objects in a particular OU (the computer name and the last logon date), use the Get-ADComputer cmdlet:
Get-ADComputer -SearchBase ‘OU=CA,OU=USA,DC=woshub,DC=com’ -Filter * -Properties * | FT Name, LastLogonDate -Autosize
Add-ADGroupMember: Add Active Directory Users to Group
To add users to an existing security group in an AD domain, run this command:
Add-AdGroupMember -Identity LondonSales -Members e.braun, l.wolf
Display the list of users in the AD group and export it to a CSV file:
Get-ADGroupMember LondonSales -recursive| ft samaccountname| Out-File c:psexport_ad_users.csv
Learn more about managing AD groups with PowerShell.
Set-ADAccountPassword: Reset a User Password in AD
In order to reset a user’s password in AD with PowerShell:
Set-ADAccountPassword m.lorenz -Reset -NewPassword (ConvertTo-SecureString -AsPlainText “Ne8Pa$$0rd1” -Force -Verbose) –PassThru
How to Unlock, Enable, and Disable Active Directory Accounts?
To disable the AD user account:
Disable-ADAccount m.lorenz
To enable an account:
Enable-ADAccount m.lorenz
Unlock an account after it has been locked by a domain password policy:
Unlock-ADAccount m.lorenz
Search-ADAccount: How to Find Inactive and Disabled AD Objects?
To find and disable all computers in the AD domain that have not logged on for more than 90 days, use the Search-ADAccount cmdlet:
$timespan = New-Timespan –Days 90
Search-ADAccount -AccountInactive -ComputersOnly –TimeSpan $timespan | Disable-ADAccount
New-ADOrganizationalUnit: Create an Organizational Unit in AD
To quickly create a typical Organizational Unit structure in AD, you can use a PowerShell script. Suppose you want to create multiple OUs with states as their names and create typical object containers. It is quite time-consuming to create this AD structure manually through the graphical ADUC snap-in. AD module for PowerShell allows solving this task in seconds (except the time to write the script):
$fqdn = Get-ADDomain
$fulldomain = $fqdn.DNSRoot
$domain = $fulldomain.split(".")
$Dom = $domain[0]
$Ext = $domain[1]
$Sites = ("Nevada","Texas","California","Florida")
$Services = ("Users","Admins","Computers","Servers","Contacts","Service Accounts")
$FirstOU ="USA"
New-ADOrganizationalUnit -Name $FirstOU -Description $FirstOU -Path "DC=$Dom,DC=$EXT" -ProtectedFromAccidentalDeletion $false
foreach ($S in $Sites)
{
New-ADOrganizationalUnit -Name $S -Description "$S" -Path "OU=$FirstOU,DC=$Dom,DC=$EXT" -ProtectedFromAccidentalDeletion $false
foreach ($Serv in $Services)
{
New-ADOrganizationalUnit -Name $Serv -Description "$S $Serv" -Path "OU=$S,OU=$FirstOU,DC=$Dom,DC=$EXT" -ProtectedFromAccidentalDeletion $false
}
}
After you run the script, you will see the following OU structure in the Active Directory.
To move objects between AD containers, you can use the Move-ADObject cmdlet:
$TargetOU = "OU=Sales,OU=Computers,DC=woshub,DC=com"
Get-ADComputer -Filter 'Name -like "SalesPC*"' | Move-ADObject -TargetPath $TargetOU
Get-ADReplicationFailure: Check Active Directory Replication
You can use the Get-ADReplicationFailure cmdlet to check the status of replication between AD domain controllers:
Get-ADReplicationFailure -Target NY-DC01,NY-DC02
To get information about all DCs in the domain, use the Get-AdDomainController cmdlet:
Get-ADDomainController –filter * | select hostname,IPv4Address,IsGlobalCatalog,IsReadOnly,OperatingSystem | format-table –auto
In this article, we looked at how to install and use the Active Directory PowerShell module for AD domain administration. I hope this article will encourage you to further explore this module and start automating most of your AD management tasks.