Рубрика:
Администрирование /
Продукты и решения
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
ИВАН КОРОБКО
Программное управление ADSI: WinNT
В предыдущей статье были рассмотрены теоретические аспекты построения Active Directory и проведен обзор доступных провайдеров, с помощью которых можно программно управлять Active Directory. Одним из таких провайдеров является WinNT, основы программирования которого будут рассмотрены в данной статье.
Объектная модель провайдера WinNT
Рассмотрим программное управление ADSI с помощью провайдера WinNT, с помощью которого осуществляется доступ к классам. Каждый класс содержит один или несколько подклассов. Объектная модель протокола WinNT, в которой перечислены только классы, приведена на рисунке 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
Чтение параметров класса 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
Значения 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 |
Строка |
Контроль ошибок |
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|