Дополнительная функциональность Windows 2003

Внутри каждого домена Active Directory (AD) существует несколько специальных контейнеров, которые являются для определенных типов объектов местом хранения по умолчанию. Это свойство дает приложениям возможность работать по умолчанию с некоторыми контейнерами. Если не задать другой контейнер при создании или поиске для выбранного типа объекта, приложение будет работать с данным контейнером по умолчанию. Возможно, многие знакомы с некоторыми из таких контейнеров, например с контейнером cn=Computers для объектов «компьютер», или для объектов типа «пользователь» и «группа». Для привязки к контейнеру cn=Computers можно воспользоваться простым сценарием VBScript:

Set objComputers = GetObject _
("LDAP://cn=Computers," & _
"dc=rallencorp,dc=com")

Подобная команда прекрасно работает до тех пор, пока вы не захотите воспользоваться организационной единицей (OU) для хранения объектов-компьютеров. В этом случае приведенный код не работает. Чтобы решить эту проблему, Microsoft поддерживает в Windows Server 2003 и Windows 2000 другой тип привязки к AD, называемый привязкой к заданным контейнерам Well-Known GUID (WKGUID). Вместо задания cn=Computers можно использовать GUID, связанный с этим компьютером. Например, WKGUID контейнера по умолчанию cn=Computers будет aa312825768811d1aded00c04fd8d5cd. Чтобы сделать вызов GetObject более понятным, при использовании подобных имен можно задействовать следующий код:

Set objComputers = GetObject _
("LDAP://")

Единственное отличие состоит в том, что имя контейнера заменено на WKGUID=aa312825768811d1aded00c04fd8d5cd, а полный путь объекта заключен в круглые скобки. Давайте посмотрим, как использовать WKGUID-привязку и как изменить контейнер по умолчанию WKBIND в Windows 2003.

Список WKGUID находится в атрибуте wellKnownObjects объекта domainDNS для домена (например, dc=rallencorp,dc=com). Атрибут wellKnownObjects является многозначным и использует синтаксис DNWithBinary. Например, на рисунке 1 показано, что атрибут содержится в моем домене rallencorp.com. Можно воспользоваться инструментом Ldp, который является частью Windows Support Tools, для просмотра атрибутов вашего домена. Формат каждого значения следующий:

B:NumberofBytes:GUID:
DistinguishedName

Каждое значение содержит четыре элемента, разделенных (:). Первым элементом является символ В, затем следует число байт, которое равно 32. Эти два элемента одинаковы для каждой записи значения. Третий элемент - это GUID, который можно использовать, как часть привязки WKGUID. Четвертым элементом является отличительное имя distinguished name (DN), с которым связан приведенный GUID.

Только один пункт будет всегда отличаться от приведенного на рисунке 1 - для вашего домена это отличительное имя DN. Другое потенциальное различие зависит от того, на какой операционной системе вы работаете, Windows 2003 или Windows 2000. Вторая и третья секция в записи появились в доменах Windows 2003.

Код, приведенный в листинге 1, показывает, как можно присоединиться к контейнеру по умолчанию для объектов Computer, зная только полное имя Fully Qualified Domain Name (FQDN) домена. Чтобы сделать этот код работоспособным для конкретного домена, нужно заменить rallencorp.com во фрагменте A в листинге 1 на имя своего домена. Код фрагмента B устанавливает значение постоянной для WKGUID, которое представляет имя контейнера по умолчанию для объектов Computers (контейнер Computers). Другой путь получения WKGUID - посмотреть его в файле ntdsapi.h, который доступен из Microsoft Platform Software Development Kit SDK. Вы можете загрузить SDK с http://www.microsoft.com/msdownload/platformsdk/sdkupdate. Код фрагмента C сначала привязывается к точке входа RootDSE, затем привязывается к контейнеру по умолчанию для объектов Computers и выводит имя DN этого контейнера.

Привязка к WKGUID - хорошая возможность, однако Windows 2000 не поддерживает каких-либо изменений в связях. В Windows 2000 вы можете иметь дело только с контейнерами по умолчанию, расположенными не в OU, и не имеете права применить к ним групповую политику. По этой причине (помимо прочих) большинство администраторов AD не используют контейнер по умолчанию Computers в качестве места хранения учетных записей компьютеров, как не используют они и контейнер по умолчанию Users для хранения объектов типа «пользователь» и «группа». Если вы используете другое место для хранения объектов типа Computers, изменение контейнера по умолчанию было бы желательно. Windows 2003 позволяет внести такие изменения.

Листинг 2 содержит код, изменяющий контейнер по умолчанию для объектов Computer. Чтобы этот код работал в вашем домене, измените значения двух переменных во фрагменте A листинга 2. Установите значение переменной strNewComputersParent равным относительному имени DN контейнера Computers, который хотите сделать контейнером по умолчанию и задайте значение переменной strDomain равным полному имени FQDN своего домена.

Код фрагмента B устанавливает значение нескольких постоянных. Постоянная COMPUTER_WKGUID устанавливает три первых элемента в записи, описывающей контейнер Computers по умолчанию в атрибуте wellKnownObjects. Код использует две другие постоянные во время вызова метода PutEx. Во фрагменте C для объектов задается контейнер RootDSE в корне домена (как определено в атрибуте defaultNamingContext входа RootDSE) и текущий контейнер по умолчанию для объектов типа Computers.

Во фрагменте D код изменяет контейнер по умолчанию для объектов Computers. Сначала вызов PutEx удаляет текущий контейнер по умолчанию в атрибуте wellKnownObjects. Вторым действием вызов PutEx добавляет новый контейнер по умолчанию, который был определен во фрагменте A. Затем метод SetInfo подтверждает изменение. AD требует, чтобы контейнер, который вы установили в качестве контейнера по умолчанию, уже существовал. Вы не сможете удалить прежнее значение, не установив новое. Также имя DN нового контейнера должно уже существовать.

Для изменения рассматриваемых контейнеров (cn=Users and cn=Computers) можно воспользоваться и средствами Windows 2003. Команда Redircmp позволяет изменить контейнер по умолчанию для объектов-компьютеров (т.е. Computers). Команда имеет единственный параметр, который устанавливает заданный контейнер в качестве контейнера по умолчанию, например

Redircmp "ou=RallenCorp" & _
Computers,dc=rallencorp," & _
"dc=com"

Аналогично можно при помощи команды Redirusr изменить контейнер по умолчанию Users. Оба инструмента входят в состав комплекта установки Windows 2003. Дополнительную информацию об использовании инструментов Redircmp и Redirusr можно получить в статье Microsoft "Redirecting the Users and Computers Containers in Windows Server 2003 Domains" (http://support.microsoft.com/?kbid=324949).


Листинг 1. Code to Connect to the Default Computers Container
' BEGIN CALLOUT A
strDomain = "rallencorp.com"
' END CALLOUT A
' BEGIN CALLOUT B
' Computer GUID as defined in ntdsapi.h
Const ADS_GUID_COMPUTRS_CONTAINER = _
	"aa312825768811d1aded00c04fd8d5cd"
' END CALLOUT B
' BEGIN CALLOUT C
Set objRootDSE = GetObject("LDAP://" & strDomain & "/RootDSE")
Set objCompContainer = GetObject("LDAP://" )
WScript.Echo objCompContainer.Get("distinguishedName")
' END CALLOUT C

Листинг 2. Code to Change the Default Computers Container
' BEGIN CALLOUT A
strNewComputersParent = "OU=RallenCorp Computers"
strDomain = "amer.rallencorp.com"
' END CALLOUT A
' BEGIN CALLOUT B
' Computer GUID as defined in ntdsapi.h
Const COMPUTER_WKGUID = "B:32:AA312825768811D1ADED00C04FD8D5CD:"
' ADS_PROPERTY_OPERATION_ENUM
Const ADS_PROPERTY_APPEND = 3
Const ADS_PROPERTY_DELETE = 4
' END CALLOUT B
' BEGIN CALLOUT C
Set objRootDSE = GetObject("LDAP://" & strDomain & "/RootDSE")
Set objDomain = GetObject("LDAP://" & objRootDSE.Get("defaultNamingContext"))
Set objCompWK = GetObject("LDAP://" & _
	"")
' END CALLOUT C
' BEGIN CALLOUT D
objDomain.PutEx ADS_PROPERTY_DELETE, "wellKnownObjects", _
	Array( COMPUTER_WKGUID & objCompWK.Get("distinguishedName"))
objDomain.PutEx ADS_PROPERTY_APPEND, "wellKnownObjects", _
	Array( COMPUTER_WKGUID & strNewComputersParent & "," & _
	objRootDSE.Get("defaultNamingContext") )
objDomain.SetInfo
WScript.Echo "New default Computers container set to " & _
	strNewComputersParent
' END CALLOUT D