АйТи Фреш
Главная / Статьи / Windows и рабочие места
Windows и рабочие места

Убрал пользователя из Domain Admins, а helpdesk всё ещё не может сбросить ему пароль

Автор: Семёнов Евгений Сергеевич, директор ООО «АйТи-Фреш» · · ~25 мин чтения
Убрал пользователя из Domain Admins, а helpdesk всё ещё не может сбросить ему пароль
Иллюстрация к статье «Убрал пользователя из Domain Admins, а helpdesk всё ещё не может сбросить ему пароль».

Ситуация, из-за которой я однажды потерял полдня, а теперь узнаю её по одной строке в заявке: «делегировали helpdesk сброс паролей на OU — работает у всех, кроме Петрова». Петров — бывший системный администратор, которого месяц назад вывели из Domain Admins и перевели в отдел закупок. Учётная запись лежит в той же OU, что и остальные сотрудники, права на OU выданы, но сброс пароля заканчивается сообщением «Отказано в доступе». Разбираю, что остаётся в каталоге после привилегированного членства, как поставить точный диагноз, безопасно вернуть наследование и не устроить массовой чисткой новую проблему.

Симптом, который уводит диагностику в сторону

Инженер первой линии открывает оснастку «Active Directory — пользователи и компьютеры», выбирает «Сброс пароля» для одного сотрудника и получает отказ. На соседней учётной записи из той же OU операция проходит. Под административной учётной записью пароль проблемного пользователя тоже меняется. Такая картина говорит не о неисправном контроллере домена, а о различии в дескрипторах безопасности двух объектов.

Первая реакция обычно такая: делегирование потерялось, поэтому его надо выдать на OU ещё раз. Права назначают повторно, ждут репликации между контроллерами и получают тот же отказ. Это ожидаемо: новая наследуемая ACE остаётся на родительской OU, а пользовательский объект с защищённой DACL её не принимает. Перемещение пользователя в другую OU также ничего не исправляет, потому что запрет наследования хранится в nTSecurityDescriptor самого объекта.

Более опасная реакция — временно включить сотрудников helpdesk в Account Operators. По умолчанию эта встроенная группа может создавать и администрировать большинство пользовательских и групповых учётных записей домена, хотя не может управлять встроенным Administrator, административными учётными записями и рядом защищённых групп. Для обычной первой линии это всё равно несоразмерно широкие полномочия. Я встречал такие «временные» назначения спустя несколько лет после исходной заявки.

Важно не превращать косвенный признак в готовый диагноз. Значение adminCount=1 часто указывает, что объект находится или раньше находился под защитой AdminSDHolder, но само по себе не является разрешением и не доказывает, что текущий отказ вызван именно им. Проверить надо две вещи: фактическую DACL объекта и состояние наследования. Непосредственная причина проблемы — защищённая от наследования DACL, в которой нет нужной ACE для helpdesk.

Не расширяйте полномочия helpdesk ради обхода одной повреждённой цепочки наследования. Членство в Account Operators или Domain Admins меняет модель безопасности всего домена, а не исправляет конкретный объект.

Как связаны AdminSDHolder, SDProp и adminCount

В контейнере System каждого домена автоматически создаётся объект CN=AdminSDHolder,CN=System с собственным дескриптором безопасности. Его ACL служит шаблоном для защищённых учётных записей и групп. По умолчанию процесс SDProp запускается каждые 60 минут на контроллере, которому принадлежит роль PDC Emulator данного домена, сравнивает дескрипторы защищённых объектов с шаблоном и при необходимости восстанавливает требуемые разрешения.

Официальный актуальный перечень включает Account Operators, встроенную учётную запись Administrator, Administrators, Backup Operators, Domain Admins, Domain Controllers, Enterprise Admins, Enterprise Key Admins, Key Admins, krbtgt, Print Operators, Read-only Domain Controllers, Replicator, Schema Admins и Server Operators. В этом перечне смешаны группы и две специальные пользовательские учётные записи. Важная оговорка Microsoft: для Domain Controllers и Read-only Domain Controllers защищены сами групповые объекты, но не их члены. Поэтому обычное наличие adminCount=1 на компьютерной учётной записи контроллера нельзя объявлять штатным, не разобрав её историю.

Защита распространяется на пользовательские учётные записи с прямым или транзитивным членством в перечисленных группах. При обходе цепочки учитываются не только security-группы, но и вложенные distribution-группы. Пользователь внутри группы рассылки не получает SID защищённой группы в токен доступа, однако его объект всё равно может попасть под AdminSDHolder. Microsoft объясняет это тем, что distribution-группу впоследствии можно преобразовать в security-группу.

Когда объект попадает под защиту, процесс устанавливает adminCount в 1, применяет защищённый дескриптор и отключает наследование разрешений. Именно последнее действие обрывает поступление ACE от родительской OU. Перенос объекта не меняет этот флаг, поэтому новая OU тоже не сможет передать ему делегированные права.

После удаления пользователя из защищённой группы SDProp больше не должен обновлять его ACL. Обратного преобразования при этом не происходит: Microsoft отдельно предупреждает, что adminCount остаётся равным 1, а наследование не включается автоматически. Получается «бывший защищённый» объект: текущего привилегированного членства уже нет, но делегирование с OU до него по-прежнему не доходит.

Реестровый параметр AdminSDProtectFrequency типа REG_DWORD действительно существует в ветке HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters на PDC Emulator. Допустимый документированный диапазон — от 60 до 7200 секунд, значение по умолчанию при отсутствии параметра — 3600 секунд. Microsoft рекомендует менять интервал только на короткое время для тестирования, поскольку более частый запуск увеличивает нагрузку на LSASS.

Не считайте все компьютерные учётные записи контроллеров домена законными исключениями для `adminCount=1`. Официальная оговорка относится к защите групп Domain Controllers и Read-only Domain Controllers, а не их членов.
Убрал пользователя из Domain Admins, а helpdesk всё ещё не может сбросить ему пароль — схема
Схема к статье. Открыть схему в полном размере

Диагностика без догадок: атрибут, наследование и цепочка групп

Для команд ниже нужен модуль ActiveDirectory из состава RSAT или средств управления AD DS. Я запускаю Windows PowerShell с учётной записью, которой разрешено читать каталог и ACL, и явно работаю с тем контроллером, на котором хочу получить согласованную картину. Сначала смотрю атрибут проблемного пользователя и собираю перечень всех помеченных объектов домена.

Import-Module ActiveDirectory

$pdc = (Get-ADDomain).PDCEmulator
$user = Get-ADUser -Identity 'i.petrov' -Server $pdc -Properties adminCount
$user | Select-Object Name, SamAccountName, adminCount, DistinguishedName

Get-ADObject -Server $pdc -LDAPFilter '(adminCount=1)' `
    -Properties adminCount, objectClass |
    Select-Object objectClass, Name, DistinguishedName |
    Sort-Object objectClass, Name

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

Затем читаю ACL через провайдер Active Directory. Свойство AreAccessRulesProtected возвращает True, если DACL защищена от наследования, и False, если наследование разрешено. dsacls.exe помогает увидеть явные и унаследованные ACE в текстовом виде. Запускать эти команды удобнее на машине с установленными средствами администрирования AD DS.

$dn = $user.DistinguishedName
$acl = Get-Acl -Path "AD:\$dn"

[pscustomobject]@{
    SamAccountName          = $user.SamAccountName
    AdminCount              = $user.adminCount
    AreAccessRulesProtected = $acl.AreAccessRulesProtected
}

dsacls.exe "$dn"

Третий шаг — проверить транзитивное членство. Обычный атрибут memberOf содержит прямые обратные ссылки и не показывает полную вложенность. Правило LDAP 1.2.840.113556.1.4.1941, которое Microsoft называет LDAP_MATCHING_RULE_IN_CHAIN или LDAP_MATCHING_RULE_TRANSITIVE_EVAL, проходит цепочку DN-ссылок. Следующий запрос выводит группы текущего домена, в которые пользователь входит прямо или через вложенные группы, включая цепочки с distribution-группами.

Get-ADGroup -Server $pdc `
    -LDAPFilter "(member:1.2.840.113556.1.4.1941:=$dn)" `
    -Properties groupType, objectSid |
    Select-Object Name, DistinguishedName, groupType, objectSid |
    Sort-Object Name

В многодоменном лесу одного запроса к текущему домену недостаточно: защищённая группа может находиться в другом доменном разделе. Тогда я повторяю проверку по доменам леса или выполняю поиск через глобальный каталог, учитывая его область поиска и репликацию. Для DN с символами, имеющими специальное значение в LDAP-фильтре, значение нужно экранировать по правилам LDAP; бездумно подставлять произвольный ввод пользователя в фильтр нельзя.

Наконец, сравниваю исправную и проблемную учётные записи. Если у первой AreAccessRulesProtected=False и видны наследуемые ACE helpdesk, а у второй True и этих ACE нет, причина подтверждена. Если наследование уже включено, надо искать другую проблему: явный Deny, неверный тип делегированного права, область применения ACE, репликационную задержку или попытку операции не на том объекте.

Если пользователь по-прежнему прямо или транзитивно входит в защищённую группу, возвращать ему обычное наследование нельзя: следующий цикл SDProp снова применит защиту. Сначала устраняют лишнее членство и проверяют бизнес-владельца учётной записи.
Памятка: Диагностика без догадок: атрибут, наследование и цепочка групп — схема
Памятка: Диагностика без догадок: атрибут, наследование и цепочка групп. Открыть схему в полном размере

Торговый дом «Электрокомплект», 58 РМ: разбор практики

У торгового дома «Электрокомплект», 58 РМ, работали два контроллера домена на Windows Server 2025. Уровни работы домена и леса оставались Windows Server 2016: такая конфигурация официально поддерживает контроллеры Windows Server 2025, а переход на новый функциональный уровень Windows Server 2025 мы вынесли в отдельный проект с проверкой совместимости. В структуре были отдельные OU для сотрудников, сервисных и административных учётных записей. Группа HD-PasswordReset получила на OU сотрудников право сбрасывать пароль и требовать его смену при следующем входе — без дополнительных полномочий.

Заявка выглядела буднично: helpdesk не мог сбросить пароль Петрову, хотя на соседних объектах всё работало. Полный запрос по домену сначала показал защищённые встроенные группы и множество пользовательских учётных записей. После исключения 13 штатно защищённых групп в рабочем отчёте осталось 34 объекта учётных записей, которые требовали классификации, а не немедленной правки.

Из этих 34 объектов отдельно отметили встроенные Administrator и krbtgt, а также шесть сервисных и отключённых учётных записей, судьбу которых нельзя было решать без владельцев систем. Основную выборку составили 26 пользовательских учётных записей. Пять из них были защищены законно: два штатных администратора, моя административная учётная запись и две сервисные учётные записи резервного копирования, которые действительно входили в Backup Operators. На 21 объекте защита оказалась старым следом.

Три случая объяснились сразу: это были бывшие администраторы, включая Петрова. История остальных 18 открылась после проверки членства по цепочке. Предыдущий подрядчик вложил distribution-группу «ИТ-отдел» в Account Operators, рассчитывая раздать права всему отделу одним действием. SID Account Operators пользователи через distribution-группу в токенах не получили, однако механизм AdminSDHolder всё равно отметил их объекты и отключил наследование. Позднее часть сотрудников перешла в продажи, закупки и логистику, а защищённые DACL переехали вместе с учётными записями.

На диагностику ушло 40 минут, ещё 20 минут — на проверку владельцев, подготовку списка изменений и выполнение исправлений. Distribution-группу удалили из Account Operators. Для 21 подтверждённого бывшего защищённого пользователя очистили adminCount и включили наследование. После репликации инженер первой линии успешно сбросил пароль Петрову своими обычными делегированными полномочиями.

Еженедельная проверка за следующие девять месяцев выявила два повторения. В обоих случаях причиной оказалось временное привилегированное членство, которое забыли закрыть после работ. Отчёт оказался полезнее автоматической «лечилки»: он показывал метку, состояние наследования, цепочку групп и владельца учётной записи, а решение об изменении оставалось за администратором.

Distribution-группа внутри защищённой группы — не безобидная конструкция. Она не передаёт пользователям SID родительской security-группы в токен, но учитывается при определении объектов, которые должен защищать AdminSDHolder.

Как вернуть наследование одному бывшему администратору

Порядок действий важнее самой команды. Сначала подтверждаю, что пользователь больше не входит ни в одну защищённую группу прямо или через вложенность. Затем сохраняю исходный дескриптор или хотя бы вывод dsacls.exe в журнал работ, очищаю adminCount и включаю наследование. После этого проверяю ACL и прошу helpdesk выполнить именно ту операцию, ради которой было настроено делегирование.

В примере Set-ADObject -Clear adminCount удаляет значение атрибута, а не записывает туда 0. Оба состояния встречаются после разных способов исправления, но для диагностической чистоты я удаляю устаревшее значение. Метод SetAccessRuleProtection($false, $false) снимает защиту DACL от наследования. По документации .NET второй аргумент игнорируется, когда первый равен $false; я всё равно передаю его явно, чтобы назначение вызова было видно при ревью.

Import-Module ActiveDirectory

$pdc = (Get-ADDomain).PDCEmulator
$user = Get-ADUser -Identity 'i.petrov' -Server $pdc -Properties adminCount
$dn = $user.DistinguishedName

# Выполнять только после проверки прямого и транзитивного членства.
Set-ADObject -Identity $dn -Server $pdc -Clear adminCount

$acl = Get-Acl -Path "AD:\$dn"
$acl.SetAccessRuleProtection($false, $false)
Set-Acl -Path "AD:\$dn" -AclObject $acl

Get-ADUser -Identity 'i.petrov' -Server $pdc -Properties adminCount |
    Select-Object SamAccountName, adminCount

(Get-Acl -Path "AD:\$dn").AreAccessRulesProtected

Ожидаемый результат последней команды — False. После включения наследования в DACL появятся применимые ACE от родительских контейнеров. Это не означает, что все старые явные ACE исчезнут: записи, ранее скопированные или назначенные непосредственно объекту, могут остаться явными. Поэтому я сравниваю итоговую DACL с исправной учётной записью из той же OU и отдельно просматриваю записи Deny.

Сам факт наличия явных ACE, похожих на ACL AdminSDHolder, ещё не повод удалять их все. Удаление может лишить владельца или системную службу необходимого доступа, а точное происхождение записи по одному текущему списку определить не всегда возможно. Если требуется нормализовать DACL до корпоративного шаблона, делаю это отдельным изменением после экспорта исходного дескриптора и проверки владельца объекта.

После исправления жду репликацию или направляю тест на тот же PDC Emulator, где выполнялась правка. Затем повторяю проверку после очередного штатного цикла SDProp. Если adminCount снова стал равен 1, а наследование отключилось, значит пользователь всё ещё попадает в защищённую цепочку либо членство успели вернуть.

Очистка `adminCount` не отбирает и не выдаёт привилегии сама по себе. Изменение наследования, напротив, меняет эффективные разрешения объекта, поэтому его нужно рассматривать как полноценную правку ACL с журналом и проверкой результата.
Порядок действий: Как вернуть наследование одному бывшему администратору — схема
Порядок действий: Как вернуть наследование одному бывшему администратору. Открыть схему в полном размере

Массовая проверка без опасного автоисправления

Разовая починка закрывает заявку, но не показывает масштаб накопившихся исключений. Я начинаю с отчёта, который ничего не меняет. В него попадают пользователь, adminCount, флаг защиты DACL и DN. Затем для каждого кандидата проверяются транзитивные группы, владелец системы, назначение учётной записи и история временных доступов.

Import-Module ActiveDirectory

$pdc = (Get-ADDomain).PDCEmulator
$report = foreach ($user in Get-ADUser -Server $pdc `
    -LDAPFilter '(adminCount=1)' -Properties adminCount, enabled) {

    $acl = Get-Acl -Path "AD:\$($user.DistinguishedName)"

    [pscustomobject]@{
        SamAccountName          = $user.SamAccountName
        Enabled                 = $user.Enabled
        AdminCount              = $user.adminCount
        AreAccessRulesProtected = $acl.AreAccessRulesProtected
        DistinguishedName      = $user.DistinguishedName
    }
}

$report |
    Sort-Object AreAccessRulesProtected, SamAccountName |
    Export-Csv -Path '.\admincount-review.csv' -NoTypeInformation -Encoding UTF8

Я сознательно не использую Get-ADGroupMember -Recursive как единственный механизм исключений. Командлет удобен для обычных security-групп, но автоматическое решение должно учитывать цепочки через distribution-группы, специальные учётные записи, группы другого домена и локализованные имена встроенных групп. Ошибка здесь опаснее нескольких неочищенных объектов: скрипт может включить наследование действующему привилегированному администратору.

После ручной проверки формирую закрытый список одобренных sAMAccountName. В него никогда автоматически не попадают встроенный Administrator с RID 500 и krbtgt с RID 502. Это две разные учётные записи; исходная формулировка «Administrator с RID 500 и 502» была бы неверной. Компьютеры контроллеров домена я также не заношу в список исключений только по роли: если на них найден adminCount=1, причину исследую отдельно.

Само изменение выполняю только по согласованному списку. Сначала запускаю блок с $whatIfMode = $true: в таком режиме он печатает объекты и не меняет каталог. После повторной проверки переключаю значение на $false. Такой подход менее эффектен, чем полностью автоматическая чистка, зато граница ответственности видна в коде и в журнале.

Import-Module ActiveDirectory

$pdc = (Get-ADDomain).PDCEmulator
$approvedSamAccountNames = @(
    'i.petrov'
)
$whatIfMode = $true

foreach ($sam in $approvedSamAccountNames) {
    $user = Get-ADUser -Identity $sam -Server $pdc -Properties adminCount, SID

    if ($user.SID.Value -match '-(500|502)$') {
        throw "Запрещённая встроенная учётная запись: $sam"
    }

    $acl = Get-Acl -Path "AD:\$($user.DistinguishedName)"

    [pscustomobject]@{
        SamAccountName          = $sam
        AdminCount              = $user.adminCount
        AreAccessRulesProtected = $acl.AreAccessRulesProtected
        WhatIf                  = $whatIfMode
    }

    if (-not $whatIfMode) {
        Set-ADObject -Identity $user.DistinguishedName `
            -Server $pdc -Clear adminCount

        $acl.SetAccessRuleProtection($false, $false)
        Set-Acl -Path "AD:\$($user.DistinguishedName)" -AclObject $acl
    }
}

Перед массовым изменением ACL нужна актуальная резервная копия состояния системы контроллера домена, сделанная Windows Server Backup либо другим решением, которое использует поддерживаемый VSS writer для AD DS. Снимок виртуальной машины не считаю заменой резервной копии: Microsoft прямо предупреждает, что защита через VM-Generation ID и безопасный откат виртуального контроллера не заменяют System State backup.

Проверку обычно запускаю раз в неделю, а изменения состава защищённых групп отслеживаю отдельно средствами аудита. В отчёте нужны как минимум две независимые колонки — adminCount и AreAccessRulesProtected. Метка может остаться после старого членства, а состояние ACL показывает, получает ли объект наследуемые разрешения сейчас.

Скрипт, который очищает весь результат `(adminCount=1)` и надеется, что SDProp потом вернёт защиту нужным объектам, создаёт окно с неверными ACL. В рабочем домене лучше оставить несколько кандидатов на ручную проверку, чем временно открыть наследование действующему администратору.

Почему проблема возвращается и как проверить SDProp сразу

Первый сценарий рецидива прост: сотрудника снова добавили в Domain Admins, Backup Operators или другую защищённую группу «на пару часов», а заявку на отзыв доступа не закрыли. Второй сценарий — вложение рабочей группы в защищённую. Одно изменение способно пометить десятки пользовательских объектов, причём distribution-группа создаст особенно неочевидную картину: прав в токене нет, а защита объектов появляется.

Третий сценарий выглядит как возврат, хотя является незавершённой починкой. Администратор очистил adminCount, но не включил наследование, либо включил наследование, не устранив защищённое членство. В первом случае делегирование остаётся сломанным сразу. Во втором SDProp при следующем проходе закономерно восстановит защищённый дескриптор и снова отключит наследование.

Ждать 60 минут для лабораторной проверки не обязательно. Microsoft документирует ручной запуск через Ldp.exe: подключиться именно к PDC Emulator нужного домена, выполнить bind, открыть Browse → Modify, оставить поле DN пустым, указать атрибут RunProtectAdminGroupsTask, значение 1, добавить операцию в список и запустить её. Это изменение rootDSE инициирует задачу немедленно и не сбивает штатное расписание.

Я не меняю ради проверки AdminSDProtectFrequency. Хотя поддерживается диапазон от 60 до 7200 секунд, уменьшенный интервал повышает нагрузку LSASS и легко остаётся в реестре после теста. Ручной запуск точнее: он проверяет нужное изменение один раз, а затем домен возвращается к обычному часовому циклу.

После принудительного запуска повторно читаю пользователя на PDC Emulator, проверяю adminCount, AreAccessRulesProtected и ACL. Если защита вернулась, исправление нельзя «продавить» повторной очисткой. Нужно найти цепочку членства, проверить группы из других доменов, дождаться репликации удалённого членства и только после этого снова менять объект.

Штатный ручной запуск SDProp выполняется на PDC Emulator через изменение rootDSE с пустым DN, атрибутом `RunProtectAdminGroupsTask` и значением `1`. Делать это нужно административной учётной записью с соответствующим доступом.
Порядок действий: Почему проблема возвращается и как проверить SDProp сразу — схема
Порядок действий: Почему проблема возвращается и как проверить SDProp сразу. Открыть схему в полном размере

AdminSDHolder и dSHeuristics: допустимые механизмы с высокой ценой ошибки

Иногда предлагают добавить helpdesk-группу непосредственно в ACL AdminSDHolder. Технически это сработает: SDProp перенесёт подходящую ACE на защищённые пользовательские и групповые объекты домена. Но право сброса пароля тогда получат не только бывшие администраторы, а действующие защищённые пользовательские учётные записи, включая Domain Admins и krbtgt. Для обычной первой линии это не исправление делегирования, а отдельное архитектурное решение с очень высоким риском.

Microsoft действительно описывает сценарии, в которых ACL AdminSDHolder меняют для специально созданных административных учётных записей. Это не делает безопасным добавление туда повседневной helpdesk-группы. Такая правка требует выделенных управляющих учётных записей, ограничений входа, тестирования, плана восстановления и формального учёта каждой ACE.

Другой механизм — лесной атрибут dSHeuristics на объекте CN=Directory Service,CN=Windows NT,CN=Services в разделе Configuration. Его 16-й символ, dwAdminSDExMask, позволяет исключить из защиты четыре операторские группы. Биты имеют документированное значение: 1 — Account Operators, 2 — Server Operators, 4 — Print Operators, 8 — Backup Operators; комбинация записывается одной шестнадцатеричной цифрой от 0 до f.

Если строка содержит десять или больше символов, её 10-й символ обязан быть 1, иначе сервер отклонит обновление. Microsoft также требует сохранять все уже существующие символы, которые не относятся к текущему изменению. Поэтому нельзя брать готовую строку из статьи и записывать её поверх имеющегося значения: соседние позиции управляют другими функциями каталога.

Текущее значение можно безопасно прочитать следующей командой. Пустой результат означает, что атрибут не задан; это нормальное состояние по умолчанию.

Import-Module ActiveDirectory

$configurationNC = (Get-ADRootDSE).configurationNamingContext
$directoryServiceDN = "CN=Directory Service,CN=Windows NT,CN=Services,$configurationNC"

Get-ADObject -Identity $directoryServiceDN -Properties dSHeuristics |
    Select-Object DistinguishedName, dSHeuristics

В официальном материале поддержки приведён пример строки, где 16-й символ равен f, то есть из защиты исключены все четыре операторские группы. Это именно пример формата, а не рекомендуемое значение для производственного леса.

000000000100000f

Я обычно не меняю dSHeuristics ради устранения зависших adminCount. Исключение Backup Operators, например, позволяет делегированным ACE от OU снова применяться к учётным записям с весьма чувствительными возможностями резервного копирования и восстановления. Если организация всё же выбирает этот механизм, изменение надо испытать в отдельном лесу, сохранить исходную строку целиком, оформить оценку риска и проверить результат на PDC Emulator каждого домена после репликации.

Приоритет работ такой: сначала аудит фактического состава защищённых групп, затем точечное восстановление бывших защищённых объектов, после этого регулярный контроль. Изменение AdminSDHolder или dSHeuristics имеет смысл только как осознанное изменение модели управления привилегированными учётными записями, а не как быстрый ответ на заявку helpdesk.

Не записывайте пример `000000000100000f` поверх существующего `dSHeuristics`. Это многофункциональная позиционная строка: потеря уже заданных символов способна изменить поведение AD DS, не связанное с AdminSDHolder.

Частые вопросы

Достаточно ли очистить adminCount или записать туда 0?

Нет. `adminCount` — диагностическая метка, а делегированным ACE мешает защищённая от наследования DACL. После подтверждения, что пользователь больше не входит в защищённые группы, нужно очистить атрибут и разрешить наследование методом `SetAccessRuleProtection($false, $false)` с последующим `Set-Acl`. Результат проверяют по `AreAccessRulesProtected=False` и фактическим ACE.

Почему adminCount и запрет наследования вернулись после исправления?

Пользователь всё ещё прямо или транзитивно входит в защищённую группу, членство было возвращено либо удаление ещё не реплицировалось на PDC Emulator. Проверяйте цепочку правилом `1.2.840.113556.1.4.1941`, включая distribution-группы и группы других доменов леса.

Можно ли исключить все компьютерные учётные записи контроллеров домена из проверки?

Нет. В официальном перечне присутствуют группы Domain Controllers и Read-only Domain Controllers, но Microsoft отдельно уточняет, что защищены сами групповые объекты, а не их члены. Если у компьютерного объекта контроллера найден `adminCount=1`, его историю нужно исследовать, а не объявлять значение штатным автоматически.

Опасна ли массовая очистка adminCount?

Само удаление метки не выдаёт привилегий, но сопутствующее включение наследования меняет эффективный ACL. Опасно обработать действующего привилегированного пользователя или сервисную учётную запись. Поэтому сначала формируют отчёт, проверяют транзитивные группы и владельцев, исключают Administrator с RID 500 и `krbtgt` с RID 502, а затем меняют только согласованный список.

Что изменилось для этой механики в Windows Server 2025?

Официальная Appendix C прямо применяется к Windows Server 2025 и сохраняет описанную модель: AdminSDHolder, SDProp на PDC Emulator, стандартный интервал 60 минут и отключение наследования защищённых объектов. При этом Windows Server 2025 ввёл новый функциональный уровень AD DS, но контроллеры Windows Server 2025 также официально поддерживаются в домене с функциональным уровнем Windows Server 2016.

Можно ли выдать helpdesk право сброса пароля через ACL AdminSDHolder?

Технически ACE будет распространена на подходящие защищённые объекты, но вместе с нужным пользователем под неё попадут действующие привилегированные учётные записи, включая Domain Admins и `krbtgt`. Для обычной линии поддержки это неприемлемое расширение доступа. Исправлять бывшие защищённые объекты следует точечно.

Как запустить SDProp, не ожидая очередного часового цикла?

На PDC Emulator нужного домена откройте `Ldp.exe`, подключитесь и выполните bind, затем выберите Browse → Modify. Оставьте DN пустым, задайте атрибут `RunProtectAdminGroupsTask`, значение `1`, добавьте операцию и запустите её. Этот документированный способ выполняет задачу немедленно и не меняет штатное расписание.

Можно ли использовать снимок виртуальной машины вместо резервной копии перед массовой правкой?

Не следует. Поддержка VM-Generation ID защищает современные виртуальные контроллеры от части последствий отката, но Microsoft не считает снимок заменой резервной копии. Нужен актуальный System State backup либо другое AD-совместимое решение на основе VSS writer, а также проверенный порядок восстановления.

Столкнулись с похожей задачей? Обращайтесь — решим

Если у вас происходит что-то из описанного в этой статье — или любая другая проблема с ИТ-инфраструктурой, — обращайтесь в любое время. Мои специалисты и я лично разберём ситуацию, найдём настоящую причину и доведём до решения.

Возьмёмся и за разовую задачу, и за постоянное обслуживание. Первичная консультация — бесплатно и без обязательств.

📞 +7 903 729-62-41 💬 MAX: +7 903 729-62-41 ✈ Telegram @ITfresh_Boss

С уважением, Семёнов Евгений Сергеевич, директор «АйТи Фреш» — IT-аутсорсинг для компаний до 50 рабочих мест, 15+ лет практики

Источники

© ООО «АйТи-Фреш» · Москва · Все статьи