Повышение границы пула RID

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


Если вам интересна тематика Windows Server, рекомендую обратиться к тегу  Windows Server  на моем блоге.


Повышение границы пула RID

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

Теория

За выдачу пулов относительных идентификаторов отвечает держатель роли FSMO RID Master, о котором я подробно рассказывал в статье RID master — Хозяин относительных идентификаторов.

Информация о текущем пуле RID содержится в объекте CN=RID Manager$,CN=System,DC=domain,DC=tld. Найти его можно при помощи любой из оснасток: Active Directori — пользователи и компьютеры или Adsiedit.msc. Я воспользуюсь последней, чтобы позже продемонстрировать дополнительную информацию по каждому контроллеру домена.

Повышение границы пула RID 04

RID Manager$ содержит два важных параметра:

  • fSMORoleOwner — текущий держатель роли RID master;
  • rIDAvailablePool — пространство, из которого выделяются идентификаторы RID.

Последний интересен тем, что представляет из себя число в формате Large Integer, состоящее из двух равных частей. Эти части хранят верхнюю и нижнюю границы диапазона относительных идентификаторов, готовых к выдаче. Чтобы вычленить из этого формата конкретные значения, можно воспользоваться конвертером длинных чисел утилиты LDP.exe (раздел меню Служебные программы):

Повышение границы пула RID 01

Далее нас интересует информация на контроллерах домена, ведь каждый из них имеет собственный пул RID для оперативной выдачи идентификаторов. Этот пул, как известно, выдается хозяином RID пачками по 500 штук и каждый КД запрашивает новую порцию как только израсходует 250 штук из этого пула. Такое поведение обеспечивает стабильный запас идентификаторов на случай, если хозяин RID будет какое-то время недоступен.

Итак, в Adsiedit.msc переходим в каталог OU=Domain Controllers,DC=domain,DC=tld, разворачиваем его и видим контейнеры с именами ваших контроллеров домена. Если спуститься в контейнер КД, то увидите объект RID Set. Он интересен атрибутами:

  • rIDAllocationPool — текущий используемый пул;
  • rIDNextRID — идентификатор, который будет выдан следующим;
  • rIDPreviousAllocationPool — пул, из которого будут выданы следующие пачки идентификаторов.

Первый и третий атрибут все также являются составными числами. Например можно посмотреть информацию с двух КД, взяв значения rIDAllocationPool:

Повышение границы пула RID 02

Хорошо заметно, что текущие используемые пулы на серверах являются смежными.

Эту информацию можно получить также из командной строки всем известной утилитой dcdiag:

dcdiag.exe /TEST:RidManager /v | find /i "rid"

Получите подобный вывод:

Собственно с теорией все, пора переходить к практике.

Когда необходимо

Объективно существует лишь одна единственная ситуация, когда ручное повышение границы пула относительных идентификаторов является необходимостью — восстановление леса или домена AD целиком 1.

Помимо этого, напоминаю, необходимо также выполнить инвалидацию текущих пулов RID на каждом КД, а об этом я расскажу ниже.

Повышение границы

Для повышения границы пула RID 2 воспользуемся ранее открытой оснасткой Adsiedit.msc. Откроем свойства объекта RID Manager$, который мы только что рассматривали, и увеличим значение атрибута rIDAvailablePool на 100 000 единиц. Например:

  • было 4611686014132430214
  • стало 4611686014132530214

Примечание: увеличение пула на 100 000 в 99,99% случаев будет более чем достаточно. Однако крайне маловероятно, но все же в некоторых ситуациях этого прироста может не хватить. Установите с запасом актуальное для вашей инфраструктуры значение.

После этого новые значения RID будут выдаваться из увеличенного пула.

Инвалидация пула RID

Пул повышен и казалось бы возможное появление проблем исключено, но на деле это не так. Дело в том, что восстановленные КД будут использовать тот пул, который у них был на момент снятия резервной копии. То есть сразу после повышения границы пула необходимо выполнить сброс локальных пулов на каждом КД (по английски это называется RID pool Invalidation).

Для сброса пула выполните код в Powershell 3:

$Domain = New-Object System.DirectoryServices.DirectoryEntry  
$DomainSid = $Domain.objectSid  
$RootDSE = New-Object System.DirectoryServices.DirectoryEntry("LDAP://RootDSE")  
$RootDSE.UsePropertyCache = $false  
$RootDSE.Put("invalidateRidPool", $DomainSid.Value)  
$RootDSE.SetInfo()

Примечание: аналогичный функционал предлагает официальный скрипт iRIDPool.vbs 4 от Microsoft.

Если сразу после сброса вы запустите dcdiag на КД, то увидите ошибку:

Повышение границы пула RID 05

В просмотре событий будет зарегистрировано:

Повышение границы пула RID 06

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

Повышение границы пула RID 07

Нажмите ОК и снова попытайтесь создать учетку пользователя и все пройдет хорошо, а среди текущего пула RID в dcdiag будет высвечиваться новый:

Напоследок хочется добавить, что инвалидация пула RID — односторонняя операция и неиспользованные значения RID в ход пустить уже не получится.

comments powered by HyperComments