Андрей Попов - Windows Script Host для Windows 2000/XP
Напомним, что на выделенном компьютере с Windows ХРимеется база данных, содержащая информацию обо всех локальных пользователях этого компьютера. Пользователи компьютера определяются своими атрибутами (имя регистрации, полное имя, пароль и т.п.) и могут объединяться в группы. Ниже мы приведем примеры сценариев WSH, с помощью которых можно:
□ получить список имеющихся в локальной сети доменов;
□ получить список всех групп, определенных на компьютере;
□ добавить и удалить пользователя компьютера;
□ определить всех пользователей заданной группы или все группы, в которые входит определенный пользователь;
□ просмотреть атрибуты пользователя и изменить его пароль.
Для получения более полной информации по технологии ADSI следует обратиться к документации Microsoft или специальной литературе (см. введение).
Связывание с нужным объектом каталога
Первым шагом для доступа к пространству имен любого каталога в целях получения информации о его объектах или изменения свойств этих объектов является связывание (binding) с нужным объектом ADSI.
Рассмотрим вначале, каким образом формируется строка связывания для доступа к объектам отдельной рабочей станции с операционной системой Windows ХР. В общем виде эта строка имеет следующий формат:
"WinNT:[//ComputerName[/ObjectName[, className]]]]"
Здесь параметр ComputerName задает имя компьютера; ObjectName — имя объекта (это может быть имя группы, пользователя, принтера, сервиса и т. п.); className — класс объекта. Возможными значениями параметра className являются, например, group (группа пользователей), user (пользователь), printer (принтер) или service (сервис Windows ХР).
Указав в качестве строки ADsPath просто "WinNT:", можно выполнить связывание с корневым объектом-контейнером, содержащим все остальные объекты службы каталога.
Приведем несколько примеров строк связывания для доступа к различным объектам компьютера Windows ХР(табл. 11.1).
Таблица 11.1. Варианты строк связывания РЅР° компьютере Windows РҐР
Строка ADsPath Описание "WinNT:" Строка для связывания с корневым объектом пространства имен "WinNT://404_Popov" Строка для связывания с компьютером 404_Popov "WinNT://404_Popov/Popov,user" Строка для связывания с пользователем Popov компьютера 404_Popov "WinNT://404_Popov/BankUsers, group" Строка для связывания с группой BankUsers на компьютере 404_PopovДля того чтобы из сценария WSH использовать объект ADSI, соответствующий сформированной строке связывания, необходимо применить функцию GetObject языка JScript, которая возвращает ссылку на объект ActiveX, находящийся во внешнем каталоге. Например:
var NameSpaceObj = GetObject("WinNT:");
var ComputerObj = GetObject("WinNT://404_Popov");
var UserObj = GetObject("WinNT://404_Popov/Popov,user");
var GroupObj = GetObject("WinNT://404_Popov/BankUsers, group");
ЗамечаниеВо всех рассмотренных ранее сценариях для создания объектов ActiveX мы пользовались методами CreateObject и GetObject объекта WScript или объектом ActiveXObject языка JScript. Для связывания же с объектом ADSI нужно использовать именно функцию GetObject языка JScript (или VBScript)!
Перейдем теперь к рассмотрению конкретных примеров сценариев, использующих объекты ADSI.
Список всех доступных доменов в локальной сети
В листинге 11.1 приведен JScript-сценарий ListDomains.js, в котором создается список всех доменов, доступных в сети (рис. 11.1)
Рис. 11.1. Список всех имеющихся в сети доменов
В рассматриваемом сценарии производятся следующие действия. Сначала создается корневой объект NameSpaceObj класса Namespace для провайдера Windows NT, который содержит все остальные объекты службы каталога:
//Связываемся с корневым объектом Namespace
NameSpaceObj = GetObject("WinNT:");
Затем с помощью свойства Filter из коллекции NameSpaceObj выделяются все содержащиеся в ней объекты класса Domain и создается экземпляр объекта Enumerator (переменная е) для доступа к элементам коллекции NameSpaceObj:
//Устанавливаем фильтр для выделения объектов-доменов
NameSpaceObj.Filter = Array("domain");
//Создаем объект Enumerator для доступа к коллекции NameSpaceObj
E=new Enumerator(NameSpaceObj);
Список доменов будет храниться в переменной List, которая инициализируется следующим образом:
List="Bce доступные домены в сети:nn";
В цикле while выполняется перебор всех элементов коллекции, которые являются объектами класса Domain; название домена, хранящееся в свойстве Name, добавляется (вместе с символом разрыва строки) в переменную List:
while (!E.atEnd()) {
В //Рзвлекаем текущий элемент коллекции (объект класса Domain)
В DomObj=Р•.item();
 //Формируем строку с именами доменов