Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Введение в Active Directory Service Interface (ADSI): провайдер WinNT

Понятие об ADSI

Технология ADSI (Active Directory Service Interface, интерфейс службы активного каталога) разработана фирмой Microsoft для доступа к службам каталогов. Под службой каталога (Directory Service) понимается та часть распределённой компьютерной системы (компьютерной сети), которая предоставляет средства для поиска и использования имеющихся сетевых ресурсов различных типов (зарегистрированные пользователи, сетевые папки и принтеры и т.д.). В неоднородной компьютерной сети могут одновременно функционировать несколько различных служб каталогов, например, Windows Directory Service для Windows NT 4.0 или Active Directory для Windows 2000 / Windows Server 2003. Технология ADSI обеспечивает единообразный, не зависящий от конкретного сетевого протокола доступ к функциям различных каталогов.

Все примеры сценариев WSH в настоящей статье будут приводиться на языке VBScript.

COM-объекты ADSI включены в операционные системы Windows XP/2000/2003, а также могут быть установлены в более ранних версиях, для чего их нужно скачать с сервера Microsoft.

Имена объектов ADSI называются строками связывания (Binding String) или строками ADsPath, которые состоят из двух частей. Первая часть имени определяет, к какой именно службе каталогов (или провайдеру ADSI) мы обращаемся:


ОбращениеОписание
LDAP:// Для службы каталогов, созданной на основе протокола LDAP (Lightweight Directory Access Protocol, упрощённый протокол для доступа к каталогу), в том числе для Active Directory в Windows 2000/2003.
WinNT:// Для службы каталогов в сети Windows NT 4.0 или на локальной рабочей станции Windows XP/2000.
NDS:// Для службы каталогов NetWare NDS (Novell Directory Service).
NWCOMPAT:// Для службы каталогов NetWare Bindery.

Вторая часть строки ADsPath определяет расположение объекта в конкретном каталоге (для каждого провайдера ADSI - по-своему).

ADSI может выступать в роли провайдера OLE DB, что позволяет с помощью ADO (ActiveX Data Object) выполнять "естественные" запросы к пространству имён службы каталога (провайдер "ADsDSOObject"). Использовать ADSI в качестве провайдера OLE DB можно в запросах к пространствам имён LDAP и NDS.

Провайдер WinNT

Строка связывания для провайдера WinNT имеет следующий формат:

WinNT:[//ComputerName[/ObjectName[,ClassName]]]

Здесь:

Указав в качестве строки ADsPath просто "WinNT", можно выполнить связывание с корневым объектом-контейнером, содержащим все остальные объекты службы каталога.

Для того, чтобы в сценарии использовать объект ADSI, соответствующий указанной строке связывания, необходимо применить функцию GetObject():

Set objUser = GetObject("WinNT://MyComputer/Vasya,user")

Для уменьшения времени считывания и установки свойств в ADSI применяется модель кэширования свойств (property caching) с помощью методов GetInfo() и SetInfo().

Метод GetInfo() вызывается неявно всякий раз при запросе новых данных. Например:

Set User = GetObject("WinNT://MyComputer/Vasya,user")
WScript.Echo User.FullName

Если далее в коде применить ещё раз конструкцию User.FullName, то ADSI возвратит значение из кэша свойств, а не будет выполнять повторный поиск в каталоге. Явный же вызов метода GetInfo() приведёт к повторному считыванию данных из каталога:

Set User = GetObject("WinNT://MyComputer/Vasya,user")
WScript.Echo User.FullName
User.FullName = "AAAAAAAAAA"
WScript.Echo User.FullName
User.GetInfo
WScript.Echo User.FullName

При изменении объекта в пространстве имён можно использовать несколько свойств этого объекта, но только одну операцию записи обновления в каталоге. Метод SetInfo() вызывается явно и только один раз:

Set User = GetObject("WinNT://MyComputer/Vasya,user")
User.FullName = "Vasily"
User.Description = "Vasily Pupkin"
User.SetInfo

Ниже описываются интерфейсы IADs, IADsDomain и IADsContainer. Зная название интерфейса, вы можете воспользоваться поиском по библиотеке MSDN, чтобы получить исчерпывающую информацию о его свойствах и методах. Интерфейсы IADs, IADsDomain и IADsContainer позволяют перечислить все доступные домены, управлять политикой учётных записей доменов, перечислить объекты, входящие в домены, создать и удалить учётные записи компьютеров и пользователей, создать и удалить группы.

Перечисление доступных доменов

Перечисление доступных доменов и рабочих групп осуществляется с использованием интерфейса IADs.

Dim Domain 'as IADs
Set NameSpace = GetObject("WinNT:")
For Each Domain In NameSpace
	WScript.Echo Domain.ADsPath
	WScript.Echo Domain.Class
	WScript.Echo Domain.GUID
	WScript.Echo Domain.Parent
	WScript.Echo Domain.Name
	WScript.Echo Domain.Schema
	WScript.Echo
Next

Объект домена

Объект домена представляет интерфейс IADsDomain:

Dim Domain 'as IADsDomain
Set Domain = GetObject("WinNT://myDomainName, domain")
'Set Domain = GetObject("WinNT://myWorkgroupName, workgroup")

WScript.Echo Domain.ADsPath 'строка подключения ADsPath
WScript.Echo Domain.Class 'класс объекта
WScript.Echo Domain.GUID 'GUID
WScript.Echo Domain.Name 'имя объекта
WScript.Echo Domain.Parent 'строка ADsPath родительского объекта

'Промежуток времени перед автоматическим сбросом флага
'блокировки в заблокированной учётной записи пользователя,
'в секундах (-1 - бесконечно). Чтение и запись.
WScript.Echo Domain.AutoUnlockInterval

'Промежуток времени, в течение которого контроллер домена
'хранит число неверных попыток регистрации в домене перед сбросом
'значения в 0, в секундах. Чтение и запись. По истечении указанного
'времени контроллер домена снимет блокировку учётной записи при
'неверной регистрации.
WScript.Echo Domain.LockoutObservationInterval

'Число неверных попыток регистрации в домене перед блокированием
'учётной записи. Чтение и запись.
WScript.Echo Domain.MaxBadPasswordsAllowed

'Срок действия пользовательского пароля в секундах. (-1 -
'бесконечно). Чтение и запись.
WScript.Echo Domain.MaxPasswordAge

'Число секунд, в течение которых пользователь не сможет изменить
'свой пароль (0 - немедленно). Чтение и запись.
WScript.Echo Domain.MinPasswordAge

'Минимальная длина пароля (-1 - использовать пустые пароли).
'Чтение и запись.
WScript.Echo Domain.MinPasswordLength

'Число паролей, которые Windows хранит для каждого пользователя
'домена. При изменении пароля Windows проверяет, не соответствует
'ли новый пароль одному из ранее использовавшихся (если да, то не
'позволяет сменить пароль). Чтение и запись.
WScript.Echo Domain.PasswordHistoryLength

Работа с контейнерами

Интерфейс IADsContainer позволяет, подключившись к контейнеру, перечислить все объекты контейнера:

Dim Container 'as IADsContainer
ContainerName = "myDomainName"
Set Container = GetObject("WinNT://" & ContainerName)
For Each Obj In Container
	WScript.Echo Obj.Name
Next

В качестве имени контейнера (ContainerName в скрипте выше) может выступать, например, имя домена или имя компьютера в формате DomainName/ComputerName.

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

Dim Container 'as IADsContainer
ContainerName = "myDomainName"
Set Container = GetObject("WinNT://" & ContainerName)
Container.Filter = Array("User")
For Each Obj In Container
	WScript.Echo Obj.Name
Next
Container.Filter = Array("Computer")
For Each Obj In Container
	WScript.Echo Obj.Name
Next
Container.Filter = Array("Group") 'все группы
For Each Obj In Container
	WScript.Echo Obj.Name
Next
Container.Filter = Array("LocalGroup")
For Each Obj In Container
	WScript.Echo Obj.Name
Next
Container.Filter = Array("GlobalGroup")
For Each Obj In Container
	WScript.Echo Obj.Name
Next
Container.Filter = Array("PrintQueue") 'очереди заданий на печать
For Each Obj In Container
	WScript.Echo Obj.Name
Next

Методы Create() и Delete() интерфейса IADsContainer позволяют создавать и удалять учётные записи компьютеров, пользователей, создавать и удалять группы в домене.

Добавление новой учётной записи компьютера:

Set Domain = GetObject("WinNT://myDomainName")
Set Computer = Domain.Create("Computer", "MYCOMPUTERNAME")
Computer.SetInfo
Set ComputerAccount = GetObject("WinNT://myDomainName/MYCOMPUTERNAME$, user")
'установка пользовательского флага ADS_UF_WORKSTATION_TRUST_ACCOUNT (&H1000),
'который говорит о том, что это компьютер, который является рабочей станцией
'и членом домена
ComputerAccount.Put "UserFlags", (ComputerAccount.Get("UserFlags") Or &H1000)
ComputerAccount.SetPassword "mycomputername"
ComputerAccount.SetInfo

Удаление учётной записи компьютера:

Set Domain = GetObject("WinNT://myDomainName")
Domain.Delete "Computer", "MYCOMPUTERNAME"

Добавление новой учётной записи пользователя:

Set Domain = GetObject("WinNT://myDomainName")
Set User = Domain.Create("User", "UserName")
User.FullName = "UserFullName"
User.SetPassword "strPassword"
User.SetInfo

Удаление учётной записи пользователя:

Set Domain = GetObject("WinNT://myDomainName")
Domain.Delete "User", "UserName"

Метод MoveHere() интерфейса IADsContainer позволяет переименовать учётную запись пользователя. При этом идентификатор безопасности (SID - Secutity Identifier) пользователя остаётся неизменным:

Set Domain = GetObject("WinNT://myDomainName")
Domain.MoveHere "WinNT://myDomainName/OldUserName", "NewUserName"

Добавление новой группы:

Set Domain = GetObject("WinNT://myDomainName")
Set Group = Domain.Create("Group", "GroupName")
Group.Put "groupType", 4 'локальная группа
'Group.Put "groupType", 2 'глобальная группа
Group.SetInfo

Удаление группы:

Set Domain = GetObject("WinNT://myDomainName")
Domain.Delete "Group", "GroupName"

Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.