Перейти к содержанию
Обсудить задачу →
Статьи и инструкции

Удалённая смена паролей Windows в домене: LAPS, PowerShell и безопасный пилот

Безопасная смена паролей Windows: Windows LAPS для локальных администраторов, PowerShell для AD, пилот, аудит, сервисы и возврат.
Удалённая смена паролей Windows в домене: LAPS, PowerShell и безопасный пилот — техническая иллюстрация

Массово передавать один пароль локального администратора через командную строку опасно: секрет попадает в историю, журналы и процессы, а компрометация одной машины открывает остальные. Современная схема разделяет пароли доменных пользователей и локальных администраторов. Для локальных учётных записей используют Windows LAPS, для доменных — штатные средства Active Directory и ограниченную делегацию.

Безопасная смена паролей Windows: инвентаризация, LAPS, пилот, аудит и возврат
Порядок проверки и настройки. Команды, ограничения и диагностика приведены в статье.

1. Определите, чей пароль требуется изменить

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

1. Определите, чей пароль требуется изменить
ОбъектПредпочтительный способГде хранится результат
локальный администратор рабочих станцийWindows LAPSActive Directory или Microsoft Entra ID
доменный пользовательSet-ADAccountPasswordхеши в AD, без выгрузки пароля
сервисная учётная записьgMSA либо процедура владельца сервисаAD и конфигурация сервиса
аварийный локальный доступиндивидуальный LAPS-парольтолько уполномоченным администраторам

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

2. Проведите инвентаризацию и сделайте пилотную группу

Проверьте версии Windows, доступность контроллеров домена, репликацию, наличие старого Microsoft LAPS и права чтения атрибутов. Выберите несколько типичных машин и одну тестовую организационную единицу. Исключения фиксируйте явно, а не расширяйте область действия фильтром «все компьютеры».

Get-ADComputer -SearchBase 'OU=LAPS-Pilot,DC=example,DC=local' -Filter * -Properties OperatingSystem,LastLogonDate |
  Select-Object Name,OperatingSystem,LastLogonDate
repadmin /replsummary

Команды чтения дают исходный список. Перед изменениями экспортируйте действующие GPO и список делегированных групп.

Подготовка административной станции и тестового пользователя

Доменный сценарий требует административной станции с RSAT Active Directory, доступа к выбранному writable DC, синхронизации времени и учётной записи с делегированным правом изменения именно нужного объекта. Не выдавайте Domain Admins ради единичного сброса. На Windows-клиенте установку RSAT выполняют из повышенной консоли по политике организации:

Get-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools*'
# При State=NotPresent и разрешённой установке:
Add-WindowsCapability -Online -Name 'Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0'
Import-Module ActiveDirectory
Get-Command Set-ADAccountPassword,Get-ADUser,Get-ADUserResultantPasswordPolicy

На Windows Server используется соответствующая роль/компонент RSAT, а не тот же клиентский механизм. До изменения выберите контроллер и подтвердите пользователя по DN и SID:

$Dc = 'dc01.example.local'
$Identity = 'user.login'
$User = Get-ADUser -Identity $Identity -Server $Dc -Properties PasswordLastSet,LockedOut,Enabled
$User | Select-Object SamAccountName,DistinguishedName,SID,Enabled,LockedOut,PasswordLastSet
Get-ADUserResultantPasswordPolicy -Identity $User -Server $Dc
Get-ADDefaultDomainPasswordPolicy -Server $Dc

Пустой результат resultant policy может означать отсутствие fine-grained PSO для этого пользователя; тогда проверяют политику домена. Это не разрешение обойти длину, историю и минимальный возраст пароля. Если DN находится не в ожидаемой OU или аккаунт является сервисным, остановите пользовательский сценарий и уточните владельца.

3. Подготовьте Windows LAPS и права доступа

Windows LAPS встроен в поддерживаемые версии Windows. Для локального Active Directory подготовьте схему по официальной процедуре, затем выдайте компьютерам право обновлять собственный пароль и отдельно назначьте группы, которым разрешено чтение или сброс. Эти операции выполняют с административной станции и журналируют.

Import-Module LAPS
Get-LapsDiagnostics -OutputFolder C:\Temp\LapsDiagnostics
# Команды изменения схемы и делегации сначала выполняют в лаборатории.

Не выдавайте чтение LAPS-паролей широким группам поддержки. Проверьте наследование ACL и административную модель уровня рабочих станций.

Полный пилот Windows LAPS: схема и делегация

Для отдельной OU OU=LAPS-Pilot,DC=example,DC=local подготовьте восстановление AD и делегацию. Обновление схемы — операция уровня леса; оно не откатывается удалением новой GPO. Убедитесь, что она ещё не выполнена и что выбранный оператор уполномочен на изменение схемы. После подготовки из модуля LAPS выполняют следующие действия по отдельным ролям:

Import-Module LAPS
$PilotOu = 'OU=LAPS-Pilot,DC=example,DC=local'
# Один раз на лес, уполномоченным оператором схемы:
Update-LapsADSchema -Verbose
# Затем оператором с правом изменять ACL пилотной OU:
Set-LapsADComputerSelfPermission -Identity $PilotOu
Set-LapsADReadPasswordPermission -Identity $PilotOu -AllowedPrincipals 'EXAMPLE\LAPS-Readers'
Set-LapsADResetPasswordPermission -Identity $PilotOu -AllowedPrincipals 'EXAMPLE\LAPS-Rotators'
Find-LapsADExtendedRights -Identity $PilotOu

Группы Readers и Rotators должны существовать и иметь утверждённый состав. SelfPermission даёт компьютерам возможность обновлять свои атрибуты. Чтение, установка срока ротации и расшифрование — разные полномочия; не объединяйте их автоматически. В выводе ExtendedRights проверьте унаследованные широкие группы: явное добавление Readers не удаляет старые опасные разрешения. Источник и область изменения ACL фиксируют перед публикацией политики.

4. Настройте политику без общего пароля

В GPO задайте каталог хранения, имя управляемой локальной учётной записи, длину и сложность пароля, срок ротации и поведение после использования. Не записывайте пароль в GPO Preferences, скрипт запуска, CSV или систему заявок. Если встроенный Administrator переименован, подтвердите его фактический SID и имя на пилоте.

gpupdate /force
Get-LapsDiagnostics -OutputFolder C:\Temp\LapsDiagnostics
Get-WinEvent -LogName 'Microsoft-Windows-LAPS/Operational' -MaxEvents 20

Факт применения GPO ещё не доказывает, что новый секрет записался в каталог и доступен только нужной группе.

Конкретные параметры политики и проверка на устройстве

В GPMC создайте отдельную GPO для пилота, привяжите только к выбранной OU. В редакторе откройте Computer Configuration → Policies → Administrative Templates → System → LAPS. Если раздел отсутствует при Central Store, обновите LAPS.admx и соответствующий локализованный LAPS.adml из поддерживаемой системы в Central Store по принятой процедуре, сохранив прежние файлы.

Для примера задайте backup в Active Directory (BackupDirectory=2), длину 20, сложность 4 и возраст 30 дней; это параметры пилота, которые сверяют с локальной политикой паролей. Для встроенного Administrator оставьте AdministratorAccountName незаданным: встроенная учётная запись определяется по RID, даже при переименовании. Для специально созданной локальной учётной записи проверьте её существование и права отдельно. Автоматическое управление аккаунтом новых версий имеет отдельные требования и не подразумевается этим сценарием.

При DFL 2016+ можно настроить шифрование и определённую группу расшифрования. Разрешение чтения атрибута само по себе не выдаёт право расшифровать: ADPasswordEncryptionPrincipal проверяют отдельно. После применения GPO на пилотном компьютере из повышенной консоли выполните:

gpupdate /target:computer /force
Invoke-LapsPolicyProcessing
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-LAPS/Operational';Id=10018} -MaxEvents 5 |
    Select-Object TimeCreated,Id,Message

На административной станции читайте только безопасные поля результата, исключив Password:

Get-LapsADPassword -Identity 'PC-TEST-01' |
    Select-Object ComputerName,Account,PasswordUpdateTime,ExpirationTimestamp,Source,DecryptionStatus
Set-LapsADPasswordExpirationTime -Identity 'PC-TEST-01'

Последняя команда меняет срок в AD; устройство сменит пароль при следующей обработке политики. Reset-LapsPassword запускается локально на управляемом устройстве, а не на станции оператора для произвольного удалённого компьютера. После команды повторите проверку времени записи и события. Для отрицательного теста обычный оператор не должен получить секрет или успешное расшифрование; не выводите весь объект с паролем в transcript.

5. Проверьте чтение и управляемую ротацию

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

Get-LapsADPassword -Identity 'PC-TEST-01' -AsPlainText
Reset-LapsPassword
Get-WinEvent -LogName 'Microsoft-Windows-LAPS/Operational' -MaxEvents 10

Параметр -AsPlainText показывает секрет оператору, поэтому вывод не сохраняют в общий transcript или тикет. В автоматизации лучше работать с разграниченными системами секретов и аудитом доступа.

6. Меняйте пароль доменного пользователя отдельно

Для индивидуального сброса используйте ADUC или Set-ADAccountPassword с защищённым вводом. Сначала проверьте точный объект и область делегации. Пароль не должен присутствовать в аргументах команды, файле или истории терминала.

$User = Get-ADUser -Identity 'user.login'
$NewPassword = Read-Host 'Новый пароль' -AsSecureString
Set-ADAccountPassword -Identity $User -Reset -NewPassword $NewPassword
Set-ADUser -Identity $User -ChangePasswordAtLogon $true

При инциденте также отзывают активные сеансы и токены по действующей процедуре организации. Сброс пароля сам по себе не закрывает уже выданный доступ во всех системах.

Смена с известным старым паролем и административный сброс

Смена выполняется с прежним и новым паролями. Сброс с -Reset — отдельное привилегированное действие без старого пароля. Оно требует подтверждения личности и основания заявки. SecureString скрывает обычный вывод и исключает литерал из истории, но не превращает скомпрометированную административную станцию в безопасную.

$OldPassword = Read-Host 'Текущий пароль' -AsSecureString
$NewPassword = Read-Host 'Новый пароль' -AsSecureString
try {
    Set-ADAccountPassword -Identity $User -Server $Dc -OldPassword $OldPassword -NewPassword $NewPassword -ErrorAction Stop
} finally {
    if ($OldPassword) { $OldPassword.Dispose() }
    if ($NewPassword) { $NewPassword.Dispose() }
}

Для делегированного сброса используют отдельный операторский контекст и тот же точный объект. Требование ChangePasswordAtLogon применяют к интерактивному пользователю после проверки доступности смены, а не ко всем сервисным аккаунтам.

$Operator = Get-Credential -Message 'Делегированный оператор AD'
$TemporaryPassword = Read-Host 'Временный пароль' -AsSecureString
try {
    Set-ADAccountPassword -Identity $User -Server $Dc -Credential $Operator -Reset -NewPassword $TemporaryPassword -ErrorAction Stop
    Set-ADUser -Identity $User -Server $Dc -Credential $Operator -ChangePasswordAtLogon $true -ErrorAction Stop
} finally {
    if ($TemporaryPassword) { $TemporaryPassword.Dispose() }
}
Get-ADUser -Identity $Identity -Server $Dc -Properties PasswordLastSet,pwdLastSet |
    Select-Object SamAccountName,PasswordLastSet,pwdLastSet

pwdLastSet=0 соответствует требованию смены при следующем входе. Не проверяйте пароль массовыми неверными входами: можно заблокировать учётную запись. Достаточно одного согласованного теста входа владельцем после репликации. Старые сеансы, Kerberos tickets, VPN и веб-токены имеют свои сроки и механизмы отзыва; смена пароля не гарантирует их мгновенное завершение.

Ноутбук вне офиса: порядок, который не создаёт тупик

У ноутбука без связи с DC остаются cached logon credentials, поэтому локальный вход старым паролем после серверного сброса возможен и не доказывает неуспешный сброс AD. Одновременно VPN, использующий доменный пароль, может уже требовать новое значение. Уточните pre-logon VPN, способы MFA и доступ к смене пароля до установки обязательной смены. Сценарий должен позволять устройству связаться с DC и обновить локальный кэш.

Не решайте проблему отключением MFA, добавлением пользователя в администраторы или рассылкой нового пароля в общей заявке. Проверка у владельца должна включать VPN, рабочую сессию, почту и приложения с сохранёнными учётными данными. Старые credentials в заданиях, мобильной почте и сетевых ресурсах могут создавать повторные неуспешные попытки и блокировку; найдите источник по событиям, а не сбрасывайте пароль каждый раз.

7. Не используйте общий PsPasswd с паролем в строке

Устаревшие сценарии часто передают пароль в PsExec/PsPasswd или цикле BAT. Такой секрет виден в истории, диагностике процессов, системе развёртывания и копиях скрипта. Один пароль на всём парке создаёт горизонтальный путь атаки.

Если LAPS пока невозможно внедрить, допустим только временный пилот через защищённый PowerShell Remoting: индивидуальные пароли, ограниченный список узлов, интерактивный SecureString, журналирование и немедленный переход к LAPS. Не отключайте WinRM-аутентификацию и firewall ради удобства.

8. Учтите сервисы, задания и автономные устройства

Перед ротацией сервисной учётной записи найдите службы, пулы приложений, задания планировщика, SQL Agent, NAS и сетевые устройства. Для Windows-служб предпочтительна gMSA: домен управляет паролем, а приложения не хранят статический секрет.

Get-ADServiceAccount -Filter * | Select-Object Name,Enabled
Get-CimInstance Win32_Service |
  Where-Object StartName -Match 'example\\' |
  Select-Object Name,StartName,State

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

9. Проведите приёмку и расширяйте волнами

На пилоте подтвердите запись пароля в каталог, вход с новым паролем, отказ старого, автоматическую повторную ротацию, доступ только разрешённых групп и отсутствие ошибок LAPS. Затем расширяйте GPO небольшими волнами с паузой наблюдения.

  • все компьютеры пилота получили политику;
  • у каждого свой пароль и актуальный timestamp;
  • helpdesk без полномочий не читает секрет;
  • сервисы, RDP и локальная поддержка работают;
  • события ротации попадают в централизованный аудит.

Отчёт должен содержать компьютеры и статусы, но не значения паролей.

10. Подготовьте возврат и обработку исключений

Для возврата отвяжите пилотную GPO, сохраните диагностические события и верните предыдущую политику управления локальной учётной записью. Не удаляйте атрибуты схемы AD как обычный rollback. Машины вне домена, долго отключённые ноутбуки и неподдерживаемые ОС ведите как отдельный реестр исключений с датой устранения.

Диагностика и возврат без старого общего секрета

Если политика применена, а timestamp не обновляется, проверьте DNS до DC, доверие компьютера, время, self permissions, поддерживаемость клиента и конфликт старого LAPS/Intune/GPO. Если пароль записан, но делегированная группа не может его расшифровать, проверьте encryption principal и членство, а не расширяйте Readers до Domain Users. Если требования длины конфликтуют с локальной политикой, исправьте согласованные параметры и повторите цикл.

Отвязка GPO прекращает управление по этой политике, но не возвращает прошлый пароль и не удаляет атрибуты схемы. Возврат означает восстановление согласованного механизма управления с индивидуальными секретами и проверенным аварийным доступом. Для сервисных учётных записей заранее перечислите службы и задания на всех узлах, определите порядок обновления и перезапуска. gMSA внедряют отдельным сценарием совместимости приложения; она не является автоматической заменой любого сервисного логина.

Источники: Microsoft Learn — Windows LAPS overview, Microsoft Learn — сценарий Windows LAPS с Active Directory, Microsoft Learn — Set-ADAccountPassword.

Дополнительная документация: Windows LAPS: параметры политики, Windows LAPS: PowerShell.