Программное управление ADSI: WinNT::Журнал СА 2.2004
www.samag.ru
     
Поиск   
              
 www.samag.ru    Web  0 товаров , сумма 0 руб.
E-mail
Пароль  
 Запомнить меня
Регистрация | Забыли пароль?
Журнал "Системный администратор"
Журнал «БИТ»
Наука и технологии
Подписка
Где купить
Авторам
Рекламодателям
Архив номеров
Контакты
   

  Опросы
  Статьи

Электронный документооборот  

5 способов повысить безопасность электронной подписи

Область применения технологий электронной подписи с каждым годом расширяется. Все больше задач

 Читать далее...

Рынок труда  

Системные администраторы по-прежнему востребованы и незаменимы

Системные администраторы, практически, есть везде. Порой их не видно и не слышно,

 Читать далее...

Учебные центры  

Карьерные мечты нужно воплощать! А мы поможем

Школа Bell Integrator открывает свои двери для всех, кто хочет освоить перспективную

 Читать далее...

Гость номера  

Дмитрий Галов: «Нельзя сказать, что люди становятся доверчивее, скорее эволюционирует ландшафт киберугроз»

Использование мобильных устройств растет. А вместе с ними быстро растет количество мобильных

 Читать далее...

Прошу слова  

Твердая рука в бархатной перчатке: принципы soft skills

Лауреат Нобелевской премии, специалист по рынку труда, профессор Лондонской школы экономики Кристофер

 Читать далее...

1001 и 1 книга  
19.03.2018г.
Просмотров: 9897
Комментарии: 0
Потоковая обработка данных

 Читать далее...

19.03.2018г.
Просмотров: 8108
Комментарии: 0
Релевантный поиск с использованием Elasticsearch и Solr

 Читать далее...

19.03.2018г.
Просмотров: 8211
Комментарии: 0
Конкурентное программирование на SCALA

 Читать далее...

19.03.2018г.
Просмотров: 5197
Комментарии: 0
Машинное обучение с использованием библиотеки Н2О

 Читать далее...

12.03.2018г.
Просмотров: 5880
Комментарии: 0
Особенности киберпреступлений в России: инструменты нападения и защита информации

 Читать далее...

Друзья сайта  

 Программное управление ADSI: WinNT

Архив номеров / 2004 / Выпуск №2 (15) / Программное управление ADSI: WinNT

Рубрика: Администрирование /  Продукты и решения

ИВАН КОРОБКО

Программное управление ADSI: WinNT

В предыдущей статье были рассмотрены теоретические аспекты построения Active Directory и проведен обзор доступных провайдеров, с помощью которых можно программно управлять Active Directory. Одним из таких провайдеров является WinNT, основы программирования которого будут рассмотрены в данной статье.

Объектная модель провайдера WinNT

Рассмотрим программное управление ADSI с помощью провайдера WinNT, с помощью которого осуществляется доступ к классам. Каждый класс содержит один или несколько подклассов. Объектная модель протокола WinNT, в которой перечислены только классы, приведена на рисунке 1.

Рисунок 1

Рисунок 1

Доступ к объектам по протоколу WinNT описывается запросом, имеющим вид:

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

Доступ к провайдеру WinNT осуществляется по одному из шаблонов:

1) Название класса содержится в запросе. С помощью функции GetObject формируется запрос, который включает в себя четыре параметра: название протокола – WinNT, имя домена – DomainName, рабочей станции – ComputerName, название объекта – ObjectName, название класса – ClassName. В этом случае доступ к подклассам осуществляется с помощью цикла For. На VBScript в общем виде запрос выглядит следующим образом:

Пример 1а)

Set obj=GetObject("WinNT://" & DomainName & "/" & ComputerName & "/" & ObjectName & "," &  ClassName).

For Each element In obj

element.value

Next

Параметры ComputerName и ObjectName могут отсутствовать в том случае, если осуществляется поиск объектов.

2) Подключение к классу с помощью фильтра. Метод по своей сути аналогичен предыдущему. Такой способ доступа к данным позволяет значительно увеличить скорость исполнения скрипта.

Пример 1б) 

Set obj = GetObject("WinNT://" & DomainName)

obj.Filter = Array("user")

For Each element In obj

element.value

Next

Приведем два примера: в первом примере будет осуществляться поиск объектов класса и вывод свойств этих объектов, во втором – чтение и вывод свойств заданного объекта. В первом примере с помощью скрипта на VBScript будут определены учетные записи пользователей домена и прочитаны их имена:

Пример 2а). Первый способ доступа к объектной модели

strDomain="MyDomain"

    Set Computer =GetObject("WinNT://" & strDomain & ",user")

           For Each User in Computer

           users_d=users_d & "  "& User.Name  & chr(13)

           Next

Wsh.Echo users_d

Пример 2б) Второй способ  доступа к объектной модели 

strDomain="MyDomain"

    Set Computer =GetObject("WinNT://" & strDomain)

    Computer.Filter = Array("user")

           For Each User in Computer

           users_d=users_d & "  "& User.Name  & chr(13)

           Next

Wsh.Echo users_d

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

Пример 3a). Первый способ  доступа к объектной модели

strDomain="MyDomain"

strUser="MyUserName"

    Set Computer =GetObject("WinNT://" & strDomain & "/" & strUser & ",user")

           users_d= User.Name & chr(13)

Wsh.Echo users_d

Пример 3б). Второй способ доступа к объектной модели

strDomain="MyDomain"

    Set Computer =GetObject("WinNT://" & strDomain)

    Computer.Filter = Array("user")

           For Each User in Computer

           users_d= User.Name  & chr(13)

           Next

Wsh.Echo users_d

Чтобы эффективно пользоваться объектной моделью, необходимо знать назначение классов, какие они включают в себя подклассы и какие параметры имеют подклассы. Назначение и название каждого класса приведено в таблице 1:

Таблица 1

objectClass Описание класса
Domain Класс предназначен для подключения к домену.
Явное использование домена экономит сетевой трафик.
Computer Класс предназначен для определения роли компбютера в домену, управления компьютера.
User Осуществляется управление пользователями: создание, удаление.
Управление свойствами пользователя: активизация пользователя, подключение домашнего каталога или сценария загрузки; управление параметрами, касающихся пароля.
Чтение характеристик пользователя: описание, расположение, телефон и др. параметры.
Group Управление группами: создание локальных/глобальных групп, преобразование типов групп, определение членства в группах и т.д.
FileShare Управление файловыми ресурсами: предоставление ресурсов пользователям.
PrintQueue Управление локальным принтером: перезагрузка принтера, его приостановка, возобновление работы; чтение полей принтер.
PrintJobs Подкласс класса PrintQueue, с помощью которого осуществляется управление очередью печати: установка приоритетов заданий, управление заданиями.

Соответствия классов и подклассов приведено в таблице 2:

Таблица 2

Название класса Описание класса
Namespace Контейнер верхнего уровня
Domain Доступные домены Windows
User Управление пользователем
Group  
UserGroupCollection Управление группами пользователей
GroupCollection Управление другими группами
Computer Определение параметров компьютера
PrintJob  
PrintJobsCollection Управление заданием
PrintQueue Управление принтером
Service  
FileService  
FileShare Управление предоставлением объектов в общее пользование
Resource Управление сервисами
Session Управление сессиями
User Управление локальными учетными записями пользователей
Group  
UserCollection Свойства локальных пользователей
GroupCollection Свойства локальных групп

Из объектной модели протокола WinNT видно, что в пространстве имен NameSpace существует всего два класса: Domain и Computer. Рассмотрим каждый из этих классов в отдельности.

Класс Domain

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

Класс Domain является верхним уровнем пространства имен, поэтому для определения доступных доменов в функции GetObject() ограничиваются название протокола. Необходимо помнить, что название протокола должно быть написано именно WinNT – в противном случае сценарий выдаст ошибку:

Пример 4

Set obj=GetObject("WinNT:")

    For Each element In obj

    temp=element.Name

    Next

MsgBox temp

Рисунок 2

Чтение параметров класса Domain

Класс Domain включает в себя восемь параметров. Все эти параметры задаются в групповых политиках, за исключением параметра Name. Описание параметров см. в Приложении.

При создании скрипта на VBScript необходимо помнить, что VBScript не преобразует типы данных автоматически, поэтому числовые данные необходимо преобразовывать в строковые с помощью функции cstr().

Пример 5. Чтение всех полей класса Computer

Set obj=GetObject("WinNT:")

    For Each element In obj

t1="Name: " + cstr(element.Name)+chr(13)

t2="MinPasswordLength: "+ cstr(element.MinPasswordLength)+chr(13)

t3="MinPasswordAge: " + cstr(element.MinPasswordAge)+chr(13)

t4="MaxBadPasswordsAllowed: "+ cstr(element.MaxBadPasswordsAllowed)+chr(13)

t5="AutoUnlockInterval: " + cstr(element.AutoUnlockInterval)+chr(13)

t6="LockoutObservationInterval: " + cstr(element.LockoutObservationInterval)

temp=temp+t1+t2+t3+t4+t5+t6+chr(13)+chr(13)

    Next

MsgBox temp

Рисунок 3

Значения MinPasswordAge и MaxPasswordAge указываются в групповых политиках в днях, поэтому необходим перевод в дни, для чего полученное число необходимо разделить на 86400; значения MinPasswordAge и LockoutObservationInterval указываются в групповых политиках в минутах, поэтому полученные значения необходимо разделить на 60.

Обновление параметров класса Domain

Установка новых параметров перечисленных значений осуществляется с помощью метода SetInfo.

Пример 6. Изменение значения минимальной длины пароля в домене (NewLenght=10)

    NewLenght=10

Set obj=GetObject("WinNT:")

    For Each element In obj

           element.MinPasswordLength= NewLenght

           obj.SetInfo

    temp ="NEW: MinPasswordLength: "+ cstr(element.MinPasswordLength)+chr(13)

    Next

      MsgBox temp

Перечисление объектов класса Domain

Просмотр содержимого контейнера осуществляется с помощью конструкции For в соответствии с приведенным ниже шаблоном. В качестве значения переменной Container может быть имя домена или компьютера:

Пример 7 

Container="Value"

Set obj=GetObject("WinNT://"& Container)

    For Each element In obj

    temp = temp + element.name + ";    "

    Next

MsgBox temp

Такой метод перечисления объектов будет возвращать все содержимое любой базы SAM – контроллера домена, сервера или рабочей станции.

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

Таблица 3

Объект Описание Объект Описание
User Учетная запись пользователя Group Все группы
Computer Учетная запись компьютера LocalGroup Локальная группа
Service Сервис GlobalGroup Глобальная группа

Пример 8:  Определение всех учетных записей пользователей, входящих в домен     

Set objDomain=GetObject("WinNT:")

    For Each domain_element In objDomain

    Domain_Name= domain_element.Name

    Next

Set obj=GetObject("WinNT://" & Domain_Name)

    obj.filter=array("user")

           For Each element In obj

           temp =temp+element.name+";    "

           Next

Создание, переименование и удаление объектов в домене

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

Создание объектов

Создание учетной записи пользователя осуществляется с помощью функции Create(). Приведем пример, в котором создается учетная запись пользователя с именем UserName. При создании скрипта манипуляции с паролем и другими параметрами учетной записи должны производиться, когда учетная запись существует, т.е. после применения метода: SetInfo.

Пример 9     

Set objDomain=GetObject("WinNT:")

    For Each domain_element In objDomain

    Domain_Name= domain_element.Name

    Next

           Set obj=GetObject("WinNT://" & Domain_Name)

                 NewUser="UserName"

                 Set CU=obj.Create("User",NewUser)

                 CU.SetInfo

Создание учетной записи группы отличается тем, что необходимо указать тип группы с помощью функции Put(). Локальной группе соответствует значение «4», глобальной – «2».

Пример 10. Создания локальной группы с именем GroupName

Set objDomain=GetObject("WinNT:")

    For Each domain_element In objDomain

    Domain_Name= domain_element.Name

    Next

           Set obj=GetObject("WinNT://" & Domain_Name)

                 NewGroup="GroupName"

                 Set CG=obj.Create("Group",NewGroup)

                 CG.Put "groupType", 4

                 CG.SetInfo

Создание учетной записи компьютера аналогично созданию учетной записи пользователя, за исключением следующего:

  • объект должен быть создан с использованием класса computer;
  • у объекта должен быть установлен пользовательский флаг Ошибка! Недопустимый объект гиперссылки. (см. раздел «Манипулирование пользовательскими флагами функцией UserFlags»);
  • начальный пароль учетной записи должен соответствовать имени компьютера, введенного строчными буквами. Результата добиваются с помощью функции LCase().

Пример 11. Создания учетной записи компьютера с именем ComputerName 

Set objDomain=GetObject("WinNT: ")

    For Each domain_element In objDomain

    Domain_Name= domain_element.Name

    Next

           Set obj=GetObject("WinNT://" & Domain_Name)

                 NewComputer="ComputerName"

                 Set CC=obj.Create("Computer", UCase(NewComputer))

           CC.SetInfo

Set CAccount= GetObject("WinNT://" & ї

    Domain_Name&"/"& NewComputer&"$,user")

CAccount.Put "UserFlags", (CAccount.Get("UserFlags") Or &H1000)

           CAccount.SetPassword(LCase(NewComputer))

           CAccount.SetInfo

Удаление объектов

Все три типа объектов удаляются, используя метод Delete. Приведем шаблон, в котором переменная ClassName может принимать значение computer, user, group; NameOfObject – имя удаляемого объекта:

Пример 12

Set objDomain=GetObject("WinNT: ")

    For Each domain_element In objDomain

    Domain_Name= domain_element.Name

    Next

           Set obj=GetObject("WinNT://" & Domain_Name)

                 ClassName="____"

                 NameOfObject="____"

                 Set CC=obj.Delete (ClassName, NameOfObject)

Обратите внимание, что объект удаляется немедленно и использовать метод SetInfo не нужно.

Переименование объектов

Среди трех ранее перечисленных объектов переименованию поддается только учетная запись пользователя. Переименование учетной записи осуществляется с помощью функции MoveHere():

Пример 13

Set objDomain=GetObject("WinNT: ")

    For Each domain_element In objDomain

    Domain_Name= domain_element.Name

    Next

           OldUserName="____"

           NewUserName="____"

           Set obj=GetObject("WinNT://" ї

                 & Domain_Name&"/"& OldUserName&",user")

      obj.MoveHere(User.AdsPath, NewUserName)

      obj.Nothing

Подкласс User

Учетные записи пользователей домена содержатся в подклассе User. Подкласс включает в себя более 20 параметров, некоторые из которых не поддерживаются Windows 2k. Описание параметров см. в Приложении. Параметры подкласса изначально задаются в групповых политиках.

Пример 14. Чтения параметров подкласса User 

Set obj=GetObject("WinNT:")

    For Each str In obj

    DomainName=str.Name

    Next

Set UserName="Value"

Set element=GetObject("WinNT://" & DomainName & "/"& UserName)

u1="FullName: "+ cstr(element.FullName)+chr(13)

u2="UserFlags: "+ cstr(element.UserFlags)+chr(13)

u3="LoginScript: "+ cstr(element.LoginScript)+chr(13)

u4="MaxBadPasswordsAllowed: "+ cstr(element.MaxBadPasswordsAllowed)+chr(13)

u5="PasswordHistoryLength: "+ cstr(element.PasswordHistoryLength)+chr(13)

u6="AutoUnlockInterval: "+ cstr(element.AutoUnlockInterval)+chr(13)

u7="PasswordAge: "+ cstr(element.PasswordAge)+chr(13)

u8="PasswordExpired: "+ cstr(element.PasswordExpired)+chr(13)

temp=""

temp=u1+u2+u3

Манипулирование пользовательскими флагами функцией UserFlags

Для просмотра и изменения состояния пользовательских флагов в базе SAM применяются методы Get() и Put(), соответственно. Ниже приведены константы и их описание. Константы представляют собой шестнадцатеричные значения флагов:

Таблица 4

Название Значение Описание
Ошибка! Недопустимый объект гиперссылки. 0X0001 Управление исполнения сценария загрузки
Ошибка! Недопустимый объект гиперссылки. 0X0002 Управление флагом «Account is Disable»
Ошибка! Недопустимый объект гиперссылки. 0X0003 Требуется домашний каталог
Ошибка! Недопустимый объект гиперссылки. 0X0010 Управление блокировкой учетной записи
Ошибка! Недопустимый объект гиперссылки. 0X0020 Не требуется пароль для регистрации в сети и на локальном компьютере
Ошибка! Недопустимый объект гиперссылки. 0X0040 Управление флагом «User Cannot Change Password»
Ошибка! Недопустимый объект гиперссылки. 0X0080 Разрешить пользователя отправлять зашифрованный пароль
Ошибка! Недопустимый объект гиперссылки. 0X0100 Этот флаг обеспечивает пользователям доступ пользователя в текущем домене, но не дают им права доступа в домены, которые имеют доверительные отношения с текущим доменом. Для данного домена учетная запись становится локальной.
Ошибка! Недопустимый объект гиперссылки. 0X0200 Типичная учетная запись пользователя
Ошибка! Недопустимый объект гиперссылки. 0X0800 Флаг, противоположный флагу Ошибка! Недопустимый объект гиперссылки. Делает учетную запись глобальной
Ошибка! Недопустимый объект гиперссылки. 0X1000 Управление членством в домене рабочей станции
Ошибка! Недопустимый объект гиперссылки. 0X2000 Учетная запись компьютера BDC
Ошибка! Недопустимый объект гиперссылки. 0X10000 Управление флагом «Password Never Expires»
Ошибка! Недопустимый объект гиперссылки. 0X20000 Учетная запись MNS Logon
Ошибка! Недопустимый объект гиперссылки. 0X40000 Необходимо использовать Smart-карту для регистрации пользователя в сети
Ошибка! Недопустимый объект гиперссылки. 0X80000 Установка делигирования
Ошибка! Недопустимый объект гиперссылки. 0X100000 Флаг, противоположный Ошибка! Недопустимый объект гиперссылки.

Обратите внимание, что в таблице нет флага для параметра «User Must Change Password at Next Logon». Для установки флага следует менять значение свойства PasswordExpired. О том, как это сделать, речь пойдет позже. Для просмотра и изменения шестнадцатеричных флагов используют операторы Or, Xor и And следующим образом:

  • оператор Or – для начальной установки бита. На практике используется в случае создания новой учетной записи пользователя;
  • оператор Xor – для переключения статуса флага. Флаг может быть активизирован и дезактивирован;
  • оператор And – для просмотра значения, хранящегося в базе SAM.

Для просмотра значения флага используется функция Get(). Рассмотрим пример, в котором прочитаем значение параметра ADS_UF_DONTEXPIREPASSWD – управление флагом «Password Never Expires»:

Пример 15 

Set obj=GetObject("WinNT:")

           For Each str In obj

           DomainName=str.Name

           Next

Set UserName="Value"

temp=""

    Set element=GetObject("WinNT://" & DomainName & "/"& UserName)

           flag=element.Get("UserFlags")

           if (flag AnD &H10000)<>0 then

                 temp="Флаг установлен"

           else

                 temp="Флаг не установлен"

           end if

MsgBox temp

Для изменения значения флага используется функция Put(), которая имеет следующий формат: value.Put «UserFlags» String. Рассмотрим использование данной функции на примере, в котором изменим значение параметра на противоположное ADS_UF_DONTEXPIREPASSWD. Для того чтобы изменения вступили в силу, необходимо использовать метод value.SetInfo.

Пример 16 

Set obj=GetObject("WinNT:")

           For Each str In obj

           DomainName=str.Name

           Next

ADS_UF_DONTEXPIREPASSWD=&H0040

Set UserName="Value"

    Set element=GetObject("WinNT://" & DomainName & "/"& UserName)

element.put "userFlags", element.Get("UserFlags") Xor ADS_UF_DONTEXPIREPASSWD

element.setinfo

    MsgBox element.get("UserFlags")

Подкласс Group

Подкласс Group включает в себя 2 параметра: описание и SID группы. Чтение этих параметров происходит аналогичным способом, описанным в предыдущем разделе. Изменение описание группы осуществляется использованием метода SetInfo.

Взаимосвязь учетных записей пользователей и групп

В этом параграфе будут рассмотрены вопросы добавления и исключения учетной записи пользователя из группы членства пользователей в группе, принадлежность пользователя к группам.

1) Добавление пользователя в группу осуществляется с помощью функции Add(), для удаления пользователя – функция Remove(). При использовнии метода Add() чтобы изменения вступили в силу, необходимо использовать метод SetInfo. Удаление учетной записи пользователя из группы происходит сразу после вызова метода Remove.

Пример 17. Добавление учетной записи Value_Name в группу Value_Group 

    Set obj=GetObject("WinNT:")

                 For Each str In obj

                 DomainName=str.Name

                 Next

    Set UserName="Value_Name"

    Set GroupName="Value_Group"

Set element_user=GetObject("WinNT://" & DomainName & "/"& UserName & ", user")

Set element_group=GetObject("WinNT://" & DomainName & "/"& GroupName & ", group")

    element_group.Add(element_user.ADsPath)

    element_group.SetInfo

Для удаления учетной записи из группы в приведенном примере последние две строки необходимо заменить на строку element_group.Remove(element_user.ADsPath).

2) Для перечисления всех пользователей группы, например, группы GroupName, используют свойство Members:

Пример 18

    Set obj=GetObject("WinNT:")

                 For Each str In obj

                 DomainName=str.Name

                 Next

Set GroupName="Value_Group"

Set element_group=GetObject("WinNT://" & DomainName & "/"& GroupName & ", group")

    For each obj inGroup.Members

    temp=temp+Member.Name

    Next

MsgBox temp

3) Просмотр списка групп, к которой принадлежит пользователь. Использующийся в данном примере метод ISMember возвращает значение типа Boolean, т.е. True/False. Сценарий условно можно разделить на три части – определение текущего домена, определение списка групп в домене и проверка членства в группе.

Пример 19

Set objDomain=GetObject("WinNT: ")

    For Each domain_element In objDomain

    Domain_Name= domain_element.Name

    Next

UserName="Administrator"

Set element_user=GetObject("WinNT://" & DomainName & "/"& UserName)

    Set obj=GetObject("WinNT://" & DomainName)

    obj.filter=array("group")

           For Each element In obj

           Set element_group=GetObject("WinNT://" & DomainName& "/"& element.name )

                        if element_group.IsMember (element_user.ADsPath)="True" then

                               temp=temp+ element.name & chr(13)

                        end if

           Next

    MsgBox temp

Убрав из данного примера конструкцию For Each element In obj можно, задав имя группы пользователя в явном виде, определять, является ли конкретный пользователь членом конкретной группы. Задачу, которая была решена в примере, можно решить иным способом: необходимо получить доступ к учетной записи пользователя и в цикле For в качестве имени массива указать свойство ArrayName.Groups:

Пример 20

           Set obj=GhpLaserJetObject("WinNT://" & DomainName & "/"& UserName  )

                 For Each element In obj.Groups

                 temp = temp + element.name + chr(13)

                        Next

Класс Computer

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

Подклассы PrintQueue, PrintJob, PrintJobsCollection

Управление принтерами и очередями принтеров

Провайдер WinNT создавался для доступа к объектам для семейства Microsoft Windows NT 4.0, поэтому принтеры рассматриваются как локальные устройства, что позволяет осуществлять программное управление их очередями печати. В классе Computer существует два подкласса – PrintQueue и PrintJob. Для доступа к принтеру необходимо, чтобы устройство было предоставлено в общее пользование.

Список папок и устройств, предоставленных в общее пользование в домене, включая скрытые папки, можно получить, используя следующий код:

Пример 21 

    On error Resume Next

Set objDomain=GetObject("WinNT:")

For Each domain_element In objDomain

Domain_Name= domain_element.Name

Next

    Set obj=GetObject("WinNT://" Domain_Name &" /LanmanServer,fileservice")

    For Each element In obj

    temp=temp+element.Name+chr(13)

    msgbox temp

Подключение к принтеру осуществляется с помощью протокола GetObject() по доступному сетевому имени. Еще раз хочу обратить внимание, что, хотя подключение к принтеру осуществляется как к сетевому устройству, он рассматривается как локальное устройство.

Приведем пример подключения к принтеру с помощью протокола WinNT и чтение свойства Name принтера:

Set obj=GetObject(«WinNT://PCName/PrinterShareName»

Описание объектной модели подклассов PrintQueue и PrintJob см. в Приложении.

Управление принтером

Управление принтером также осуществляется с помощью элементов массива объекта, вызванного с помощью функции GetObject(). Элементы массива содержат не только строки и массивы, но и команды:

Таблица 5

Элемент Тип данных Описание элемента
Pause Команда Приостановить работу принтера
Purge Команда Удалить все задания из очереди печати и переинициализировать принтер.
Resume Команда Восстановить работу принтера

Пример 22. Использование одной из команд 

Set pq = GetObject("WinNT://" & server_name & "/" & shares_enum)

pq.purge

Просмотр состояния принтера

Чтение состояния принтера происходит с помощью функции Status. После получения значения функцией Status требуется расшифровка значения.

Следует отметить, алгоритм просмотра состояния пользователя очень похож на алгоритм определения состояния пользователя (см. примеры 14,15; таблицу 4). Константы состояния очереди печати приведены в таблице 6:

Таблица 6

Название Значение Описание
ADS_PRINTER_READY 0x0 Устройство готово к печати
ADS_PRINTER_PAUSED 0x1 Пауза
ADS_PRINTER_PENDING_DELETION 0x2 Удаление задания
ADS_PRINTER_ERROR 0x3 Ошибка печати
ADS_PRINTER_PAPER_JAM 0x4 Замятие бумаги
ADS_PRINTER_PAPER_OUT 0x5 Отсутствие бумаги
ADS_PRINTER_MANUAL_FEED 0x6 Ручная подача бумаги
ADS_PRINTER_PAPER_PROBLEM 0x7 Проблема с бумагой
ADS_PRINTER_OFFLINE 0x8 Устройство выключено
ADS_PRINTER_IO_ACTIVE 0x100 Загрузка задания в очередь печати
ADS_PRINTER_BUSY 0x200 Устройство занято
ADS_PRINTER_PRINTING 0x400 Идет печать
ADS_PRINTER_OUTPUT_BIN_FULL 0x800 Приемный лоток полон
ADS_PRINTER_NOT_AVAILABLE 0x1000 Устройство недоступно
ADS_PRINTER_WAITING 0x2000 Устройство в состоянии ожидания
ADS_PRINTER_PROCESSING 0x4000 Просчет задания
ADS_PRINTER_INITIALIZING 0x8000 Инициализация устройства
ADS_PRINTER_WARMING_UP 0x10000 Загрузка устройства после включения
ADS_PRINTER_TONER_LOW 0x20000 Мало тонера
ADS_PRINTER_NO_TONER 0x40000 Отсутствует тонер
ADS_PRINTER_PAGE_PUNT 0x80000 Проблемы с бумагой
ADS_PRINTER_USER_INTERVENTION 0x100000 Требуется вмешательство пользователя
ADS_PRINTER_OUT_OF_MEMORY 0x200000 Переполнение памяти
ADS_PRINTER_DOOR_OPEN 0x400000 Крышка устройства открыта
ADS_PRINTER_SERVER_UNKNOWN 0x800000 Неизвестный сервер
ADS_PRINTER_POWER_SAVE 0x1000000 Устройство в состоянии энергосбережения

Пример 24     

Set objDomain=GetObject("WinNT:")

For Each domain_element In objDomain 

Domain_Name= domain_element.Name 

Next

    Set PC_Name="_______"

    Set Share_Name="_______"

Set element=GetObject("WinNT://" & Domain_Name &"/" & PC_Name &"/" & Share_Name)

    flag=element.status

    MsgBox flag

Значение переменной flag будет выдано в десятичном виде, поэтому его необходимо перевести в шестнадцатеричную систему.

Чтение свойств заданий в очереди принтера

Очередь печати представляет собой массив, содержащий в себе задания, которые находятся в очереди печати на момент извлечения из нее данных с помощью протокола WinNT. Список и описание свойств параметров очереди см. в Приложении раздел PrintJob.

Пример 25. Чтения полей очереди

Set objDomain=GetObject("WinNT: ")

    For Each domain_element In objDomain

    Domain_Name= domain_element.Name

    Next

Shares_Name="Value"

    Set pq = GetObject("WinNT://" & Domain_Name & "/" & Shares_Name)

    For Each printJob In pq.PrintJobs

status_pre=printJob.status

    select case status_pre

           case "0" status_="Нормально"

           case "1" status_="Пауза"

           case "18" status_="Ошибка"

    end select

summary = summary & ”Номер докумета: ” & number_docum & chr(13) & chr(13) & ”Статус: ” & status_pre & chr(13) & ”Приоритет: ”

Пользователь: ” & printJob.User & chr(13) & ”Всего стр. ” & printJob.TotalPages

& chr(13) & ”Размер, (Mb) ” & round(printJob.Size/1000000,2) & chr(13) & ”Статус: ” & status_pre & chr(13) & chr(13)

    Next

Управление очередью печати

Подкласс PrintJobsCollection: управление очередью осуществляется тем же способом, что и управление принтером. Существует три команды, которые могут быть использованы для управления документом, находящимся в очереди печати:

Таблица 7

Элемент Тип данных Описание элемента
Pause Команда Приостановить печать задания
Remove Команда Удалить задание из очереди печати
Resume Команда Восстановить печать задания

Пример, в котором удаляется второе задание из очереди печати. Если задание № 2 отсутствует, то ошибка обрабатывается с помощью выражения «On Error Resume Next»:

Пример 26

On Error Resume Next

Set objDomain=GetObject("WinNT: ")

    For Each domain_element In objDomain

    Domain_Name= domain_element.Name

    Next

Shares_Name="Value"

Set pq = GetObject("WinNT://" & Domain_Name & "/" & Shares_Name)

For Each printJob In pq.PrintJobs

      If (number_docum=2) then

      printJob.remove

      end if

Next

Подклассы FileService и FileShare

Подклассы FileService и FileShare являются дочерними для подкласса Service, причем FileShare является дочерним для FileService. Поскольку эти два подкласса тесно связаны между собой, то их необходимо рассматривать вместе. Используя эти классы, программно управляют безопасностью и предоставления доступа к файлам и каталогам.

Для управления совместно используемыми ресурсами используется контейнер LanmanServer. Пример соединения с контейнером LanmanServer приведен в примере 21.

Совместно используемыми ресурсами могут быть принтеры и папки с файлами. Управление принтерами было рассмотрено ранее. В этом разделе речь пойдет именно управлении файлами и папками.

Рассмотрим следующие ключевые вопросы, касающиеся совместно используемых ресурсов: чтение свойств ресурсов, создание и удаление совместно используемых ресурсов.

Чтение свойств совместно используемых ресурсов

Чтение свойств и назначение новых значений параметров осуществляется ранее описанным методом. Приведем пример, в котором читается и выводится на экран описание ресурса, затем происходит смена описания ресурса:

Пример 27

Set objDomain=GetObject("WinNT:")

For Each domain_element In objDomain

Domain_Name= domain_element.Name

Next

    Set PC_Name="_______"

    Set Share_Name="_______"

 Set New_Description_Name="_______"

    Set element=GetObject("WinNT://" & Domain_Name &"/" & PC_Name &"/LanmanServer/" & Share_Name)

temp="Old Description: " + Element.Description+chr(13)

    Element.Description = New_Description_Name

    Element.SetInfo

temp="New Description " + Element.Description

msgbox temp  

Программное создание и удаление совместно используемого ресурса

Создание совместно используемого ресурса осуществляется с помощью метода Create. В свойствах метода указывается тип создаваемого ресурса, в данном случае fileshare, и название ресурса (ShareName). Метод Create обязательно сопровождается методом Path, с помощью которого задается путь к ресурсу и методом SetInfo, который сохраняет сделанные изменения. Приведем пример, в котором предоставим в общее пользование папку, локальный путь к которой «c:folder001». Сетевой путь папки должен быть «1000pcShare1». Описание папки – «Shared Folder #1»:

Пример 28. Создание ресурса 

Set objDomain=GetObject("WinNT:")

For Each domain_element In objDomain

Domain_Name= domain_element.Name

Next

    Set PC_Name="1000pc"

    Set Share_Name="Share1"

    Set Folder_Path="c:Folder1"

   Set Description_Name="Shared Folder #1"    

Set object=GetObject("WinNT://" & Domain_Name &"/" & PC_Name &"/LanmanServer")

Set element=object.Create("fileshare", Share_Name)

element.Path= Folder_Path

element.Description= Description_Name

element.MaxUserCount =10

element.SetInfo

Для удаления используемого ресурса вместо метода Create используют метод Delete. Изменения вступают в силу немедленно:

Пример 29. Удаление ресурса 

Set objDomain=GetObject("WinNT:")

For Each domain_element In objDomain

Domain_Name= domain_element.Name

Next

    Set PC_Name="1000pc"

    Set Share_Name="Share1"

    Set Folder_Path="c:Folder1"

 Set Description_Name="Shared Folder #1"

Set object=GetObject("WinNT://" & Domain_Name &"/" & PC_Name &"/LanmanServer")

Call object.Delete("fileshare", Share_Name)

Подкласс Service

С помощью данного подкласса осуществляется управление различными службами. С его помощью могут быть осуществлены следующие действия, касающиеся служб: перечисление служб, установленных на локальном или удаленном компьютере; чтение свойств выбранной службы; управление службой.

Перечисление служб на выбранном компьютере

Перечисление служб на рабочей станции осуществляется с помощью фильтра. Пример использования фильтра см. в разделе «Объектная модель провайдера WinNT»; примеры 2б) и 3б); в таблице 2 перечислены все возможные фильтры.

Чтение свойств служб на выбранном компьютере

Перечисление служб на рабочей станции осуществляется с помощью фильтра.

Связывание служб на выбранном компьютере

Понятие «связывание служб» лучше всего продемонстрировать на реальном примере: представьте, что служба 1 связана, т.е. является зависимой от службы 2. Это обозначает, что при остановке службы 1 появится сообщение о необходимости остановки службы 2. Связанность служб характеризуется свойством Dependencies. Свойство Dependencies является массивом, см. Приложение.

Вторым этапом является установка новой зависимой службы:

Пример 30. Связывание служб

    On Error Resume Next     

Set objDomain=GetObject("WinNT:")

For Each domain_element In objDomain

Domain_Name= domain_element.Name 

Next

    Set Service_Name="______"

    Set PC_Name="______"     

Set object=GetObject("WinNT://" & Domain_Name &"/" & PC_Name &",Computer")

    Set Service=object.GetObject("service", Service_Name)

    Flag1=0

    Flag2=0

    Dim New_Array()     " Объявление пустого массива

    Set Dependency_Name="_______"

    If IsArray(Service.Dependencies)=True Then

    For Each obj in Service.Dependencies

    " Определение верхней границы массива  Dependencies

    i=Ubound(New_Array)+1

    " Переопределение размера массива New_Arrray

    ReDim Preserve New_Array (i)

    New_Array(i)=obj

           If obj="" then

                        Flag1=1

           end if

                 If  obj= Dependency_Name then

                        Flag2=1

           end if

    if Flag1=1 then

                        Service.dependencies = Array(Dependency_Name)

                               Service.SetInfo

    Else

           If  Flag2<>1

                               i=Ubound(New_Array)+1

                               ReDim Preserve New_Array (i)

                               New_Array(i)= Dependency_Name

                               Service.dependencies= New_Array

                               Service.SetInfo

           End if

    End if

    Else

           If Service.dependencies <> Dependency_Name then

                        Service.dependencies = array(Service.dependencies, Dependency_Name)

                        Service.SetInfo

           End if

    End if

Заключение

Рассмотрев объектную модель провайдера WinNT; изучив на простых примерах основные принципы программирования ADSI с помощью этого провайдера; методы, поддерживаемые провайдером WinNT, такие как SetInfo, Create, Delete и т. д., можно приступать к программированию с помощью провайдера WinNT. Однако необходимо оговориться: провайдер WinNT изначально создавался для Windows NT 4.0. В этом есть свои плюсы и свои минусы. По сравнению с программированием через провайдера LDAP, программирование через WinNT содержит гораздо меньше программного кода. Поэтому программировать через провайдер WinNT проще. Принтеры рассматриваются как локальные, что имеет свои плюсы и минусы. Изучив объектную модель протокола LDAP, можно убедиться в том, что сочетание программирования через оба провайдера обеспечит наилучший результат: максимальный функционал при минимизации кода скрипта.

Приложение. Объектная модель WinNT

objectClass Domain

Поддерживаемые свойства Тип данных Описание
AutoUnlockInterval Число Интервал в сек, после которого учетная запись автоматически разблокируется, если она была заблокирована. Для установки бесконечного времени ожидания устанавливается значение равное «-1»
LockoutObservationInterval Число Интервал в сек, в течении которого контроллер домена хранит число неверных попыток регистрации в домене
MaxBadPasswordsAllowed Число Максимальное количество неправильного ввода пароля, после которого блокируется учетная запись. Значение параметра должно быть в промежутке от 0 до 999. Для снятия ограничения на длину пароля значение параметра должно быть «-1»
MaxPasswordAge Число Срок действия пароля. Пароль имеет неограниченный срок действия, если значение параметра равно «-1»
MinPasswordAge Число Временной интервал в сек, в течении которого пользователь не сможет сменить свой пароль.
MinPasswordLength Число Минимальная длина пароля. Если необходимо разрешить использовать пустые пароли – установите значение равно «-1»
Name Строка Краткое имя домена
PasswordHistoryLength Число Число паролей, которое хранится контроллером домена для каждого пользователя. Данное свойство предотвращает повторное использование паролей. Для деактивации хранения истории паролей установите значение параметра равным «-1»

objectClass User

Поддерживаемые свойства Тип данных Описание
AccountExpirationDate Дата Не поддерживается Windows 2k.
AutoUnlockInterval Число Интервал в сек, после которого учетная запись автоматически разблокируется, если она была заблокирована. Для установки бесконечного времени ожидания устанавливается значение равное «-1»
BadPasswordAttempts Число Количество неправильно введенных паролей в течении времени указанного в параметре  LockoutObservationInterval
nbsp; Строка Описание пользователя. В Windiws 2k как правило используется другие поля, доступные только через протокол LDAP
FullName Строка Полное имя пользователя. Имеет формат Second Name, First Name
HomeDirDrive Буква Буква домашнего каталога. Формат: буква:
HomeDirectory Строка Путь в формате UNC к домашнему каталогу в виде ServerFolder
UserFlags Число Флаг пользователя, с помощью которого определяется
LockoutObservationInterval Число Интервал в сек, в течении которого контроллер домена хранит число неверных попыток регистрации в домене
LoginHours Массив Не поддерживается Windows 2k.
LastLogin Дата Дата и время последней регистрации пользователя в сети
LastLogoff Дата Не поддерживается Windows 2k.
  Строка Сценарий загрузки
LoginWorkstations Строка Не поддерживается Windows 2k.
MinPasswordAge Строка Временной интервал в сек, в течении которого пользователь не сможет сменить свой пароль.
MinPasswordLength Строка Минимальная длина пароля. Если необходимо разрешить использовать пустые пароли – установите значение равно «-1»
MaxBadPasswordsAllowed Число Максимальное количество неправильного ввода пароля, после которого блокируется учетная запись. Значение параметра должно быть в промежутке от 0 до 999. Для снятия ограничения на длину пароля значение параметра должно быть «-1»
MaxLogins Строка Не поддерживается Windows 2k.
MaxPasswordAge   Срок действия пароля. Пароль имеет неограниченный срок действия, если значение параметра равно «-1»
ObjectSid Строка Не поддерживается Windows 2k.
PasswordAge Число Время в секундах с момента смены пароля.
PasswordExpirationDate Дата Дата и время окончания действия пароля
PasswordExpired Число Принимает значение 0/1. 0
PasswordHistoryLength nbsp; Число паролей, которое хранится контроллером домена для каждого пользователя. Данное свойство предотвращает повторное использование паролей. Для деактивации хранения истории паролей установите значение параметра равным «-1»
PrimaryGroupID Число ID номер основной группы пользователя
Profile Строка Содержит путь, где хранится профиль в UNC-формате

objectClass Group

Поддерживаемые свойства Тип данных Описание
  Строка Описание группы
objectSid Строка SID группы

objectClass Computer

Поддерживаемые свойства Тип данных Описание
Division Строка Название организации
Owner Строка Владелец компьютера
OperatingSystem Строка Тип операционной системы
OperatingSystemVersion Строка Версия операционной системы
Processor Строка Тип процессора
ProcessorCount Строка Количество процессоров

objectClass PrintQueue

Поддерживаемые свойства Тип данных Описание
PrinterPath Строка Путь к принтеру в формате UNC
PrinterName Строка Название принтера
Model Строка Модель принтера
Datatype Строка Тип данных
PrintProcessor Строка Процессор печати
PrintDevices Строка Порт печати (USB, LPT, IP_xxx.xxx.xxx.xxx)
  Строка Описание
HostComputer Строка Компьютер, к которому подключен принтер
Location Строка Размещение устройства
StartTime Строка Время начала печати
UntilTime Строка Время окончания печати
DefaultJobPriority Число Приоритет, присеваемый документу при постановке в очередь печати
JobCount Число Количество заданий в очереди печати
Priority Число Приоритет задания
BannerPage Строка Путь к файлу, используемому для отделения заданий печати

objectClass PrintJob

Поддерживаемые свойства Тип данных Описание
HostPrintQueue Строка Имя принтера (ShareName)
User Строка Имя учетной записи пользователя, пославшего задание на печать
TimeSubmitted Число Общее время печати страниц
TotalPages Число Количество страниц в задании
Size Число Размер задания
  Строка Описание задания
Priority Число Приоритет задания
StartTime Число Время начала печати задания
UntilTime Число Время окончания печати задания
Notify Строка Идентификатор пользователя, по которому будет отправлено уведомление об окончании печати
TimeElapsed Число Время, оставшееся до окончания печати
PagesPrinted Число Количество уже отпечатанных страниц задания

objectClass FileService

Поддерживаемые свойства Тип данных Описание
HostComputer Строка Название рабочей станции
DisplayName Строка Имя ресурса
Version Строка Версия
Path Строка Путь в формате UNC
nbsp; Строка Описание
MaxUserCount Число Максимальное количество одновременно подключенных пользователей

objectClass FileShare

Поддерживаемые свойства Тип данных Описание
CurrentUserCount Строка Количество пользователей, использующих ресурс в настоящее время
  Строка Описание
HostComputer Строка Название рабочей станции, на которой расположен ресурс, предоставленный в общее пользование
Path Строка Путь в формате UNC
MaxUserCount Число Максимальное количество одновременно подключенных пользователей

objectClass Service

Поддерживаемые свойства Тип данных Описание
HostComputer Строка Компьютер, на котором запущен сервис
LoadOrderGroup Строка  
ServiceAccountName Строка Учетная запись названия сервиса
Dependencies Массив Связывание служб
StartType Строка Тип запуска службы
ServiceType Строка Тип сервиса
DisplayName Строка Показываемое имя сервиса
Path Строка Путь к сервису
ErrorControl Строка Контроль ошибок

Комментарии
 
  05.09.2011 - 01:04 |  Сергей

Хорошая статья, - спсаибо

Добавить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

               Copyright © Системный администратор

Яндекс.Метрика
Tel.: (499) 277-12-41
Fax: (499) 277-12-45
E-mail: sa@samag.ru