Книга
Книга
СЦЕНАРИИ ADSI
WINDOWS NT /2000
ADSI SCRIPTING FORSYSTEMADMINISTRATION
Thomas Eck
СЦЕНАРИИ ADSI
Томас Экк
Издательский дом “Вильямс”Москва • Санкт-Петербург
2000
ББК 32.973.26-018.2я75
Э35
УДК 681.3.07
Издательский дом “Вильямс”
По общим вопросам обращайтесь в Издательский дом “Вильямс”по адресу: info@williamspublishing.com, http://www.williamspublishing.com
Экк, Томас.
Э35 Сценарии ADSI для системного администрирования Windows NT/2000. : Пер. с англ. : Уч. пос. — М. : Издательский дом “Вильямс”, 2000. — 576 с. : ил. — Парал. тит. англ.
ISBN 5-8459-0106-5 (рус.)
В отличие от других книг, здесь вы не найдете подробного описания теоретических основ используемой технологии. Главное внимание уделяется фрагментам кода, что поможет сохранить ваше время. В них приводится код автоматизации ■ . большинства повседневных задач администратора. Книга в основном предназначена для подготовленных специалистов — системных администраторов или разработчиков приложений. Менеджеру информационных технологий книга поможет оценить перспективы использования программного администрирования при определении стратегий развития компании или решении проблем клиентов.
Книга предназначена для пользователей высокой квалификации.
'ББК 32.973.26-018.2я75
Все названия программных продуктов являются зарегистрированными торговыми марками соответствующих фирм.
Никакая часть настоящего издания ни в каких целях не может бкпь воспроизведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения издательства MacMillan Technical Publishing.
Authorized translation from the English language edition published by MacMillan Technical Publishing, Copyright © 2000
All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher.
Russian language edition published by Williams Publishing House according to the Agreement with R&I Enterprises International, Copyright © 2000
ISBN 5-8459-0106-5 (pyc.)ISBN 1-57870-219-4 (англ.)ISBN 5-8459-0106-5 (pyc.)ISBN 1-57870-219-4 (англ.)© Издательский доМ “Вильямс”, 2000
ISBN 5-8459-0106-5 (pyc.)
ISBN 1-57870-219-4 (англ.)
ISBN 5-8459-0106-5 (pyc.)
ISBN 1-57870-219-4 (англ.)
© MacMillan Technical Publishing, 2000
Оглавление
Часть I. Подготовка к программному администрированию19
Обзор интерфейса службы активного каталога20
Основы многоуровневой разработки32
Часть II. Исследование провайдеров ADSL Windows NT49
Методы перечисления контейнера и программное управление политикой учетных записей домена50
Программное управление учетной записью пользователя72
Программное управление группойПО
Программное управление компьютером и службами122
Программное управление файловыми ресурсами и ресурсами печати147
Часть III. Исследование провайдеров ADSL* IIS181
Программное управление метабазой IIS182
Программное управление Web-узлом229
Программное управление FTP-узлом295
Часть IV. Исследование провайдеров ADSL* LDAP329
Программное управление инфраструктурами LDAP330
Программное управление Active Directory Windows 2000354
Часть V. Приложения'393
Справочник по коду VBScript394
Б. Справочник по программированию ADSI 2.5■486
Дополнительные источники информации565
Предметный указатель569
Содержание
Об авторе15
Благодарности17
Для кого предназначена эта книга18
Требования18
Часть I. Подготовка к программному администрированию19
Обзор интерфейса службы активного каталога20
Манипулирование абстракциями пространства имен ADSI22
Технология абстракции22
Производительность ADSI и API поставщика пространства имен24
Практическое использование ADSI24
Сокрытие процесса документооборота24
Применение стандартов присвоения имен25
Автоматизация управления системой25
Кэширование свойств26
Поиск в пространстве имен28
Объекты безопасности28
Поддержка интерфейса28
Применение теории: переход от Windows NT 4.0 к Windows 2000
с помощью ADSI30
Резюме31
Основы многоуровневой разработки32
Почему Visual Basic32
Гипы данных Visual Basic определяются в объявлениях переменных33
В Visual Basic можно создавать многоуровневые приложения33
С помощью СОМ в Visual Basic можно отделить бизнес-логику от логики приложения33
'СОМ допускает повторное использование кода34
Необходимые компоненты среды разработки34
Настройка среды разработки35
Тестирование примеров кода в некритической среде37
Взаимодействие ADSI и Visual Basic38
Разработка COM-сервера с помощью Visual Basic и ADSI39
Тестирование COM-сервера с помощью Visual Basic41
Создание экземпляра COM-объекта из VBScript Active Server Page 42
Создание модели делегирования с помощью DCOM • ■43
■ Запуск компонентов СОМ в MTS•• •44
Резюме47
Часть II. Исследование провайдеров ADSL Windows NT■ 49
Методы перечисления контейнера и программное управление политикой учетных записей домена50
• Перечисление доменов в пространстве имен Windows NT50
Перечисление доменов с помощью Visual Basic.51
■ Управление свойствами домена Windows NT51
Связывание доменов с помощью Visual Basic51
Просмотр и установка нового значения свойства AutoUnlocklntreval 52 Просмотр и установка нового значения свойства LockoutObservationlnterval53
Просмотр и установка нового значения свойства MaxBadPasswordsAllowed54
Просмотр и установка нового значениясвойства MaxPasswordAge55
Просмотр и установка нового значениясвойства MinPasswordAge56
Просмотр и установка нового значениясвойства MinPasswordLength57
Просмотр и установка нового значениясвойства
PasswordHistoryLength58
Перечисление объектов домена или компьютера59
Перечисление объектов общего контейнера59
Применение фильтра для перечисления59
Создание и удаление объектов с помощью интерфейса lADsContainer 61 Добавление и удаление учетных записей компьютеров61
Добавление, удаление и переименование учетных записей пользователей■62
Добавление и удаление групп64
Создание модуля класса NTContainerManagement65
Использование функций модуля NTContainerManagement68
Резюме71
Программное управление учетной записью пользователя72
Синтаксис связывания пользовательского объекта72
Синтаксис связывания пользовательского объекта с помощью Visual Basic73
Манипулирование свойствами учетной записи пользователя73
Манипулирование свойством FullName73
Манипулирование свойством Description'75
Манипулирование паролями пользователей76
Манипулирование пользовательскими флагами■77
Манипулирование флагом User Must Change PasswordatNext Logon79
Манипулирование флагом User Cannot Change Password80
Манипулирование флагом Password Never Expires,81
Манипулирование флагом Account Disabled82
Манипулирование флагом Account Locked Out84
Манипулирование профайлами пользовательской среды85
Манипулирование местоположением пользовательского профайла86
Манипулирование свойством LoginScript86
Манипулирование местоположением личного каталога пользователя87
Манипулирование подключением личного каталога пользователя88
Манипулирование временем регистрации пользователя89
Просмотр времени регистрации пользователя с помощью Visual Basic 89
Манипулирование регистрацией рабочей станции90
Просмотр регистрации рабочих станций с помощью Visual Basic91
Добавление новой регистрации рабочей станции к свойству LoginWorkstations с помощью Visual Basic91
Удаление существующей регистрации рабочей станции из свойства
LoginWorkstations с помощью Visual Basic92
Манипулирование свойствами учетной записи93
Просмотр срока действия учетной записи с помощью Visual Basic93
Установка срока действия учетной записи с помощью Visual Basic94
Просмотр типа учетной записи с помощью Visual Basic94
Манипулирование свойством Parameters96
Программное управление свойствами, недоступными с помощью стандартных графический инструментов операционной системы96
Просмотр значения свойства BadLoginCount с помощью Visual Basic 96
Просмотр значения свойства LastLogin для выбранного компьютера с помощью Visual Basic97
Просмотр значения свойства LastLogofT для выбранного компьютера с прмощью Visual Basic' 97
Просмотр значения свойства PasswordMinimumLength учетной записи пользователя с помощью Visual Basic98
Просмотр значения свойства PasswordRequired учетной записи пользователя с помощью Visual Basic98
Установка значения свойства PasswordRequired учетной записи пользователя с помощью Visual Basic98
Просмотр срока действия пароля пользователя с помощью Visual Basic 99
Создание модуля класса NTUserManagement101
Использование функций модуля NTUserManagement106
Резюме'109
Программное управление группойПО
Администрирование групп безопасности Windows NT110
Связывание группы111
Добавление пользователей в группу111
Удаление пользователя из группы112
Перечисление членов группы112
Просмотр группы, к которой принадлежит пользователь113
Просмотр и установка значений поля описания группы114
Перечисление пользователей — членов группы116
Использование групп для управления безопасностью файловой системы.116
Создание дочерней структуры117
Создание модуля класса NTGroupManagement .118
Использование функций модуля NTGroupManagement120
Резюме121
Программное управление компьютером и службами122
Просмотр свойств компьютера: интерфейс lADsComputer122
Просмотр имени зарегистрированного владельца компьютера с помощью Visual Basic123
Просмотр с помощью Visual Basic организации, на которую зарегистрирован компьютер123
Просмотр с помощью Visual Basic операционной системы, установленной на компьютере123
Просмотр с помощью Visual Basic версии операционной системы, установленной на компьютере124
Просмотр типа процессора с помощью Visual Basic124
Просмотр установленного HAL в Windows NT с помощью Visual Basic 124
Просмотр и манипулирование службами компьютера: интерфейс lADsService125
Перечисление с помощью Visual Basic служб, установленных на выбранном компьютере125
Связывание служб с помощью VisualBasic126
Просмотр зависимостей службы с помощью Visual Basic126
Установка новой зависимой службы с помощью Visual Basic127
Просмотр отображаемого имени службы с помощью Visual Basic128
Установка нового отображаемого имени службы с помощью
Visual Basic129
Просмотр имени компьютера с помощью Visual Basic130
Просмотр исполняемого пути службы с помощью Visual Basic130
Установка нового исполняемого пути службы с помощью Visual Basic 131 Просмотр имени учетной записи службы с помощью Visual Basic131
Просмотр типа запуска службы с помощью Visual Basic132
Установка типа запуска службы с помощью Visual Basic133
Просмотр и манипулирование работой службы: интерфейс lADsServiceOperations134
Просмотр состояния службы с помощью Visual Basic134
Запуск службы с помощью Visual Basic135
Остановка службы с помощью Visual Basic136
Приостановка службы с помощью Visual Basic136
Продолжение выполнения приостановленной службы с помощью
Visual Basic137
Установка нового пароля службы с помощью Visual Basic137
Создание модуля класса NTComputerJManagement138
Использование функций модуля NTComputerManagement143
Резюме145
Программное управление файловыми ресурсами и ресурсами печати147
Управление файловыми ресурсами147
Связывание контейнера LanmanServer с помощью Visual Basic148
Перечисление совместно используемых ресурсов системы с помощью
Visual Basic148
Связывание определенного файлового совместно используемого ресурса с помощью Visual Basic149
Просмотр числа пользователей, использующих общий ресурс, с помощью Visual Basic149
Просмотр описания совместно используемого ресурса с помощью
Visual Basic150
Установка нового описания совместно используемого ресурса с помощью Visual Basic151
Просмотр с помощью Visual Basic имени компьютера, на котором расположен совместно используемый ресурс151
Просмотр с помощью Visual Basic максимального числа пользователей, подключенных к совместно используемому ресурсу151
Установка с помощью Visual Basic нового максимального числа пользователей, подключенных к совместно используемому ресурсу152
Просмотр пути расположения совместно используемого ресурса с помощью Visual Basic152
Программное создание совместно используемого ресурса с помощью
Visual Basic153
Удаление совместно используемого ресурса с помощью Visual Basic 153
Управление файловыми сессиями154
Перечисление пользовательских сессий с помощью VisualBasic154
Управление отдельными сессиями с помощью Visual Basic155
■Отключение отдельной пользовательской сессии с помощью
Visual Basic156
Отключение всех пользовательских сессий с помощью Visual Basic 156
Управление открытыми ресурсами156
. Перечисление открытых ресурсов спомощью Visual Basic157
Тестирование свойств одного открытого ресурса с помощью '
Visual Basic158
Управление ресурсами печати158
. Перечисление очередей печати с помощью Visual Basic158
Связывание определенной очереди печати спомощью Visual Basic159
Просмотр свойств очереди печати с помощью Visual Basic159
Программное управление очередью печати с помощью Visual Basic 161
Создание модуля класса NTResourceManagement166
Использование функций модуля NTResourceManagement175
Резюме180
Часть Ш. Исследование провайдеров ADSL IIS181
Программное управление метабазой IIS182
Структура метабазы IIS182
Просмотр структуры метабазы IIS с помощью Visual Basic183
Объект IlsComputer184
Резервное копирование метабазы IIS с помощью Visual Basic184
Манипулирование максимальной шириной полосы пропускания сети сервера IIS186
Запись журнала узла IIS 1190
Провайдер ведения журнала в каждой службе IIS190
Активизация ведения журнала190
Формат активного журнала191
Дополнительные свойства формата журнала192
Дополнительные свойства файла журнала провайдера W3C194
Свойства провайдера ведения журнала ODBC197
Программное управление узлом199
Перечисление виртуальных узлов WWW на сервере IIS с помощью
Visual Basic199
Перечисление виртуальных узлов FTP на сервере IIS с помощью
Visual Basic '200
Поиск числового индекса для узлов на основе свойства
ServerComment с помощью Visual Basic200
Создание нового Web-узла с помощью Visual Basic201
Создание нового FTP-узла с помощью Visual Basic"202
Удаление узла на основе свойства ServerComment с помощью
Visual Basic202
Удаление FTP-узла с помощью Visual Basic203
Создание нового виртуального каталога с помощью Visual Basic204
Создание нового виртуального каталога FTP с помощью Visual Basic204
Удаление существующего виртуального каталога с помощью
Visual Basic205
■Удаление существующего виртуального каталога FTP с помощью
Visual Basic.205
Управление каталогами и файлами Web с помощью Visual Basic205
Программное оперирование узлом207
Просмотр состояния узла с помощью Visual Basic207
Запуск узла с помощью Visual Basic208
Остановка узла с помощью Visual Basic208
Приостановка узла с помощью Visual Basic209
Возобновление работы узла с помощью Visual Basic209
Создание модуля класса IlsSiteManagement209
Использование функций модуля IlsSiteManagement221
Резюме228
Программное управление Web-узлом229
Связывание виртуального узла229
Связывание виртуального каталога230
Наследование свойств230
Программное управление параметрами вкладки Properties234
Идентификация Web-узла•235
Соединения238
Программное управление параметрами вкладки Operations240
Просмотр операторов Web-узла с помощью Visual Basic241
Добавление нового оператора Web-узла с помощью Visual Basic241
Удаление оператора Web-узла с помощью Visual Basic ■242
Программное управление параметрами вкладки Performance242
Настройка производительности.243
Установка ограничений полосыпропускания243
Конфигурация соединения '244
Программное управление параметрами вкладки Home Directory245
Локальный личный каталог246
■Удаленный личный каталог246
Разрешения доступа и управление содержимым локальных и удаленных личных каталогов248
Настройка Web-приложений249
Перенаправление HTTP URL253
Программное управление параметрами вкладки Documents '255
Активизация документа по умолчанию256
Активизация колонтитула документа257
Программное управление параметрами вкладки Directory Security258
Методы аутентификации259
Безопасные соединения '262
Ограничение доступа на основе адресов IP265
Программное управление параметрами вкладки HTTPHeaders267
Дата истечения срока действия содержимого268
ПользовательЬкие заголовки HTTP269
Уровни оценок содержимого270
Управление типом MIME272
Создание модуля класса IIsWebManagement273
Использование функций модуля IIsWebManagement287
Резюме294
Программное управление FTP-узлом295
Определение наследуемых свойств295
Программное управление параметрами вкладки FTPSite .297
Управление свойствами идентификации узла,298
Управление свойствами соединения300
Управление временем ожидания соединения300
Программное управление параметрами вкладки SecurityAccounts301
Настройка анонимного соединения301
Операторы FTP-узла304
Программное управление параметрами вкладки Messages305
Сообщение-приветствие306
Сообщение о выходе307
Сообщение о превышении числа подключений.308
Программное управление параметрами вкладки HomeDirectory309
Локальный личный каталог309
Удаленный личный каталог310
Разрешения для доступа к каталогу311
Стиль отображения списка каталога312
Программное управление параметрами вкладки DirectorySecurity314
Просмотр текущих ограничений адресов IP с помощью Visual Basic 315
Установка новых ограничений адресов IP с помощью Visual Basic 316
Создание модуля класса IIsFTPManagement317
Использование функций модуля IIsFTPManagement324
Резюме327
Часть IV. Исследование провайдеров ADSL LDAP329
Программное управление инфраструктурами LDAP330
Краткий обзор технологии и терминологии LDAP330
Что такое LDAP ■331
Информационная модель: как поместить что-либо в каталог LDAP331
Модель имен: как организованы данные332
Функциональная модель: доступ и обновление данных332
Модель безопасности: контроль за несанкционированным доступом к записям и атрибутам333
Существующие интерфейсы прикладного программирования LDAP 333
Коммерческие продукты, поддерживающие LDAP333
Пример установки Netscape Directory Server334
Манипулирование каталогом LDAP с помощью ADSI335
Просмотр архитектуры существующего каталога LDAP с помощью Visual Basic336
. Просмотр атрибутов записи с помощью ADSI при анонимном доступе в Visual Basic337
Просмотр атрибутов записи с помощью ADSI при разделяемом досту- - пе в Visual Basic337
Модификация атрибутов записи с помощью ADSI в Visual Basic338
Создание новой записи с помощью ADSI в Visual Basic338
Удаление записи с помощью ADSI в Visual Basic339
Использование ADO для поиска в каталоге с помощью Visual Basic 339
Управление почтовыми ящиками Microsoft Exchange и списками рассылки с помощью провайдера LDAP ADSI340
Создание нового почтового ящика Exchange с помощью Visual Basic 340
Удаление существующего почтового ящика Exchange с помощью Visual Basic343
Добавление члена списка рассылки с помощью Visual Basic343
Удаление члена списка рассылки с помощью Visual Basic344
Определение владельца списка рассылки с помощью Visual Basic344
Создание модуля класса LDAPObjectManagement'345
Использование функций модуля LDAPObjectManagement348
Создание модуля класса ExchangeObjectMgt349
Использование функций модуля ExchangeObjectMgt352
Резюме352
Программное управление Active Directory Windows 2000354
■Терминология Active Directory354
Связывание объектов в Active Directory356
Связывание корневой записи DS (RootDSE) с помощью Visual Basic 357 Связывание объекта Active Directory с помощью альтернативной аутентификации358
Просмотр леса с помощью общего каталога и Visual Basic359
Управление объектами в Active Directory360
Отображение всех объектов пользователей в Active Directory с помощью Visual Basic■ •361
Отображение всех объектов групп в Active Directory с помощью
Visual Basic361
Отображение всех объектов компьютеров в Active Directory с помощью Visual Basic362
Создание объектов вActive Directory362
Создание объектов в Active Directory с помощью Visual Basic363
Отображение классов и ассоциированных с ними обязательных атрибутов с помощью Visual Basic364
Удаление объектов из Active Directory с помощью Visual Basic364
Удаление всей ветви дерева каталога364
Переименование объектов в Active Directory365
Перемещение объектов по дереву365
Управление безопасностью объектов в Active Directory366
Константы, используемые в АСЕ367
Основы управления безопасностью Active Directory369
Дополнительные возможности управления безопасностью Active
Directgry375
Создание модуля класса ADObjectManagement378
Использование функций модуля ADObjectManagement390
Резюме.391
Часть V. Приложения.393
Справочник по коду VBScript .394
Глава 3. Код VBScript Active Server Page для управления контейнером 394 Глава 4. Код VBScript Active Server Page для управления учетной записью пользователя■399
Глава 5. Код VBScript Active Server Page дляуправления группой413
Глава 6. Код VBScript Active Server Page дляуправления компьютером
и службами414
Глава 7. Код VBScript Active Server Page для управления файловыми ресурсами и ресурсами печати423
Глава 8. Код VBScript Active Server Page дляуправления узлом IIS430
Глава 9. Код VBScript Active Server Page дляуправления Web-узлом443
Глава 10. Код VBScript Active Server Page для управления FTP-узлом 459 Глава 11. Код VBScript Active Server Page для управления инфраструктурами LDAP468
Глава 12. Код VBScript Active Server Page для управления
Windows 2000 Active Directory473
Б. Справочник по программированию ADSI 2.5486
Интерфейс AccessControlEntry486
Интерфейс AccessControlList490
Интерфейс IADs491
Интерфейс LADsCollection493
Интерфейс lADsComputer493
Интерфейс LADsContainer498
Интерфейс lADsDeleteOps499
Интерфейс lADsDomain499
Интерфейс lADsFileService503
Интерфейс lADsFileServiceOperations507
Интерфейс LADsFileShare5II
Интерфейс LADsGroup514
Интерфейс LADsLocality516
Интерфейс lADsMembers519
Интерфейс LADsO519
Интерфейс LADsOU522
Интерфейс lADsOpenDSObject525
Интерфейс lADsPrintJob525
Интерфейс lADsPrintJobOperations529
Интерфейс lADsPrintQueue532
Интерфейс lADsPrintQueueOperations536
Интерфейс lADsResource540
Интерфейс LADsService542
Интерфейс LADsServiceOperations547
Интерфейс lADsSession550
Интерфейс lADsUser553
Настраиваемые свойства провайдера WinNT562
Интерфейс WinNTSystemlnfo564
Дополнительные источники информации565
Разработка и администрирование Active Directory565
Active Directory Service Interfaces (ADSI)566
Сценарии Active Server Page (ASP)566
ActiveX Data Objects (ADO)567
Lightweight Directory Access Protocol (LDAP)567
Visual Basic568
Предметный указатель569
Об авторе
/ Томас Экк (Thomas Eck), специалист отдела Global Financial Services корпорации Perot Systems. Он имеет сертификаты ASE, CCA, CNA, GCA, MCDBA, MCSD, MCSE+I. В настоящее время работает системным разработчиком и руководителем проекта по контракту с одним из крупнейших европейских банков. Эта должность дает Томасу уникальную возможность внедрять мировые коммуникационные стандарты во внутреннюю сеть банка и ее Web-инфраструктуру. В круг его обязанностей входит исследование и разработка новаторских способов решения задач документооборота с помощью Web и технологии “тонких” клиентов. Кроме этого, он поддерживает и консультирует различные проекты по разработке, инжинирингу и внедрению новых компьютерных технологий в банковской сфере.
Томас является соавтором и редактором нескольких книг, выпушенных издательствами Osborne McGraw-Hill и Charls River Media, а также регулярно публикует статьи и обзоры в МСР Magazine. .
Время, свободное от написания книг и статей, работы или подготовки к сертификационным экзаменам, Томас и его жена обычно посвящают путешествиям, посещению театров или приготовлению потрясающих блюд в уютном доме, расположенном в предместье Чикаго.
Томас всегда рад узнать ваше мнение об этой книге. Пишите ему по адресу: tho- mas.eck@ps.net.
Моей жене Дженни. Каждый проведенный с тобой день напоминает мне, что настоящая любовь бесконечна
Благодарности
В работе над этой книгой принимали участие очень многие. Однако особую благодарность я бы хотел выразить трем экстраординарным женщинам, которые внесли неоценимый вклад в этот проект. .
Прежде всего хочу поблагодарить свою жену Дженни за ее терпение и понимание (длинные бессонные ночи, перенесенные обеды и масса потерянного времени в первый год нашей семейной жизни), которые помогли мне написать эту книгу. Без ее поддержки и содействия эта книга, а также другие мои работы не увидели бы свет.
Я также благодарен Карен Вочс (Karen Wachs) за помощь и профессионализм. Ее вопросы делали книгу более содержательной и не давали мне расслабиться, а опыт управления и знание книгоиздания помогли успешно завершить этот проект. Карен — профессионал высшего класса; мне было очень приятно работать с ней.
И наконец, огромное спасибо еще одной очаровательной женщине — редактору Шеннон Лойме (Shannon Leuma). Благодаря ее непревзойденному вниманию к деталям и бесчисленным конструктивным замечаниям мой текст принял законченный и читабельный вид.
Не могу не поблагодарить моих рецензентов и сотрудников Брендана Мак-Тагуя (Brendan McTague) и Дэйва Гора (Dave Gore). Спасибо за помощь! Ваши критические замечания существенно улучшили текст книги. Особо отметить хотелось бы Брендана за его роль на начальном этапе этого проекта. Именно он представил меня Эл Валь- вано (Al Valvano) и Джену Гарретту (Jen Garrett), что положило начало моим отношениям с издательством New Riders.
Также хотел бы поблагодарить сотрудников New Riders, с которыми я общался на протяжении всей работы над проектом. Отдельная благодарность Джине Браун (Gina Brown), Алиссе Кэйтон (Alissa Cayton) и Кристи Кноуп (Kristy Knoop) за подготовку текста.
И наконец, огромное спасибо Ричарду Оулту (Richard Ault) из корпорации Microsoft за помощь при описании сложных элементов программного администрирования ADSI и рецензирование окончательного варианта текста книги. Его опыт работы с ADSI и детальные комментарии к каждой главе помогли мне правильно описать сложные темы на “понятном языке", которые будут одинаково интересны как начинающим, так и умудренным опытом читателям.
Для кого предназначена эта книга
В отличие от других книг, здесь вы не найдете подробного описания теоретических основ используемой технологии. Основное внимание в этой книге уделяется фрагментам кода, которые помогут сохранить ваше время. В этих фрагментах приводится код автоматизации большинства повседневных задач администратора.
Книга в основном предназначена для подготовленных специалистов, которые работают системными администраторами, разработчиками приложений, и в меньшей мере для менеджеров информационных технологий. Если вы впервые сталкиваетесь с администрированием систем, то вначале прочитайте книги, список которых приведен в приложении Б, “Справочник по программированию ADSI 2.5”.
Системным администраторам книга предоставит код, необходимый для автоматизации административных задач, наиболее часто используемых в Windows NT, Internet Information Server, реализациях каталога LDAP, Microsoft Exchange Server и инфраструктуры пространства имен Windows 2000 Active Directory. Если вы новичок в программировании на Visual Basic, изучите примерь! из главы 2, “Основы многоуровневой разработки”.
Разработчики приложений найдут в этой книге код Visual Basic, который позволяет работать с административными функциями системного уровня, используя относительно простой API. Большинство тем книги будут полезны и Web-разработчикам; код авторских компонентов СОМ можно повторно использовать С: VBScript, JavaScript и другим языком, поддерживающим автоматизацию.
Менеджеру информационных технологий эта книга поможет оценить перспективы использования. программного администрирования при определении стратегий развития компании или решении проблем клиентов.
Не имеет значения, к какой категории пользователей вы себя относите. Множество примеров администрирования из этой книги можно непосредственно применять на практике в вашей компании.
Требования
Чтобы наиболее оптимально' использовать материал этой книги, необходимо следующее:
клиент Windows NT или Windows 2000;
пространство имен, в котором вы сможете безопасно тестировать код.
Если вы собираетесь разрабатывать COM-объекты с помощью Visual Basic, приобретите редакцию Professional или Enterprise компилятора Visual Basic 5.0 (или выше).
Примечание
У вас нет компилятора Visual Basic? Не отчаивайтесь! Практически весь необходимый для программного администрирования код VBScript приведен в приложении А, “Справочник по коду VBScript”. Загрузите последнюю версию сервера IIS с Web-узла корпорации Microsoft, возьмите простой текстовый редактор — и вы “во всеоружии ”.
Кроме того, для тестирования программного кода можно использовать язык Visual Basic for Application из пакета Microsoft Office.
Часть 1
Подготовка
к программному администрированию
Обзор интерфейса службы активного каталога
Основы многоуровневой разработки
1
Обзор интерфейса службы ■ активного каталога
В работе системных администраторов довольно часто встречаются “нудные” задачи обслуживания. Более интересные аспекты работы они чаще всего выполняют вручную, а для монотонных задач применяют языки сценариев. Корпорация Microsoft поставляет вместе с Windows NT несколько утилит командной строки, но эти инструменты ограничены функционально и запускаются исключительно из командной строки. Некоторые сценарии, предназначенные для ограниченного внутреннего использования, могут вполне обойтись командной строкой, но при распространении приложений подобное решение не идет ни в какое сравнение с графическим пользовательским интерфейсом и потому неприемлемо. Таким образом, чтобы обрести дополнительную функциональность, не входящую в инструменты командной строки, или же устранить ее “закрытость”, разработчикам необходимо обращаться к соответствующему интерфейсу прикладного программирования (Application Programming Interface — API).
Большинство программистов знакомы с функциями API и их использованием. Практически все системные администраторы свободно владеют сценариями оболочки, в то время как Visual Basic является для них Terra Incognita. Администраторы желают автоматизировать задачи, которые они выполняют с помощью инструментов командной строки без использования средств сторонних разработчиков. Для этого применяют прямые вызовы API или же ожидают, пока кто-нибудь из разработчиков напишет простые средства автоматизации повседневных задач.
Вскоре появились “спасательные средства”, позволяющие выйти из казалось бы безвыходной ситуации. Администраторам, знакомым с языком Perl, пришлись по вкусу дополнения AdminMisc, благодаря которым с помощью относительно простого языка сценариев можно управлять пользователями и доменами. Несмотря на свою эффективность в среде Windows NT, они не вписывались в текущее стратегическое направление развития средств администрирования Windows корпорации Microsoft. В первую очередь это связано с современными стандартами разработки графических приложений и невозможностью их использования в масштабах предприятия. Другие средства администрирования, например WinBatch или Kixtart, были разработаны для выполнения более сложных задач, например манипулирования параметрами системного реестра; все же с их помощью невозможно решать современные задачи администрирования корпоративных сетей.
Несколько лет назад поставщики других операционных систем включили в свои продукты настоящие службы каталогов, поддерживающие LDAP, Х.500, а компания Novell создала собственную реализацию службы каталогов Netware Directory Service (NDS). Критики операционной системы Windows NT постоянно указывали на “плоскую” архитектуру базы данных диспетчера учетных записей (Security Account
Manager — SAM). Именно этот недостаток Windows NT 4.0 сдерживал ее распространение на рынке операционных систем для предприятий, где доминировали системы UNIX.
В ответ на критику Microsoft встраивает поддержку промышленного стандарта упрошенного протокола для доступа к каталогу (Lightweight Directory Access Protocol — LDAP) в Microsoft Exchange 5.0, а позднее в Site Server и Windows 2000. Служба каталога корпорации Microsoft в Windows 2000 получила название активный каталог {Active Directory — AD\
Центральную роль в настройке и поддержке операционной системы Windows 2000 играет Active Directory, а среда разработки, поддерживающая Active Directory, оказывает существенную помощь в автоматизации процессов документооборота и администрирования Windows 2000. Корпорация Microsoft не стала ограничивать настройку Active Directory средствами высокоуровневых языков типа C++, а решила сделать доступным Active Directory из любого VBA-совместимого приложения.
Используя библиотеки интерфейса службы активного каталога {Active Directory Service Interface — ADSI), управлять пространством имен Windows NT или Windows 2000 может даже начинающий администратор. Вместо довольно сложных вызовов API используется простой набор процедур для манипулирования средой и пространством имен. Эти процедуры доступны и понятны большинству системных администраторов с различным уровнем подготовки.
ADSI выпущен в 1997 году, и многие пользователи сразу же обратили внимание на этот продукт (ранее называвшийся OLE-DS). Корпорация Microsoft не объявляла о поддержке какой-либо службы каталогов до появления ее собственной реализации в Windows 2000. Не следует полагать, что Active Directory Service Interface работает исключительно с Active Directory. Этот интерфейс позволяет программно администрировать Windows NT 4.0, а кроме того, поддерживает следующее:
администрирование Microsoft Exchange Server (для этого применяется провайдер LDAP);
продукты Novell с помощью провайдера NWCOMPAT;
продукты Novell NDS с помощью провайдера NDS ADSI;
все LDAP-совместимые инфраструктуры службы каталогов (LDAP V2 и выше, каталоги Microsoft Site Server и т.д.);
Active Directory операционной системы Windows 2000;
метабазу (metabase) сервера Internet Information Server (IIS).
Несмотря на сложность, ADSI доступен и понятен разработчикам и администраторам, знакомым с языками программирования Visual Basic или C++, а также с их облегченными версиями — VBScript и JavaScript. Кроме того, ADSI поддерживает другие контроллеры автоматизации, например Perl и Rexx, а также позволяет администраторам использовать любой язык программирования, поддерживаюший автоматизацию OLE с COM-объектами ADSL Неважно, разрабатываете ли вы обычные приложения, СОМ-объект, Web-приложение или даже часть сценария регистрации с помощью Windows Scripting Host (WSH), ADSI обеспечивает относительно простой интерфейс для автоматизации наиболее часто выполняемых административных задач.
Когда бы вы не решили переходить на Windows 2000, помните, что использование ADSI окупит себя при автоматизации документооборота и решении рутинных административных задач. Кроссплатформенность ADSI позволяет за короткое время разработать настраиваемые приложения и создать боле универсальные сценарии регистрации, что обеспечит лучшую поддержку инфраструктуры практически любой компании.
Манипулирование абстракциями пространства имен ADSI
В среде системных администраторов широко распространено мнение, что ADSI — это язык программирования. На самом деле это не так. ADSI представляет собой, скорее, коллекцию объектов СОМ, которая позволяет программно манипулировать любым поддерживаемым пространством имен. Таким образом, ADSI является абстрактным слоем между языком программирования и процессами, необходимыми для управления пространством имен. Эта абстракция служит следующим шагом использования контроллеров автоматизации OLE, таких как Visual Basic, которые применяются для автоматической генерации соответствующего кода OLE. Visual Basic может сгенерировать все необходимые вызовы интерфейса IDispatch, а разработчику остается лишь сконцентрироваться на разработке бизнес-логики приложения, а не на внутренней структуре СОМ.
Рассмотрим описанную абстракцию на “нетехническом” примере. Предположим, вы пригласили на работу переводчика, который свободно владеет английским, немецким, испанским, французским и итальянским языками. Несмотря на то что вы знаете только русский язык, благодаря этому переводчику вы сможете свободно общаться при поездке в Западную Европу. Аналогом такого переводчика выступает ADSI — он может “разговаривать” на языке пространств имен Windows NT, LDAP и NDS/Bindery. Кроме этого, ADSI может работать с метабазой IIS, продуктами сторонних разработчиков, и даже специально созданными пространствами имен, которые реализованы с собственными провайдерами и дополнениями к схеме службы каталога.
Примечании
Схема базы данных соответствует определению доступных полей для хранения данных. “Расширенная ” схема представляет собой определение дополнительных полей, в которых хранится пользовательская информация, например поле номера доступа безопасности сотрудника, или другие специфичные для компании данные. Рассмотрим еще один “нетехнический ” пример — почтовую систему. Почтовое отделение определяется следующей адресной схемой, которая используется для доставки корреспонденции:
Имя'
Адрес■
Город, Область, Индекс
Страна.
Однако в некоторых случаях для точной доставки корреспонденции необходимы дополнительные сведения, например корпус дома.
Технология абстракции
Концепция генерации кода, который используется во множестве продуктов, не является 'чем-то новым для разработчиков, знакомых с процессом создания приложений для платформы Windows. Как и в Telephony Application Programming Interface (TAPI), маскирующем низкоуровневые средства доступа к телефонным устройствам, ADSI обеспечивает интерфейс для маскирования вызовов API, применяемых для выполнения необходимых действий в пространстве имен. В TAPI поставщики модемов создают нужный драйвер устройства, который реализован на основе стандартов TAPI. Таким образом, разработчик, создающий телефонное приложение, может забыть о тысячах типов модемов, доступных на рынке, и сосредоточиться на написании кода, который будет работать с любым TAPI-совместимым оборудованием.
Описанная концепция программирования не ограничивается аппаратными средствами. Аналогичная технология абстракции применяется для создания почтовых приложений с использованием интерфейса Messaging Application Programming Interface (MAPI) и даже для организации подключения к базам данных с помощью интерфейсов Open Database Connectivity (ODBC). При использовании ADSI эта абстракция позволяет разработчику изучить синтаксис, специфичный для каждого провайдера ADSI, вместо изучения вызовов API, необходимых для манипулирования любым индивидуальным пространством имен.■
Простота и естественность позволяют корпоративным разработчикам создавать приложения администрирования, практически не заботясь о будущей инфраструктуре, т.е. приложение без особых трудностей может быть заново написано. В качестве примера рассмотрим код Visual Basic, с помощью которого в пространство имен Windows NT добавляется информация о новом пользователе.
'Установка переменной Container типа lADsContainer Dim Container As lADsContainer
'Установка переменной NewUser типа lADsUser Dim User as lADsUser
'Связывание пространства имен WinNT и экземпляра
'объекта ADSNT.DLL, если он не активен:
Set Container = GetObject("WinNT://UserDomain")
'Создание нового пользователя в пространстве имен:
Set User - Container.Create("User","TEck”)
'Запись информации в пространство имен:','
User.Setinfo
Несмотря на то что провайдер WinNT нормально функционирует и в Windows 2000, для добавления информации о пользователе в соответствующий контейнер Active Directory используйте следующий код Visual Basic:
'Установка переменной Container типа lADsContainer Dim Container As lADsContainer
'Установка переменной NewUser типа lADsUser Dim User as lADsUser
'Связывание пространства имен LDAP и экземпляра
'объекта ADSLDP.DLL, если он не активен: Set Container =
GetObject("LDAP://ldap_server/OU=Engineering,DC=PerotSystems,DC=COM")
'Создание нового пользователя в пространстве имен:
Set User = Container.Create("User","cn=TEck")
User.Put("sAMAccountName", "Teck")
'Запись информации в пространство имен:
User.Setlnfo
Обратите внимание, что приведенные фрагменты кода для пространств имен WinNT и LDAP поразительно похожи. Несмотря на различие аргументов, используемых для связывания пространства имен и объявления пользователя в провайдерах WinNT и LDAP (это связано с необходимостью определения расположения объекта в каталоге), синтаксис, используемый для манипулирования интерфейсами ADSI, практически идентичен. Параметры провайдера выполняют необходимые действия в каждой соответствующей службе каталогов. В отличие от плоской архитектуры простран-
ства имен WinNT, провайдер LDAP позволяет администратору явно определять положение в пространстве имен, в котором создается объект пользователь. z
Если бы не существовало ADSI, то вам необходимо было бы изучать соответствующий API разработчика для управления каждым пространством имен. Это, в свою очередь, существенно увеличивает время разработки и снижает возможность адаптации к изменениям в инфраструктуре компании. В современных гетерогенных средах такая казалось бы простая задача автоматизации повседневной административной деятельности неминуемо приведет к тому, что администратор надолго “засядет” за изучение соответствующей документации. ADSI подходит администраторам с любым уровнем подготовки (даже тем, кто впервые берет на вооружение программные методы администрирования), т.е. практически каждый администратор сможет создать собственные приложения автоматизации администрирования.
Тщательное планирование и программная практика разработки приложений ADSI — залог написания верного и эффективного кода, который будет работать практически с любым провайдером без существенных модификаций в будущем.
Производительность ADSI и API поставщика пространства имен
Логика подсказывает, что появление каждого нового слоя абстракции должно существенно уменьшать относительную производительность (или эффективность) системы. Корпорация Microsoft утверждает, что, хотя слой абстракции ADSI находится между приложением и естественными вызовами API, отличия в производительности между вызовами API и использованием ADSI незначительны. Эта несущественная потеря производительности объясняется тем, что в ADSI существует эффективный “маршрутизирующий” слой между приложением и низкоуровневыми процессами. Большинство системных администраторов предпочитают простоту использования ADSI относительно небольшой потере производительности.
Практическое использование ADSI
Кроме интегрирования с существующим процессом документооборота, многоуровневая архитектура ADSI позволяет быстро и просто преобразовать теоретические принципы в практические приложения. ADSI поможет и при создании более эффективного внутреннего процесса документооборота, и при реализации простого поиска в существующем пространстве имен.
В следующих разделах речь пойдет о наиболее важных применениях ADSI, в том числе:
сокрытие процесса документооборота;
применение стандартов присвоения имен;
автоматизация управления системой.
Кроме того, рассматриваются следующие возможности ADSI: кэширование свойств, управление поиском в пространстве имен и средства безопасности.
Сокрытие процесса документооборота
Вспомните, как портной “подгоняет” костюм под вашу фигуру. Аналогичным образом для каждой современной компании необходимо “подогнать” программные средства. Корпорация Microsoft и другие поставщики создали офисные приложения,
которые можно модифицировать для решения конкретных задач. Чаще всего настройка выполняется с помощью VBA. -
До повсеместного распространения Web-приложений процесс внутреннего документооборота часто приходилось корректировать, изменяя соответствующее приложение. При этом поставщики программных средств выступали в роли скульпторов биз- нес-процессов.
При появлении СОМ и ее поддержке в приложениях Web-серверов существенно ускорилась разработка Web-приложений, в которых процесс документооборота практически для любого типа бизнеса может быть скрыт. Используя COM-объекты, можно разделить логику приложения и бизнес-логику, что сделает приложение более гибким в настройке и модификации. Кроме того, Web-приложения обладают следующими преимуществами: '
внешний вид пользовательского интерфейса может быть настроен в соответствии с корпоративными требованиями;
менеджеры могут использовать инструментарий, выполненный в едином интерфейсе, что существенно снижает время обучения новым средствам.
Изучая документооборот, разработчик может создать приложения для автоматизации нескольких процессов, из которых состоит документооборот, и соответствующим образом скрыть существующие бизнес-процессы.
Чтобы лучше понять роль ADSI в автоматизации документооборота, предположим, что в вашу компанию принят новый сотрудник. Чтобы он мог эффективно работать, необходимо создать для него рабочее место с телефоном и компьютером, а также зарегистрировать его в пространствах имен NT, Exchange, Novell и UNIX. С помощью ADO вы можете создать сценарий, который извлекает необходимые данные из корпоративной базы данных сотрудников и создает нужные учетные записи нового пользователя в каталоге LDAP, NDS, Exchange и базе SAM Windows NT. Используя данные, полученные из корпоративной базы данных сотрудников, а также соответствующий провайдер ADSI, можно автоматизировать процесс регистрации нового сотрудника в сети компании.
Применение стандартов присвоения имен
Перед использованием ADSI необходимо применить некоторые бизнес-правила в административном документообороте Windows NT. Например, все учетные записи рабочих станций в домене должны состоять из восьми символов, начинаться с WKS, а также соответствовать стандарту присвоения имен, принятому в компании или подразделении. К сожалению, встроенные средства Windows NT не позволяют использовать выбранный метод присвоения имен, что приводит к появлению имен, не соответствующих принятым. Используя ADSI и форму HTML или Visual Basic, можно выработать единый для компании метод присвоения имен.
Автоматизация управления системой
Довольно часто административные задачи выполняются на каждой рабочей станции в подразделении и довольно редко на всех системах предприятия. Создание нового совместно используемого ресурса или изменение локального пароля администратора на каждом компьютере домена — вот далеко не полный перечень задач, которые лучше всего выполнять с помощью сценариев ADSL
Для более полного понимания роли ADSI в управлении компьютерной системой предприятия рассмотрим перечень задач, выполнение которых можно автоматизировать с помощью ADSI. "
Управление доменом.
Управление почтовым ящиком Exchange.
Управление файлами.
Управление группами.
Управление метабазой IIS.
Управление печатью.
Управление службами.
' • Управление совместным доступом к файлам.
Управление пользователями.
В приведенном ниже фрагменте кода Visual Basic иллюстрируются преимущества использования ADSI при изменении пароля локальной учетной записи администратора на всех компьютерах домена.
On Error Resume Next
Dim TargetDomain As String
Dim ADsPath As String
Dim Domain As lADsContainer
Dim Computer As lADsComputer
Dim LocalAdminAccount As lADsUser
TargetDomain = "Resource_Domain_Name".
ADsPath = "WinNT://" & TargetDomain
Set Domain = GetObject(ADsPath)
Domain.Filter = Array("Computer")
For Each Computer in Domain.
Set LocalAdminAccount = GetObject("WinNT://" & TargetDomain & _
"/" & Computer.Name & "/administrator,user")
LocalAdminAccount.SetPassword = "Tweek@Coffee"
If Err. Number=0 then Debug.Print "Local administrator _
password changed on " & Computer.Name
Err. Number = 0
Next
Эти несколько строк кода помогут автоматизировать одну из часто встречающихся задач. А сколько времени вы бы потратили, если бы вручную с помощью диспетчера пользователей изменяли пароль на всех компьютерах домена? Описанную задачу можно решить несколькими способами, например создать в домене новую группу Workstation administrator и добавить к ней необходимых пользователей или группы, а затем уже манипулировать ею.
Приведенный небольшой и довольно простой пример раскрывает огромные преимущества автоматизации административных функций. А изучив все примеры этой книги, вы сможете более эффективно выполнять администрирование сети вашей компании.
Кэширование свойств
Для уменьшения времени сетевого считывания и установки свойств в ADSI применяется модель кэширования свойств (property caching). Каждый интерфейс ADSI описывается собственным интерфейсом IADs, который поддерживает эту модель кэширования с помощью методов Getlnfo и Setinfo.
Метод Getlnfo
Этот метод вызывается всякий раз при запросе новых данных, хранимых в каталоге. Например, если вы желаете вернуть значение поля FullName в базе SAM пользователя ТЕск, используйте следующий код Visual Basic:
Dim User As ZADsUser
Set User = GetObject("WinNT://Domain/Eckth,user")
Debug.Print "The Full Name value for user EckTh is: " & User.FullName
Несмотря на то что метод User.Getlnfo никогда явно не вызывается, любое свойство, возвращаемое из каталога, неявно его использует. Если далее в коде применять еще раз метод User. FullName, то ADSI возвращает значение йз кэша свойств, а не выполняет повторный поиск в каталоге.
Метод Setinfo
В ADSI есть также метод Setinfo интерфейса IADs для уменьшения числа событий записи в каталог. При формировании нового объекта в пространстве имен можно использовать несколько свойств создания этого объекта, но только одну операцию записи обновления в каталоге. Как и системный реестр Windows, большинство каталогов оптимизированы для выполнения быстрых запросов, но это не относится к производительности записи. Для минимизации сетевой нагрузки кэш свойств ADSI позволяет выполнять одну операцию записи, которая наиболее оптимально ограничивает количество вызовов метода Setinfo.
Рассмотрим следующий фрагмент кода Visual Basic:
Dim Container As lADsContainer
Dim User As lADsUser
Set Container = GetObject ("WinNT://Domain_Name")
Set User = Container.Create ("User", "EckTh")
User.FullName = "Thomas E. Eck"
User.Description = "PSC, Chicago, Intranet Engineering"
User.Setinfo,
В приведенном примере создается запись о новом пользователе и заполняются поля FullName и Description. Обновление каталога выполняется только один раз при вызове метода User. Setinfo...
Комбинация методов Getlnfo/Setlnfo■
Вы уже знаете, что метод Setinfo вызывается явно, а метод Getlnfo — нет (что не совсем понятно). Эти методы присутствуют в большинстве интерфейсов ADSI, поэтому их вместе можно использовать для реализации обработки транзакций.
Рассмотрим следующий фрагмент кода Visual Basic:
Dim User as lADsUser
Dim Retval as Boolean
Set User = GetObject("WinNT://Domain/TEck,user")■
User.FullName = "Thomas Eck"
User.Description = "PSC, Stamford, Intranet Engineering"
Retval = MsgBox("Are you sure you wish to change the Fullname, _ and Description Values for user TEck?", vbYesNo + vbCritical + _ vbDefaultButton2, "Confinn Action")■
If Retval = vbYes Then
User.Setinfo 'Подтверждение выполнения транзакции
Else■ ■
User.Getlnfo "Откат транзакции (возврат к предыдущим значениям) End If
В этом примере кэш свойств заполняется новыми значениями тестовой учетной записи, но перед обновлением информации в каталоге пользователю предоставляется возможность отмены изменений. Если пользователь отказывается от внесения изменений, не используя явно вызов метода Getlnfo, любые последующие вызовы User.FullName или User. Description отображают внесенные изменения, поскольку кэш свойств содержит измененные значения, а не значения, хранящиеся в каталоге.
Поиск в пространстве имен
ADSI может выступать в роли провайдера OLjE DB, что позволяет с помощью ADO (ActiveX Data Object) выполнять естественные запросы базы данных к пространству имен службы каталогов. Обратите внимание, что запросы представляют собой наиболее часто используемые действия в любой структуре каталога, а возможность выполнять запросы к каталогу как источнику OLE DB существенно упрощает эту операцию. Применяя таким образом ADSI, можно создать приложение, которое использует преимущества результирующего набора данных, извлеченного из таблицы, объединяющей службу каталога и внешнюю базу данных.
К сожалению, использовать ADSI в качестве провайдера OLE DB можно только в запросах к пространствам имен LDAP и NDS. Для поиска в пространстве имен Windows NT необходимо применять перечисление домена, а затем манипулировать результирующим набором с помощью условных операторов. Примеры перечислений с использованием ADSI приведены практически во всей книге, а использование ADSI в качестве провайдера OLE DB описано только в одной главе — И, “Программное управление инфраструктурами LDAP”. Это связано с тем, что поиск с помощью ADO возможен только в пространстве имен LDAP.
Объекты безопасности
ADSI обеспечивает интерфейсы для авторизации и аутентификации в Active Directory с помощью методов NTLM или Kerberos. Это потрясающее свойство позволяет разрабатывать безопасные сценарии регистрации с помощью ADSI для аутентификации в Active Directory или другой инфраструктуре LDAP. ADSI обеспечивает механизмы безопасности, которые могут быть применены ко всем intranet- и extranet- приложениям компании. Аутентификация в Active Directory с помощью ADSI более подробно рассматривается в главе 12, “Программное управление Active Directory Windows 2000”.
Поддержка интерфейса
Несмотря на простоту использования ADSI по сравнению с вызовами API, а также более эффективное создание кода, необходимо понимать суть каждого пространства имен, которым вы собираетесь управлять с помощью ADSL Благодаря ADSI обеспечивается единый интерфейс ко всем пространствам имен, но некоторые провайдеры поддерживают дополнительную функциональность.
Ниже приведен список интерфейсов, поддерживаемых каждым провайдером ADSL Более подробную информацию об индивидуальных свойствах и методах каждого из этих интерфейсов, а также об их поддержке в каждом пространстве имен можно най-
ти в приложении Б, “Справочник по программированию ADSI 2.5”. Последние сведения об ADSI можно найти по адресу: http://msdn.microsoft.com.
Примечание
В табл. 1.1 наиболее важные, с точки зрения системного администратора, интерфейсы выделены полужирным шрифтом. Символом “+ ” помечены интерфейсы, поддерживаемые в этом пространстве имен, а символом “- ” — неподдерживаемые.
Таблица 1.1. Поддерживаемые по умолчанию интерфейсы провайдеров ADSI
Интерфейс
WinNT
LDAP
NDS
NWCOMPAT
IADs
+
+
+
+
lADsAccessControlEntry
-
+
-
lADsAccessControlList
-
+
+
-
lADsAcl
-
-
+
-
ZADsBackLink
-
-
+
-
lADsCaseIgnoreList
-
-
+
-
lADsClass
+
+
+
+
lADsCollection
+
-
-
+
lADsComputer
+
-
-
+
lADsComputerOperations
+
-
-
+
lADsContainer
+
+
+
+
ZADsDeleteOps
-
+
-
-
lADsDomain
+
-
-
-
lADsEmail
-
-
+
lADsExtension
+
+
-
+
ZADsFaxNumber
■ -
-
+
-
ZADsFileService
+
-
-
+
ZADsFileServiceOperations
+
-
+
ZADsFileShare
+
-
-
+
lADsGroup
+
+
+
+■
lADsHold
-
+
lADsLargelnteger
-.
+
-
-
lADsLocality
-
+
+
-
lADsMembers.
+
+
+
+■
lADsNamespaces
+
+
+
+
lADsNetAddress
-
-
+
-
IADsO
-
+
+
-•
IADSOU
-
+
+
-
IADsObjectOptions
-
+
-
-
lADsOctetList
-
. +
lADsOpenDSObject
+
+
+
-
Окончание табл. 1.1
Интерфейс
WinNT
LDAP
NDS
NWCOMPAT
IADsPath
-
4-
-
IADsPathname
4-
4-
4-
4-
lADsPostalAddress
-
-
4-
-
lADsPrintJob
4-
-
-
4-
TADsPrintJobOperations
4-
-
-
4-
lADsPrintQueue
4-
4-
4-
4-
lADsPrintQueueOperations
4-
4-
4-
4-
lADsProperty■
4-
4-
4-
4-
lADsPropertyEntry
4-
4-
4-
4-
lADsPropertyList
4-
4-
4-
4-
lADsPropertyValue
4-
4-
4-
4-
IADsPropertyValue2
4-
4-
4-
4-
lADsReplicaPointer
-
-
4-
-
lADsRasource
4-■
-
-
-
lADsSecurityDescriptor
-
4-
4-
-
lADsService
4-
-
-
-
lADsServiceOperations
4-
-
-
-
lADsSession
4-
-
-
-
lADsSyntax
.4-
4-
4-
4-.
lADsTimeStamp
-
-
4-
-
lADsTypedName
-
-
4-
-
lADsUser
4-
4-
4-
4-
IDirectoryObject
-
4-
4-
-
IDirectorySearch.
-
' 4-
4-
-
Применение теории: переход от Windows NT 4.0 к Windows 2000 с помощью ADSI
Используя ADSI, можно перенести базу SAM из Windows NT 4.0 в Active Directory Windows 2000. Для этого ADSI имеет все необходимые инструмент^ и средства.
В отличие от базы SAM Windows NT, Active Directory можно использовать для хранения всех относящихся к сотруднику компании данных. Расширенная схема Active Directory позволяет добавлять поля данных, специфичные для компании, к пользовательской записи. Кроме того, можно консолидировать несколько внешних источников данных в одном. Благодаря такой консолидации некоторые данные из общекорпоративной базы данных сотрудников можно поместить в Active Directory, что позволяет создавать полнофункциональную службу каталога.
В настоящее время независимыми разработчиками создано множество инструментов миграции базы SAM Windows NT. Если Active Directory становится центральным хранилищем информации о пользователях, эти инструменты обеспечивают не слишком большую функциональность, создавая лишь новый пользовательский объект в Active Directory и заполняя небольшую часть полей на основе данных SAM. Заполнение остальных полей приходится выполнять вручную или же использовать данные из общекорпоративной базы данных сотрудников, что требует дополнительного программирования. '
Прежде чем приобретать эти дополнительные средства миграции (которые кстати активно используют ADSI), изучите совместное использование ADSI и Visual Basic. После этого создайте необходимые объекты в Active Directory, заполните их поля из базы SAM и обшекорпоративной базы данных сотрудников (или любого ODBC- совместимого источника данных). В любом случае заполнять дополнительные поля Active Directory необходимо самостоятельно; тогда зачем покупать инструментарий, который вы можете создать сами. Кроме того, изучение ADSI поможет не только при выполнении миграции, но и при последующей поддержке новой корпоративной сети.
Резюме
С помощью ADSI администраторы и разработчики получают средства быстрой разработки приложений, которые функционируют в пространствах имен LDAP IIS и Windows NT. До появления ADSI программная манипуляция пространствами имен была доступна лишь “продвинутым" разработчикам, знакомым с API конкретного пространства имен. Реализовав ADSI как набор объектов СОМ, корпорация Microsoft открыла путь к применению в программном управлении пространством имен высокоуровневых контроллеров автоматизации, таких как Visual Basic, Perl, Rexx, JavaScript и VBScript. Так что с помощью этих языков для манипуляции пространством имен системному администратору не нужно быть программистом-гением.
После изучения использования ADSI с COM-серверами, созданными в Visual Basic, можно уменьшить время, затрачиваемое на управление объектами в пространстве имен. С помощью перечисления ADSI необходимые операции можно выполнять для целого класса объектов пространства имен.
Кроме перечисления, возможно использование внешних приложений баз данных для связывания их с Active Directory или другим пространством имен LDAP с помощью ADSI, выступающего в качестве провайдера OLE DB. Такой подход позволяет создавать полнофункциональные приложения службы каталогов компании.
ADSI обеспечивает разработчика и администратора набором функций, позволяющих трансформировать теоретические принципы в практические решения. То, что сегодня можно выполнить с помощью ADSI и Active Directory, было практически невыполнимо еще пару лет назад. Выделите время на изучение ADSI, и вы сможете реализовать инфраструктуру службы каталогов в вашей компании. :
2
' Основы многоуровневой разработки
В следующих главах вы познакомитесь с фрагментами и примерами кода, который можно использовать для создания полнофункционального приложения администрирования сети компании. Скорее всего, вам, как системному администратору, должны быть знакомы темы, рассматриваемые далее, но вполне вероятно, что для написания такого приложения потребуются дополнительные знания в области программирования. В этой главе рассматривается процесс конфигурации среды разработки, с помощью которой вы сможете создать работающие приложения администрирования из фрагментов кода, приведенного в книге. Кроме того, здесь речь пойдет об использовании ADSI и COM-объектов в Visual Basic.
Хотя в этой главе и обсуждаются основные элементы Visual Basic и разработка с использованием технологии СОМ, не следует полагать, что это полный справочник по программированию на Visual Basic. Поэтому начинающим программистам сначала следует изучить основы программирования на Visual Basic. Некоторые источники приведены в приложении В, “Дополнительные источники информации”.
В этой главе речь пойдет о некоторых возможностях Visual Basic. Обратите внимание, что фрагменты кода, приведенные в этой главе, являются сугубо демонстрационными. Более подробное описание разработки приложений ADS1 на Visual Basic вы найдете в последующих главах. '
Не пропускайте эту главу (даже если вы опытный разработчик) — в ней собраны основные сведения об ADSI, Visual Basic и СОМ, а освежить фундаментальные знания полезно всегда.
Почему Visual Basic .
Большинство разработчиков и системных администраторов полагают, что Visual Basic — несовершенный продукт со множеством рудиментов (например, файл VBRUNxxx. DLL, применяемый для запуска приложений, созданных в устаревших версиях Visual Basic), который можно использовать для разработки простеньких приложений баз данных, макросов Microsoft Office или же небольших бесплатных, утилит. Современная среда разработки Visual Basic существенно модернизирована по сравнению с предыдущими версиями, и теперь с ее помощью можно создавать даже многоуровневые приложения. Повсеместное распространение Web-технологии привело к увеличению числа пользователей новой версии Visual Basic, с помощью которой можно создавать практически не потребляющие ресурсов сетевые Web-приложения, небольшие и простые в настройке.
Большая часть информации по ADS1 подразумевает его использование в сценариях Active Server Page (ASP). Несмотря на то что в ASP довольно просто интегрировать код ADS1, существует ряд проблем, которые обсуждаются в следующих разделах.
Типы данных Visual Basic определяются в объявлениях переменных
Скорее всего, вы уже знакомы с типами данных, используемых в методах ADSL В сценариях ASP, написанных на VBScript, настоящие типы данных каждой функции маскируются, т.е. в VBScript для всех переменных используется тип данных Variant.
Необходимо четко понимать роль типов данных в ADSL Они имеют большое значение при выделении ресурсов приложению. Например, многие полагают, что преобразование приложения из VBScript в Visual Basic довольно простая операция. Хотя на самом деле это не так. И эта сложность связана в первую очередь с типами данных. Если оставить используемый в VBScript тип данных Variant, то ваше приложение Visual Basic будет потреблять слишком много ресурсов, поскольку этот же тип данных будет использоваться для всех переменных, что не всегда оправдано. Обязательно обращайте внимание на объявления переменных в примерах этой книги, и вы лучше поймете необходимость правильного выбора типа данных в ADSL
В Visual Basic можно создавать многоуровневые приложения '
- Существует еще одна проблема в реализации кода ADSI в ASP: логика приложения смешана с бизнес-логикой. В ASP довольно сложно понять назначение той или иной функции — принадлежит ли она бизнес-логике или необходима для соответствующего выполнения приложения.
Описанная проблема довольно часто встречается в организациях, которые были объединены с другими и, естественно, впоследствии изменили бизнес-правила. Например, в недавно объединившейся компании руководство может принять решение об изменении принятого стандарта в именовании пользователей корпоративной сети. Если код, определяющий стандарт именования, смешан с кодом, который непосредственно выполняет функцию создания новой учетной записи, системный администратор должен тщательно разобраться в коде ASP и отсеять зерна от плевел, т.е. разыскать необходимые'фрагменты кода и изменить их соответствующим образом. Эта задача на первый взгляд может показаться довольно тривиальной, но что вы скажете, если ASP-страница содержит сотни, а может, и тысячи строк кода?
Для решения описанной проблемы предлагается Component Object Model (COM).
С помощью СОМ в Visual Basic можно отделить бизнес-логику от логики приложения .
Скорее всего, вам приходилось слышать термин п-уровневая (2-, 3-, 4-уровневая и т.д.) архитектура. Microsoft предлагает свое название — Windows DNA. Однако не имеет значения, какой термин вы используете. В данном случае основополагающей является концепция, которую можно описать следующим образом: наиболее эффективна архитектура тех приложений, в которых разделена бизнес- логика и логика приложения.
Большинство приложений и операционных систем следуют описанному принципу, включая практически все современное программное обеспечение, выпускаемое Microsoft. Семейство продуктов Office позволяет создать собственный набор приложений для автоматизации офисных задач. Даже если вы захотите создать хранимую процедуру на SQL Server или же вызвать командный файл, необходимо понять преимущества процедурного программирования.
Рассмотрим “нетехнический” пример: предположим, ч|о вы владелец небольшого магазина в торговом центре. В конце дня необходимо выполнить 25 операций по закрытию магазина. Чтобы помочь в этом служащим магазина, вы создали список действий, которые необходимо выполнить перед его закрытием. После печати и распространения этого списка вы спокойно уходите домой, приказав своим служащим закрыть магазин. А они все необходимые 25 операций выполнят самостоятельно согласно имеющемуся списку.
' Выше описан метод, упрошаюший выполнение повторяющихся или сложных задач в одном атомарном модуле, который можно вызвать с помощью одной команды. Эта концепция получила название многокомпонентная модель объектов (Component Object Model — СОМ). С помощью СОМ вы получаете корректный способ создания объекта и вызова его функций из Web-приложения, инкапсулируя весь код ADSI в СОМ- сервере. При изменении инфраструктуры компании можно просто изменить код COM-сервера, не привлекая Web-разработчиков для изменения ASP, которые ссылаются на объект СОМ.
Продолжим рассматривать пример с магазином. Если вы решите изменить процедуру закрытия магазина (например, после установки нового типа сигнализации), то достаточно будет изменить список действий, а команда “закрыть магазин” не изменяется. Таким образом, вы меняете процедуры закрытия магазина, а ссылка на них остается неизменной и единственной командой.
Visual Basic позволяет быстро и просто создавать COM-объекты, компилируя код в виде ActiveX DLL. Эта процедура более подробно описана далее в главе.
СОМ допускает повторное использование кода
Скомпилировав код в СОМ-объекты, Web-разработчики могут использовать для доступа к ним любой язык, поддерживаемый Web-сервером, и язык сценариев, поддерживающий автоматизацию. Если вы создали COM-объект в Visual Basic, то можете разрешить разработчикам VBScript ссылаться на ваш объект, используя несколько строк кода. Для доступа к этому объекта также можно использовать и JavaScript. Если вы желаете выполнить функции ADS1 в приложении Windows Scripting Host (WSH), то также можете использовать функции, содержащиеся в COM-объекте, написанном на Visual Basic.
Без СОМ все выглядит просто ужасно: вам необходимо заново создавать приложение, которое будет выполнять необходимые действия, например добавлять новую учетную запись пользователя. А с помощью СОМ вы создаете библиотеку повторно используемых компонентов и передаете ее разработчикам, которые, применяя необходимые функции для решения поставленных задач, реализуют соответствующий модуль класса и вызывают необходимые функции в СОМ-сервере. ■
Необходимые компоненты среды разработки
Независимо от выбора дальнейшей стратегии разработки, необходимо установить ADSI, чтобы код, приведенный в книге, можно было использовать в среде Windows NT.
Примечание
В Windows 2000 уже добавлена последняя версия ADSI, так что устанавливать дополнительные компоненты не нужно.
Посетив Web-сервер корпорации Microsoft по адресу: http://www.microsoft.com/ adsi, загрузите установочный файл ADS1 2.5 для вашей операционной системы и архитектуры процессора.
Примечание
Если вы собираетесь использовать сценарии ADSI в IIS Active Server Page под управлением WindowsNT 4.0, то необходимо установить соответствующие библиотеки ADSI на Web-cepвep(ы).
Если вы планируете использовать ActiveX Data Objects (ADO) для доступа к Active Directory или другому пространству имен LDAP, загрузите с Web-сервера Microsoft компоненты Microsoft Data Access Components (MDAC) по адресу: http://www.microsoft.com/data.
Если вы желаете разрабатывать COM-объекты, установите Visual Basic на компьютер разработчика. Поддержка создания объектов СОМ реализована в пятой версии Visual Basic, а шестая версия дополнена новыми средствами и тесно интегрирована с Microsoft Transaction Server (MTS).
Примечание
Для создания объектов СОМ необходимо использовать выпуск Visual Basic Professional ' или Enterprise. Выпуск Learning не обладает средствами компиляции естественного кода, который необходим для создания сервера СОМ.
Для создания компонентов СОМ на системах Alpha, компилируйте ваши объекты с помощью редакции Visual Basic Enterprise, установленной на системе с процессором Alpha.
Для реализации кода в ASP необходим текстовый редактор, например блокнот, сервер I1S версии 3.0 или выше, а также библиотека ADS1, установленная на Web-сервере.
Примечание
Примеры кода Visual Basic, преобразованные в формат VBScript ASP, приведены в приложении А, “Справочник по коду VBScript”, электронную версию которого можно найти по адресу: http://www.williamspublishing.сот.
Настройка среды разработки
После установки Visual Basic и ADSI можно создать шаблон проекта Visual Basic, который впоследствии можно использовать при тестировании и модификации примеров кода, приведенных в книге. Вы можете создать новый проект и вручную настроить среду, выполняя действия, приведенные в упражнении 2.1, или же сохранить настроенный проект в виде шаблона для дальнейшего использования.
Упражнение 2.1. Создание шаблона проекта Visual Basic ,
Запустите Visual Basic..
Примечание
При создании копий экранов использовался выпуск Visual Basic Enterprise, установленный на компьютере под управлением Windows NT 4.0 Workstation.
Появится диалоговое окНо создания нового проекта. Создайте новый проект на основе шаблоне Standard ЕХЕ (рис. 2.1).
Примечание
Если вы отключили отображение диалогового окна New Project при запуске Visual Basic, то для его активизации выберите команду File=>New Project.
На форму Formi добавьте командную кнопку, щелчок на которой будет запускать тестируемый код (рис. 2.2). Размеры и расположение кнопки на форме, а также самой формы не имеют значения.
Рис. 2.1. Диалоговое окно New Project
Рис. 2.2. Создание тестовой формы
Назовите командную кнопку cmdTest. Это имя впоследствии будет использоваться ■ во всех примерах кода.
Выровняйте кнопку на форме и установите ссылку на библиотеку Active DS Туре Library (рис. 2.3). Для этого выберите команду Project^References и в появившемся диалоговом окне References установите соответствующий флажок. Если в этом окне нет флажка Active DS Type Library, проверьте, установлены ли в вашей системе библиотеки ADS1 2.5.
Рис. 2.3. Установка ссылки на библиотеку Active DS Type Library
Сохраните проект. Если вы собираетесь часто создавать приложения ADS1, сохраните проект в папке Template\Projects. После этого пиктограмма нового проекта появится в диалоговом окне New Project. Теперь при запуске проекта ADS1 на форме будет находиться кнопка и будет активизирована ссылка на необходимую библиотеку.
Тестирование примеров кода в некритической среде
Для успешной разработки крупных проектов ADS1, использующих метод Setinfo интерфейса IADs, необходимо создать тестовую среду. Таким образом можно защитить себя от возможных проблем. ' ■ .
Если вы располагаете тестовой средой, то можете отладить и протестировать код приложения перед его запуском в рабочей среде компании. Вы даже не представляете, какой силбй обладает ADS1 и Visual Basic — одна неверная строка кода таит в себе потенциальную опасность, вплоть до потери административных привилегий в сети компании. Операция удаления всех учетных записей пользователей домена выполняется всего лишь секунды, а на восстановление утраченной информации вам понадобится несколько часов. Вот и цена небольшой оплошности или случайного двойного щелчка. Неверный оператор ADS1 может создать объект в пространстве имен, который впоследствии невозможно будет удалить или получить к нему доступ с помощью стандартных средств операционной системы.
Если же в вашем распоряжении нет тестовой среды, создайте изолированный основной контроллер домена (PDC), который можно не восстанавливать при повреждении пространства имен неверной процедурой. Только таким образом можно снизить вероятность появления катастрофических ошибок в корпоративной среде, поскольку вы точно знаете, как поведет себя запускаемый код после тестирования.
внимание
Обязательно примите все меры предосторожности и создайте тестовую среду перед выполнением любых примеров из этой книги.
Взаимодействие ADSI и Visual Basic
Корпорация Microsoft в Windows 2000 представила прекрасный графический инструментарий администратора Microsoft Management Console (ММС), который можно расширять с помошью дополнительных модулей (snap-in), реализующих Необходимые функции. С помощью ММС очень удобно выполнять различные задачи настройки и поддержки, а к тому же он имеет универсальный пользовательский интерфейс. Но этот инструмент не совсем подходит для работы в сети с большим количеством объектов. Многие администраторы для выполнения обычных административных задач на тысяче компьютеров в сети компании используют Visual Basic, который является идеальной средой для выполнения операций подобного рода.
Упражнение 2.2. Использование интегрированной среды разработки Visual Ва- ../ sic в качестве административной консоли.
Попробуем протестировать простой пример, с помощью которого можно узнать все учетные записи пользователей, существующие на выбранном компьютере. Описываемый пример не является “уровнем компании”, но в нем демонстрируется взаимодействие ADS1 и Visual Basic.
Дважды щелкните на командной кнопке, расположенной на форме тестового проекта. Появится окно для ввода кода события Click этой кнопки.
Введите следующий код:
Private Sub cmdTest_Click()
Dim User As TADsUser
Dim Container As TADsContainer
Dim ContainerName As String
ContainerName = "Computer_Name"
Set Container = GetObject("WinNT://" & ContainerName) Container.Filter = Array("User") For Each User In Container
Debug.Print User.Name
Next
End Sub
Замените значение Computer_Name переменной ContainerName именем компьютера в формате NetBIOS. Например, если имя компьютера DEVNYC852I, то строка с назначением имени переменной примет вид:
ContainerName = DEVNYC8521
Нажмите клавишу <F5> для запуска кода.■
В окне Immediate появится список всех учетных записей пользователей, существующих на выбранном компьютере.
Примечание
Для просмотра всех локальных учетных записей на серверах или рабочих станциях можно ускорить процесс, добавив имя домена. Таким образом, строка присвоения значения переменной из приведенного выше примера примет вид:
ContainerName = "ResourceDomain/MachineName"
Отображение списка всех учетных записей пользователей в окне Immediate приведено в качестве примера, а вы можете заменить оператор Debug. Print любым другим, выполняющим определенные действия над каждой учетной записью, например изменение срока действия пароля.
Кроме этого, можно добавить функцию перечисления домена для просмотра всех компьютеров в домене и учетных записей администраторов, а также для установки нового пароля. Естественно, эти действия можно выполнять при наличии соответствующих прав. Описанные действия необходимо выполнять, например, при отзыве административных прав у пользователей, которым известен локальный пароль администратора их рабочей станции Windows NT.
Представьте, сколько времени потребовалось бы для ручного выполнения описанных действий на тысяче компьютеров домена. Даже при выполнении казалось бы простых и обыденных действий помните о возможностях ADSI и Visual Basic.
Внимание
Если у вас нет тестовой среды для экспериментов, то будьте предельно внимательны при запуске кода в функционирующей сети компании, особенно если в этом коде используется запись изменений в пространство имен. '
Разработка COM-сервера с помощью
Visual Basic и ADSI
Некоторым администраторам для выполнения своих задач вполне достаточно среды Visual Basic, но в отдельных случаях требуется более эффективная или даже формальная среда для запуска кода. Такой формальной средой может быть Web-страница.
Чтобы добиться повторного использования кода, можно скомпилировать СОМ- сервер, который будет содержать средства выполнения административных функций. После такой компиляции разработчик с помощью практически любого языка сможет использовать эти функции объекта.
В упражнении 2.3 приведен пример создания COM-сервера, который генерирует новую учетную запись пользователя в пространстве имен Windows NT.
Упражнение 2.3. Пример ActiveX DLL, которая генерирует новую учетную за- ■■пись пользователя .. .
Удалите код предыдущего примера в окне кода события Click командной кнопки и введите следующий код:
Private Sub cmdTest_Click()
Dim Container As lADsContainer'
Dim ContainerName As String
Dim User As lADsUser•
Dim NewUser As String
ContainerName = "Computer_Name"
Set Container = GetObject("WinNT://" & ContainerName)
NewUser = "ADSI_Test_01"
Set User = Container.Create("User", NewUser)'
User.Setinfo'
End Sub
Заменив значение переменной ContainerName именем реального компьютера, запустите код, нажав клавишу <F5>. Щелкните на командной кнопке, а затем закройте форму.
Запустите средство User Manager. Команда для его запуска из командной строки выглядит следующим образом:
usrmgr \\Computer_Name
Найдите новую учетную запись пользователя ADSI_Test_01 и удалите ее. Вернитесь в Visual Basic.
Именно так с помощью кода Visual Basic можно создавать учетную запись пользователя. Теперь модернизируем код, т.е. сделаем его более универсальным.
Если приведенный код не запускается, проверьте, что запуск выполняется от имени учетной записи администратора выбранного компьютера.
В разделе General Declarations (он находится в верхней части окна кода) введите следующий код:
Private Sub CreateUser(ContainerName As String, NewUser As String)
Dim Container As lADsContainer
Dim User As lADsUser
Set Container = GetObject("WinNT://" & ContainerName)
Set User = Container.Create("User", NewUser)
User.Setinfo
End Sub
Обратите внимание, что объявления переменных ContainreName и NewUser и присвоения им значений удалены. Теперь переменные объявляются в скобках после имени подпрограммы.■
Модифицируйте код события Click командной кнопки cmdTest следующим образом:
Private Sub cmd_Click()
Call CreateUser("Computer_Name", "New_User_To_Create")
End Sub.
Замените Computer_Name и New_User_To_Create соответствующими значениями и запустите код. Щелкните на командной кнопке и проверьте создание новой учетной записи пользователя с помощью средств операционной системы.
Приведенный код можно использовать несколько раз, передавая соответствующие значения параметров.
Примечание
Обратите внимание, что форма и командная кнопка используются только для вызова процедуры. COM-серверы не обладают никаким пользовательским графическим интерфейсом. В описываемом примере форма представляет клиента и ее процедура становится методом, определенным в СОМ-сервере.
Теперь модифицируем процедуру в “настоящий” СОМ-сервер.
Сперва необходимо изменить объявление подпрограммы как Public;
Public Sub CreateUser(ContainerName As String, NewUser As String)
Измените способ передачи значений аргументов следующим образом:
Public Sub CreateUser(ByVai ContainerName As String, ByVai NewUser As String).
Скопируйте весь код процедуры CreateUser в буфер обмена для того, чтобы впоследствии вставить его в модуль класса, который и будет вашим первым СОМ-сервером.
Закройте текущий проект Visual Basic, не сохраняя изменений.
JJ. Создайте новый проект на основе шаблона ActiveX DLL.
Вставьте код из буфера обмена в окно кода модуля класса. Переименуйте проект в ADSI_COM, а модуль класса в UserMgmt. Обратите внимание, что имя проекта и класса играют существенную роль в СОМ, поскольку с их помощью выполняется инициализация объекта.
Примечание
Вы можете добавить дополнительные модули класса в одну ActiveX DLL, что позволит логически сгруппировать административные функции. Например, можно создать дополнительный модуль класса для управлениями группами или службами. Эта стратегия применяется на протяжении всей книги при демонстрации примеров.
Поскольку вы создали новый проект, необходимо установить ссылку на библиотеку Active DS Type Library.
Выберите команду File^Make ADSI_COM.DLL. Выберите местоположение создаваемого файла. Visual Basic скомпилирует новый DLL-файл, содержащий функцию CreateUser. Закройте проект ADS1_COM.
Примечание
Обратите внимание, что проекты Standard EXE и ActiveX DLL отличаются только одной строкой кода.■.
Если компиляция прошла успешно, то у вас появился первый СОМ-сервер, созданный с помощью Visual Basic.
Тестирование COM-сервера с помощью Visual Basic
Созданный СОМ-сервер необходимо протестировать. Для этого с помощью Visual Basic создадим клиентское приложение.
Упражнение 2.4. Использование пользовательского COM-сервера в проекте Visual Basic\
Для тестирования сервера ADSI СОМ создайте новый проект на основе шаблона проекта Standard EXE. Выберите команду Project^References. Обратите внимание, что в списке появился новый элемент ADSI_.COM. Установите флажок возле этого элемента.
Добавьте на форму командную кнопку. Дважды щелкните на ней и введите в появившееся окно следующий код события Click:
Private Sub Commandl_Click()
Dim FirstCOM As ADSI_COM.UserMgmt
Set FirstCOM = New ADSI_COM.UserMgmt
Call FirstCOM.CreateUser("ComputerName", "ADSI_COM_Testl")'
End Sub
Если активизировано средство автозаполнения, то после ввода Call FirstCOM. появится окно со списком доступных методов. Аналогичное окно, но с описанием синтаксиса метода CreateUser появляется и при вводе левой открывающей скобки..
Совет
Не забудьте заменить ComputerName именем компьютера.
Запустите проект и щелкните на кнопке Commandl для тестирования СОМ- сервера. Проверьте с помощью средства User Manager появление новой учетной записи пользователя.
Если в списке появилась учетная запись ADSI_COM_Testl, то ваш первый СОМ- объект, созданный с помощью Visual Basic и ADS1, функционирует нормально.
Создание экземпляра COM-объекта из VBScript Active Server Page•
В последнее время бизнес становится интернациональным и, самое главное, глобальным. Соединение подразделений осуществляется с помощью глобальных сетей, которым присущи некоторые ограничения пропускной способности.
Используя HTML, можно объединить мультимедиа-приложения, расположенные на удаленных системах, в одну сеть. Содержимое в виде текста и изображений передается клиентской программе, которая формирует окончательное изображение. На такой модели с “тонким” клиентом в настоящее время фокусируют внимание компании, что позволяет создавать масштабируемые и относительно простые приложения, способствующие продвижению бизнеса.
Естественно, в этой книге нельзя было опустить такое направление развития информационных технологий и проигнорировать реализацию функций ADS1 в среде Web. До этого речь шла об использовании Visual Basic в качестве среды разработки COM-сервера. Теперь можно попытаться создать COM-объект в ASP, получая таким образом преимущества использования ADSI в ASP.
• Упражнение 2.5. Создание экземпляра объекта adsi_ccm.dll из сценария
■ 5Active Server Page : .
Если вы желаете использовать этот объект в 1IS, скопируйте adsi_com.dll на сервер IIS. Затем в консоли сервера откройте окно ввода команд и перейдите в месторасположение скопированного файла. Для регистрации DLL-файла введите следующую команду:
REGSVR32 ADSI_CCM.DLL
После успешной регистрации появится соответствующее диалоговое окно.
После создания соответствующих записей в системном реестре создайте экземпляр объекта в ASP, используя следующий код:
<%@ Language=VBScript %>
<%Dim FirstCOM
Set FirstCOM = Server.CreateObject("ADSI_COM.UserMgmt")
Call FirstCOM.CreateUser("ComputerName", "ADSI_COM_ASP1")
Response.Write Err.Number.
%>
Сохраните ASP-файл и установите разрешение NTFS для чтения (только для учетных записей Administrators и System).
Проверьте, активизирована ли с помощью Internet Service Manager аутентификация Basic или NTLM.
Протестируйте созданную страницу в любом броузере. Если в результате возвращается значение 0, значит, вы успешно создали новую учетную запись пользователя ADSI_COM_ASP1.-
Несмотря на простоту, приведенный пример показывает преимущества совместного использования COM-объекта и ASP. Совсем несложно превратить этот простой пример в мощное приложение: для этого достаточно добавить необходимый код, с помошью которого можно создавать учетные записи пользователей, соответствующие принятому в компании стандарту именования пользователей.
Сокет
Проверьте, чтобы разрешения NTFS для доступа к файлу были установлены для учетных записей Administrators и System. Если пользователь с анонимным доступом попытается обратиться к этому файлу, то ему будет отказано в доступе. Подобные сообщения об ошибках чаще всего появляются при проблемах с разрешениями NTFS и/или неверно выбранном режиме аутентификации сервера IIS.'
Создание модели делегирования с помощью DCOM
Если вы хотите обычным пользователям предоставить административные полномочия для выполнения некоторых задач в пространстве имен, то нужно позволить им имперсонализировать себя при доступе к ресурсам.
Если вы не беспокоитесь о безопасности сети компании, то можете добавить анонимную учетную запись пользователя в группу администраторов, чем и достигается необходимая имперсонализация. При таком способе “хитрый” (но подготовленный) пользователь может выполнить запрос к метабазе IIS и найти пароль, присвоенный этой учетной записи, таким образом получая в свое распоряжение привилегированную учетную запись в сети компании. А кроме того, такой способ пробивает потенциальную “дыру” в системе безопасности, так что из Web открывается несанкционированный доступ к сети компании.
' Если вас как системного администратора волнует безопасность сети компании, то необходимо использовать более безопасные методы. Например, установив Microsoft Transaction Server (MTS) и Distributed Component Object Model (DCOM), можно использовать функции ADSI под различными учетными записями пользователей, т.е. делегировать модель администрирования.
Примечание
MTS — это свободно распространяемый компонент, который поставляется с Windows NT Option Pack и устанавливается как интегральная часть сервера IIS. Многие пользователи полагают, что MTS предназначен исключительно для поддержки транзакций базы данных, но его также можно использовать для включения в работу DCOM внутрипроцессорных компонентов HS.
Более подробное описание возможностей использования MTS и DCOM выходит за рамки данной книги. Дополнительную информацию об этих технологиях можно найти в литературе, список которой приведен в приложении В, “Дополнительные источники информации ”.
Представьте себе, что можно разрешить обычному пользователю удалить пароли, запретить или разблокировать учетную запись без надлежащих прав, т.е. он не является членом групп Account Operators, Domain Admins и т.п. Если в вашей организации слишком много администраторов, то с помощью ADSI, СОМ и MTS можно создать модель делегации, которая снизит риск несанкционированного доступа.
Запуск компонентов. СОМ в MTS■
Чтобы запретить использование функций ADSI с привилегированными учетными записями, можно создать модель делегации. С помощью этой модели пользователь сможет выполнять административные задачи, не являясь администратором. В- Windows 2000 это осуществляется в Active Directory.
Еше более ощутить преимущества СОМ поможет упражнение 2.6, в котором рассматривается запуск ранее созданного сервера adsi_com.dll под идентификатором учетной записи администратора..
. Упражнение 2.6. Установка модели делегации с помощью Microsoft Transac- ‘■ tion Server и Distributed Component Object Model
Вначале создайте новый пакет для запуска в нем сервера СОМ (рис. 2.4).
Рис. 2.4. Создание нового пакета MTS
Запустите Internet Service Manager и разверните содержимое папки Microsoft Transaction Server. Щелкните правой кнопкой мыши на папке Packages Installed и из появившегося контекстного меню выберите команду New^Package.
В качестве примера создайте пустой пакет (рис. 2.6).
Совет
Если необходимо установить пакет на несколько серверов, вы можете экспортировать существующие пакеты, а затем с помощью средства Package Wizard (рис. 2.5) их импортировать на необходимые серверы.
Рис. 2.5. Создание пакета с помощью средства
Package Wizard
Рис. 2.6. Создание пустого пакета
Введите описательное имя пакета MTS (оно не используется в программировании). Пакет представляет собой контейнер компонентов СОМ.
Если вы хотите запустить компоненты, содержащиеся в пакете, с альтернативной идентификацией (таким образом определяется модель делегирования), выберите учетную запись в диалоговом окне Set Package Identity (рис. 2.7). В большинстве случаев необходимо использовать привилегированную "учетную запись для идентификации пакета.
Рис. 2.7. Выбор учетной записи
Внимание
Если вы выберете привилегированную учетную запись для идентификации, пользователи, не имеющие административных прав, смогут использовать функции в сервере СОМ. В некоторых случаях это необходимо, но не забудьте оценить последствия такого выбора.
Щелкните на кнопке Finish для завершения создания пакета. Теперь необходимо наполнить пакет компонентами СОМ.
Откройте новый пакет и щелкните правой кнопкой мыши на папке Components. Из появившегося контекстного меню выберите команду New^Component.
Если вы уже зарегистрировали компонент, его можно импортировать в пакет, щелкнув на кнопке Import components that ere already registered. В большинстве случаев расположение DLL-файла известно. После щелчка на кнопке Install New Components щелкните на кнопке Add Files для добавления файлов компонентов СОМ-сервера. .
После выбора местоположения сервера щелкните на кнопке Finish для завершения установки СОМ-сервера.
Чтобы предотвратить неавторизованное использование СОМ-сервера, можно назначить роли MTS отдельным модулям классов внутри СОМ-сервера. MTS позволяет назначить группы безопасности Windows NT ролям, которые впоследствии назначаются каждому классу в компоненте.
Кроме того, иногда необходимо использовать несколько типов групп в СОМ- сервере для предотвращения неавторизованного применения процедур, содержащихся в объекте. Таким образом создается максимально разделенная административная модель, каждая функция которой перед исполнением проверит членство пользователя в определенной группе.
Примечание
Пример делегированного COM-сервера можно найти по адресу: http://www.williamspublishing.сот.
Используя методику, описанную в упражнении 2.6, можно разрешить выполнять функции COM-сервера под различными идентификаторами, не меняя при этом код клиента. Таким образом пользователь с неадминистративными полномочиями может создать новую учетную запись пользователя.
При создании объекта из ASP необходимый модуль класса будет запускаться в контексте MTS, обеспечивая стабильность и увеличивая различные параметры, доступные системному разработчику.
Резюме
Кроме создания СОМ-объектов, Visual Basic наилучшим образом подходит для освоения ADSL Интегрированная среда разработки Visual Basic позволяет выполнять административные задачи на отдельном компьютере или в сети компании. Если вам необходимо выполнить функции управления на нескольких компьютерах, то вместо ММС можете спокойно использовать среду Visual Basic. Не жалейте времени, потраченного на разработку сценария — оно компенсируется при выполнении повседневной работы.
В небольших сетях код ADSI можно выполнять непосредственно из ASP, а в крупных сетях инкапсуляция кода ADSI в COM-сервер дает следующие преимущества:
разделение логики работы приложения на бизнес-код и код приложения;
возможность распространения кода среди разработчиков, использующих различные языки программирования;
имперсонализация привилегированной учетной записи для создания модели делегирования с помощью MTS/DCOM.
Несмотря на то что в этой главе приведено довольно поверхностное описание процесса разработки COM-сервера с помощью Visual Basic, скорее всего, вы откроете для себя ряд преимуществ COM-объектов, в частности простоту их создания.
Если вы не приобрели Visual Basic и можете реализовать ваш код в виде СОМ-сервера, . загрузите скомпилированные компоненты по адресу http://www.williamspublishing.com и используйте их из ASP. Необходимый код VBScript приведен в приложении А, “Справочник по коду VBScript”.
Все примеры кода ADSI, приведенного в этой книге, после небольшой модернизации можно использовать для эффективного администрирования сети вашей компании.
Часть II
Исследование провайдеров ADSI: Windows NT
Методы перечисления контейнера и программное управление политикой учетных записей домена
Программное управление учетной записью пользователя•
Программное управление группой
Программное управление компьютером и службами■
Программное управление файловыми ресурсами и ресурсами печати
3
Методы перечисления контейнера и программное управление политикой учетных записей домена
Комбинируя фрагменты кода церечисления, приведенные в этой главе, с кодом, приведенным в главах части II, “Исследование провайдеров ADSI: Windows NT”, вы сможете довольно быстро создать приложение, позволяющее манипулировать пространством имен Windows NT или же его частью.
С помощью одних функций перечисления можно получить недостаточно информации, которая находится в User Manager или Server Manager. Однако комбинируя фрагменты кода манипуляции объектов, приведенного в книге, вы с помощью нескольких строк кода сможете уменьшить число выполняемых вручную повседневных задач управления.
Интерфейс lADsDomain предназначен для программного управления политикой учетных записей в выбранном домене. Точно так же, как вы управляли сроком действия или длиной пароля одной учетной записи пользователя с помощью интерфейса lADsUser, можно запрашивать и модифицировать установленные по умолчанию политику блокировки учетных записей, срок действия пароля, его длину и т.д., которые применяются ко всем учетным записям пользователя в домене.
В этой главе рассматриваются программные методы, необходимые для управления перечисленными функциями с помощью сценариев, написанных на языке Visual Basic. Вы узнаете следующее:
перечисление доменов в пространстве имен Windows NT;
управление свойствами домена Windows NT;
• перечисление объектов домена или компьютера;
создание и удаление объектов с помощью интерфейса TADsContainer.
Перечисление доменов в пространстве имен Windows NT
Используя ADSI, получить полный список доменов Windows NT сети компании невероятно просто. Эта операция выполняется с помощью связывания идентификатора пространства имен WinNT: и последующего применения цикла For... Each.
Описываемый процесс перечисления особенно полезен при проектировании администраторских приложений Visual Basic или Web. Позволяя выбрать необходимый домен из раскрывающегося списка, вы снизите число орфографических ошибок при вводе и увеличите эргономическую эффективность приложения. Такое решение позволяет реализовать более эффективный код, с помощью которого можно избежать критических ошибок при выборе домена.
Перечисление доменов с помощью Visual Basic
Для отображения всех доменов пространства имен Windows NT используйте следующий код Visual Basic:
Dim. NameSpace As lADsContainer
Dim Domain As IADs
Set NameSpace = GetObject("WinNT:")
For Each Domain In NameSpace-
Debug.Print Domain.Name
Next
Совет
При инициализации административного приложения используйте приведенный код вместе с раскрывающимся списком или другим элементом управления, обеспечивающим более эффективный выбор домена для дальнейшего управления.
Управление свойствами домена Windows NT
Выбрав домен, можно управлять параметрами политики его учетных записей. Свойства интерфейса lADsDomain напрямую связаны с элементами управления диалогового окна Account Policy (рис. 3.1), открывающегося с помощью средства User Manager for Domain.
Связывание доменов с помощью Visual Basic
Перед управлением свойствами домена необходимо связать его с контейнерным объектом. Для этого используйте приведенный ниже код Visual Basic. Обратите внимание, что этот код необходимо выполнять перед управлением любыми свойствами политики учетных записей этого домена.
Dim Domain As lADsDomain
Dim DomainName As String
DomainName = "Domain_Name_To_Manage"
Set Domain = GetObject("WinNT://DomainName, domain")
Если вы планируете установить или узнать значение нескольких свойств в одном домене, связывать домен нужно лишь один раз на время существования функции.
Примечание
Операция связывания дорогого стоит в смысле производительности приложения, так что используйте связывание разумно. Производительность связывания увеличивается при определении имени класса с объектом: GetObject ("WinNT://DomainName, domain ”).
Рис. 3.1. Диалоговое окно Account Policy
Если код устанавливает значения нескольких свойств, то необходимо вызвать метод Setinfo один раз во время существования фрагмента кода. Следуя этому совету, можно значительно повысить производительность* приложения, снижая сетевую нагрузку, поскольку операция записи выполняется в пространстве имен только один раз.
В сценарии может использоваться несколько доменов; применяйте метод Setinfo для записи информации в базу SAM перед операцией связывания в новом домене. Таким образом, соответствующие данные сохраняются в домене перед началом повторного заполнения кэша свойств информацией, извлеченной из нового домена.
Связывая и записывая информацию в домен только один раз, вы добьетесь оптимальной производительности разрабатываемого приложения.
Анализ безопасности
Для управления всеми свойствами политики учетных записей (как просмотром значений, так и их установкой) необходимы права администратора в связанном домене. Чаще всего ошибки выполнения возникают из-за отсутствия необходимых прав.
Просмотр и установка нового значения свойства . AutoUnlocklntreval
Свойство AutoUnlocklntreval интерфейса lADsDomain позволяет установить промежуток времени перед автоматическим сбросом флага блокировки в заблокированной учетной записи пользователя. В диалоговом окне Account Policy этот интерфейс программно управляет параметром Lockout Duration.
Просмотр значения свойства AutoUnlocklntreval с помощью Visual Basic
Используя следующий код Visual Basic, можно просмотреть значение времени ожидания (в секундах), в течение которого учетная запись автоматически разблокируется.
Dim Domain As lADsDomaiji-;,.
Dim DomainName As String
DomainName = "Domain_Name_To_Manage"
Set Domain = GetObjectfWinNT://" & DomainName)
Dim RetVal As Long
RetVal = Domain.AutoUnlocklnterval Debug.Print RetVal
Установка нового значения свойства AutoUnlocklntreval
с помощью Visual Basic
Если вы желаете изменить значение времени ожидания (в секундах), в течение которого учетная запись автоматически разблокируется, установите новое значение свойства AutoUnlocklntreval, а затем используйте метод Setinfo для внесения изменений в пространство имен.
Dim Domain As lADsDomain Dim DomainName As String DomainName = "Domain_Name_To_Manage".
Set Domain = GetObject("WinNT://" & DomainName)
Dim NewValue As Integer
NeWalue = 7200■
Domain.AutoUnlocklnterval = NewValue Domain.Setlnfо
После выполнения приведенного кода откройте диалоговое окно Account Policy и посмотрите на значение параметра Lockout Duration — оно должно быть равно 120 минут (7 200 секунд). Обратите внимание, что значение этого параметра в диалоговом окне отображается в минутах, а с помощью свойства AutoUnlocklnterval интерфейса lADsDomain — в секундах.’
Совет
Для установки “бесконечного ” ожидания снятия автоматической блокировки (параметр Forever (until admin unlock) диалогового окна Account Policy) установите значение Свойства AutoUnlocklnterval равным -1. .
Просмотр и установка нового значения свойства Lockoutobservationinterval ,
Свойство Lockoutobservationinterval определяет промежуток времени, в течение которого контроллер домена хранит число неверных попыток регистрации в домене перед сбросом пользовательского значения BadLoginCount в 0. Значение этого свойства соответствует параметру Reset Count After п Minutes в диалоговом окне Account Policy. . ■
Просмотр значения свойства Lockoutobservationinterval с помощью Visual Basic .
Значение свойства Lockoutobservationinterval, как и AutoUnlocklnterval, устанавливается в секундах. Для того чтобы избежать переполнения буфера при использовании типа данных Integer, старайтесь всегда применять тип данных Long.'
Рассмотрим следующий фрагмент кода Visual Basic для просмотра значения свойства Lockoutobservationinterval:
Dim Domain As lADsDomain
Dim DomainName As String
DomainName = " Domain_Name_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)
Dim RetVal As Long_
RetVal = Domain.Lockoutobservationinterval
Debug.Print RetVal
Установка нового значения свойства
Lockoutobservationinterval с помощью Visual Basic
Если вы желаете изменить промежуток времени, в течение которого Windows NT отслеживает число неверных попыток регистрации в домене, то можете установить новое значение свойства Lockoutobservationinterval, используя следующий код Visual Basic:
Dim Domain As IADsDornain
Dim DomainName As String
DomainName = " Dorna in_Name_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName) '
Dim NewValue As Long
NewValue = 1800
Domain.Lockoutobservationinterval = NewValue
Domain.Setinfo
Совет
Значение 1 800 соответствует промежутку времени 30 минут, по истечении которого контроллер домена снимет блокировку учетной записи при неверной регистрации.
Просмотр и установка нового значения свойства MaxBadPasswordsAllowed
Это свойство вместе со значением свойства Lockoutobservationinterval устанавливает число неверных попыток регистрации в домене перед блокированием учетной записи. Значение свойства MaxBadPasswordsAllowed соответствует значению параметра Lockout after п bad logon attempts в диалоговом окне Account Policy.
Просмотр значения свойства MaxBadPasswordsAllowed с помощью Visual Basic
Используя приведенный ниже код Visual Basic, можно просмотреть значение свойства MaxBadPasswordsAllowed (от 0 до 999), представляющего число попыток неверной регистрации в домене перед блокированием учетной записи.
Dim Domain As lADsDomain
Dim DomainName As String
DomainName = " Domain_Name_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)
Dim RetVal As Integer.
RetVal = Domain.MaxBadPasswordsAllowed
Debug.Print RetVal
Установка нового значения свойства MaxBadPasswordsAllowed с помощвю Visual Basic
Чтобы установить новое число попыток неверной регистрации в домене, после которых блокируется учетная запись, установите новое значение свойства MaxBadPasswordsAllowed с помощью либо непосредственного присвоения (например, Domain.MaxBadPasswordsAllowed = 4), либо переменной. Для этого используйте следующий код Visual Basic:
Dim Domain As TADsDomain Dim DomainName As String DomainName = "Domain_Name_To_Manage" Set Domain = GetObject("WinNT://" & DomainNaine)
Dim NewValue As Integer
NewValue = 5
Domain.MaxBadPasswordsAllowed = NewValue
Domain.Setinfo
Просмотр и установка нового значения свойства MaxPasswordAge
Чтобы предотвратить риск несанкционированного доступа к системе с помощью пользовательского пароля с неограниченным сроком действия, во многих компаниях устанавливаются правила устаревания паролей пользователей. Программное управление этим ограничением осуществляется с помощью свойства MaxPasswordAge, соответствующего параметру Maximum Passwords Age в диалоговом окне Account Policy.
Просмотр значения свойства MaxPasswordAge с помощью Visual Basic
Используйте следующий код Visual Basic для просмотра срока действия пользовательского пароля:
Dim Domain As lADsDomain
Dim DomainName As String
DomainName = "Domain_Name_To_Manage"
Set Domain = GetObject("WinNT://" s DomainNaine)
Dim RetVal As Long
RetVal = Domain.MaxPasswordAge
RetVal = RetVal/86400,
Debug.Print RetVal.
Примечание
Обратите внимание, что значение параметра Maximum Passwords Age в диалоговом окне Account Policy определяется в днях, а значение свойства MaxPasswordAge — в секундах. Поэтому для соответствующего преобразования используется коэффициент пересчета — 86 400. Чтобы пароль не имел ограничения срока действия, установите значение свойства MaxPasswordAge равным -1.
Установка нового значения свойства MaxPasswordAge:
с помощью Visual Basic♦ ■
Установив новое значение свойства .MaxPasswordAge интерфейса lADsDomain, можно изменить сррк действия пользовательского пароля. Для этого воспользуйтесь следующим кодом Visual Basic:
Dim Domain As lADsDomain
Dim DomainName As String
DomainName = " Domain_Name_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)
Dim NewValue As Long
NewValue = 2592000
Domain.MaxPasswordAge = NewValue
Domain.Setlnfо
Просмотр и установка нового значения свойства
MinPasswordAge
Кроме срока действия пароля, можно установить временной интервал, в течение которого пользователь не сможет изменить свой пароль. В диалоговом окне AdcOunt Policy для этого служит параметр Minimum Password Age, а для программного управления используется значение свойства MinPasswordAge.
Просмотр значения свойства MinPasswordAge с помощью Visual Basic
Для просмотра временного интервала, в течение которого пользователь не сможет изменить свой пароль, используйте следующий код Visual Basic:
Dim Domain As lADsDomain
Dim DomainName As String
DomainName = " Domain_Name_To_Manage".
Set Domain = GetObject("WinNT://" & DomainName)
Dim RetVal As Long
RetVal = Domain.MinPasswordAge
RetVal = RetVal/86400
Debug.Print RetVal
Установка нового значения свойства MinPasswordAge.
с помощью Visual Basic
Для изменения времени, в течение которого пользователь не сможет изменять свой пароль, воспользуйтесь кодом
Dim Domain As lADsDomain
Dim DomainName As String
DomainName = "Domain_Name_To_Manage"'
Set Domain = GetObject("WinNT://" & DomainName)
Dim NewValue As Long
NewValue = 0•
Domain.MinPasswordAge = NewValue
Domain.Setinfo.
Совет
Обратите внимание, что значение свойства MinPasswordAge выражается в секундах. Так что не забудьте выполнять необходимые преобразования. Для немедленного изменения пароля пользователем, установите значение этого свойства равным 0.
Просмотр и установка нового значения свойства MinPasswordLength
Используя это свойство интерфейса lADsDomain, можно управлять минимальной длиной пароля для всех пользователей домена. Свойству MinPasswordLength соответствует параметр Minimum Password Length в диалоговом окне Account Policy.
Во многих компаниях используются пароли длиной не менее шести символов. Время, затрачиваемое злоумышленником на прямой подбор пароля, зависит от длины этого пароля. Однако следует отметить, что длина пароля не самый важный компонент в системе безопасности. Например, время подбора пароля снижается практически независимо от его длины, если в качестве пароля используются известные слова или их комбинации. Помните, что выбор оптимальной длины пароля — первый шаг по обеспечению несанкционированного доступа к особо важным ресурсам сети компании.
Совет
Наилучший способ защиты от подбора пароля — это использование утилиты syskey, с помощью которой можно зашифровать базу SAM.'
Просмотр значения свойства MinPasswordLength
с помощью Visual Basic■
Для просмотра текущего значения минимальной длины пароля воспользуйтесь следующим кодом Visual Basic:
Dim Domain As lADsDomain
Dim DomainName As String
DomainName = " Domain_Name_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)
Dim RetVal As Long
RetVal = Domain.MinPasswordLength
Debug.Print RetVal
Установка нового значения свойства MinPasswordLength
с помощью Visual Basic ■
. Для изменения минимальной длины пароля установите новое значение свойства MinPasswordLength интерфейса lADsDomain. Это изменение проявляется только тогда, когда пользователь изменяет свой пароль, т.е. старые пароли могут и не соответствовать новому ограничению.■
Для установки нового значения свойства MinPasswordLength используйте следующий код Visual Basic:
Dim Domain As lADsDomain
Dim DomainName As String
DomainName = ”Dornain_Name_To_Manage"’■
Set Domain = GetObject("WinNT://" & DomainName)
Dim NewValue As Long
NeWalue = 7
Domain. MinPasswordLength = NeWalue
Domain.Setinfo
Сонет
Если вы хотите разрешить использование в домене пустых паролей, установите значение свойства MinPasswordLength равным -1.
Просмотр и установка нового значения свойства PasswordHistoryLength
Значение этого свойства определяет число паролей, которые Windows NT хранит для каждого пользователя домена. Это свойство предотвращает повторное использование одинаковых паролей при их смене. Программное манипулирование свойством PasswordHistoryLength соответствует параметру Password Uniqueness в диалоговом окне Account Policy.
Просмотр значения свойства PasswordHistoryLength с помощью Visual Basic
Для просмотра количества хранимых Windows NT паролей используйте следующий код Visual Basic:
Dim Domain As lADsDomain
Dim DomainName As String
DomainName = "Domain_Name_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)
Dim RetVal As Long
RetVal = Domain.PasswordHistoryLength
Debug.Print RetVal
Установка нового значения свойства PasswordHistoryLength с помощью Visual Basic
Если вы желаете, чтобы при изменении паролей пользователь использовал только уникальные пароли, с помощью следующего кода Visual Basic введите новое значение свойства PasswordHistoryLength интерфейса lADsDomain.
Dim Domain As lADsDomain
Dim DomainName As String.
DomainName = ”Domain_Name_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)‘
Dim NeWalue As Long
NeWalue = 3
Domain. PasswordHistoryLength = NeWalue
Domain.Setinfo
При изменении пароля Windows NT проверяет, не соответствует ли новый пароль одному из ранее использовавшихся, число которых определяется значением свойства PasswordHistoryLength.
Совет
Для деактивизации хранения истории использования паролей установите значение свойства PasswordHistoryLength равным -1.
Перечисление объектов домена или компьютера
В дальнейшем с помощью перечисления имен домена (сервера или рабочей станции) можно просмотреть объекты, входящие в определенный контейнер. Для просмотра содержимого контейнера домена свяжите сам контейнер, а затем с помощью цикла For... Next возвратите содержимое контейнера для просмотра или манипулирования.
Такой метод перечисления будет возвращать все содержимое любой базы SAM — контроллера домена, сервера или рабочей станции.
Перечисление объектов общего контейнера
Чтобы лучше понять концепцию перечисления объектов контейнера, представьте себе папку, содержащую все ваши места работы. Вы могли работать, например, художником (контейнер); каждая папка этой папки содержит темы вашей работы, которые, в свою очередь, содержат рисунки и фотографии..
При перечислении контейнера вы его выделяете и просматриваете все объекты, находящиеся внутри него. В рассматриваемом примере эта операция аналогична выделению темы и просмотру содержащихся в ней работ, тематика которых может быть различна.
Перечисление с помощью Visual Basic
Для перечисления всех объектов в любом контейнере используйте следующий код Visual Basic:
Dim Container As TADsContainer
Diam ContainerName As String
ContainerName = "Container_Name_To_Manage"
Set Container = GetObject("WinNT://" & ContainerName)
Dim Leafobject As IADs
For Each Leafobject In Container
Debug.Print Leafobject.Name
Next
( Ънет
Для перечисления домена замените значение Container_Name_To_Manage переменной ContainerName реальным именем домена. Для перечисления серверов или рабочих станций, входящих в домен, используйте их имена следующим образом: Domain_Name/Computer_Name.
Применение фильтра для перечисления .
В предыдущем фрагменте кода возвращались объекты всех классов, содержащихся в домене (или локальной базе SAM), поскольку тип объектов, выбранных для просмотра контейнера, не определялся. Если запустить этот фрагмент кода в домене, содержащем большое число объектов, то отображение результата перечисления займет много времени. Для уменьшения объема возвращаемых данных в ADSI можно создать фильтр перечисления.
В случае объекта домена в пространстве имен Windows NT этот фильтр может включать учетные записи пользователей, группы, учетные записи компьютеров, служб
или даже любой класс объектов. Применяя фильтр в rij^Jicce перечисления, можно существенно увеличить производительность запроса,' что обеспечивает более оптимальное использование ресурсов системы.
Вернемся к примеру с фотографиями. Например, вы можете просмотреть фотографии, которые были сделаны на последнем месте вашей работы.
Перечисление учетных записей пользователей с помощью Visual Basic
Установив значение свойства Filter интерфейса lADsContainer равным массиву, содержащему строку User, можно сузить перечисление контейнера до объектов, принадлежащих классу User. Используйте для этого следующий код Visual Basic:
Dim Container As lADsContainer
Dim ContainerName As String
ContainerName = ’’ Contains r_Name_To_Manage"'
Set Container = GetObject("WinNT://" £ ContainerName)
Container.Filter = Array("User")
Dim User As TADsUser
For Each User In Container
Debug.Print User.Name'
Next
Перечисление учетных записей компьютеров с помощью Visual Basic
Установив значение свойства Filter интерфейса lADsContainer равным массиву, содержащему строку Computer, можно перечислить все учетные записи компьютеров, определенных в базе SAM операционной системы Windows NT. Используйте для этого следующий код:
Dim Container As lADsContainer
Dim ContainerName As String
ContainerName = " Containe'c_Nams_Tq_Manage"
Set Container = GetObject("WinNT://" & ContainerName)
Container.Filter = Array("Computer")
Dim Computer As lADsComputer
For Each Computer In Container
Debug.Print Computer.Name■
Next
Перечисление групп с помощью Visual Basic
Для перечисления всех групп, определенных в базе SAM операционной системы Windows NT, используйте код
Dim Container As lADsContainer
Dim ContainerName As String
ContainerName = " Container_Name_To_Manage"
Set Container = GetObject("WinNT://" & ContainerName)
Container.Filter = Array("Group")
Dim Group As lADsGroup
For Each Group In Container
Debug.Print Group.Name
Next•
Совет
В приведенном коде отображаются все группы, т.е. не происходит их разделения на локальные и глобальные. Для просмотра только локальных групп установите значение свойства Filter интерфейса lADsContainer равным Array ("LocalGroup"), а для просмотра глобальных групп — Array ("Globa IGroup ").
Создание и удаление объектов с помощью интерфейса lADsContainer
Как и контейнер объектов, домен должен обладать возможностью создания и удаления объектов внутри контейнера. Методы Create и Delete интерфейса lADsContainer позволяют удалять учетные записи компьютеров, учетные записи пользователей и группы в домене.
Примечание
Для добавления или удаления объектов в контейнере домена необходимы права администратора. Чаще всего ошибки выполнения возникают из-за отсутствия необходимых прав.
Добавление и удаление учетных записей компьютеров
Для любого компьютера под управлением операционной системы Windows NT, участвующего в системе безопасности домена, в ресурсах домена сперва необходимо создать учетную запись этой системы. Обычно такая учетная запись создается с помощью средства Server Manager.
С помощью ADSI можно добавить или удалить учетные записи компьютеров, используя при этом все преимущества программной автоматизации процесса администрирования.
Добавление новой учетной записи компьютера с помощью Visual Basic
Создание учетной записи компьютера аналогично созданию учетной записи пользователя, за исключением следующего:
объект должен быть создан с использованием класса “computer”;
у объекта должен быть установлен пользовательский флаг ads_uf_ WORKSTAT I ON_TRUST_ACCOUNT ( Ox 10 0 0);
начальный пароль учетной записи должен соответствовать имени компьютера, введенного строчными символами.
Для создания новой учетной записи компьютера в домене используйте следующий код Visual Basic:
Dim Container As lADsContainer
Dim ContainerName As String
ContainerName = "Container_Name_To_Manage"
Set Container = GetObject("WinNT://" £ ContainerName)
Dim Computer As TADsComputer
Dim NewComputer As String
NewComputer = " Computer_Account_To_Create"'
Set Computer = Container.Create("Computer", UCase(NewComputer)) Computer.SetInfо
Set ComputerAccount = GetObject("WinNT://" & ContainerName & _ "/" NewComputer & "$,user")
ComputerAccount.Put "UserFlags", (ComputerAccount.Get _ ("UserFlags") Or &H1000)
ComputerAccount.SetPassword (LCase(NewComputer))
ComputerAccount.SetInfo
Примечание
Обратите внимание, что в приведенном фрагменте кода применяется три типа связывания. После связывания контейнера новый компьютерный объект создается и записывается в пространство имен. Затем новый объект связывается как пользовательский объект, определяются значения некоторых его свойств, что в целом позволяет добавить компьютер к домену..
Удаление учетной записи компьютера с помощью Visual Basic
Чтобы удалить учетную запись компьютера простоя, свяжите контейнерный объект и вызовите метод Delete для удаления его из контейнера. В отличие от метода Create, удаление выполняется немедленно, т.е. метод Setinfo можно не вызывать для внесения изменений в базу SAM.
Dim Container As lADsContainer
Dim ContainerName As String
ContainerName = "Container_Name_To_Manage"
Set Container = GetObject("WinNT://" s ContainerName)
Dim ComputerToRemove As String
ComputerToRemove = "Computer_Account_To_Remove"
Call Container.Delete("Computer", ComputerToRemove)
Добавление, удаление и переименование учетных записей пользователей
Используя объекты lADsContainer и lADsUser, можно создать новую учетную запись пользователя в домене. Этот процесс подобен использованию средства User Manager for Domain без установки дополнительных свойств учетной записи (например, полное имя, описание, принадлежность к группе, пароль и т.д.). Эти свойства более подробно описываются в главе 4, “Программное управление учетной записью пользователя”.
Несмотря на то что имена переменных и типы данных изменяются для соответствия классу нового объекта, синтаксис, используемый для создания новой учетной записи пользователя или группы, практически идентичен. Кроме того, можно переименовать учетную запись, используя метод MoveHere объекта lADsContainer.
Добавление новой учетной записи пользователя с помощью Visual Basic■
После связывания контейнера вызовите метод Create объекта lADsContainer для создания нового объекта в контейнере. Для добавления новой учетной записи пользователя используйте следующий код Visual Basic:
Dim Container As TADsContainer
Dim ContainerName As String
ContainerName = ”Container_Name_To_Manage"
Set Container = GetObject("WinNT://" & ContainerName)
Dim User As TADsUser
Dim NewUser As String
NewUser = "User_Account_TO_Create"
Set User = Container.Create("User", NewUser)
User.SetInfо
Сокет
Если вы хотите установить свойства пользовательского объекта, такие как .описание или полное имя, ассоциированные с учетной записью, делайте это до вызова метода Setinfo. Обратите внимание, что операция set password выполняется немедленно. Учетная запись должна существовать до начала манипуляций с ее паролем. Более подробная информация об этом приведена в главе 4, “Программное управление учетной записью пользователя ”.
Удаление учетной записи пользователя с помощью Visual Basic
В отличие от добавления нового объекта в контейнер, для удаления объекта из контейнера необходимо лишь вызвать метод Delete интерфейса TADsContainer. Чтобы удалить учетную запись пользователя, используйте следующий код Visual Basic:
Dim Container As TADsContainer■
Dim ContainerName As String
ContainerName = "Container_Name_To_Manage"
Set Container = GetObject("WinNT://" & ContainerName)
Dim UserToRemove As String
UserToRemove = nUser_Account_To_Remove”
Call Container.Delete("User", UserToRemove)
Переименование учетной записи пользователя с помощью Visual Basic
Поскольку каждой учетной записи соответствует ее идентификатор безопасности (Security Identifier — SIP), Windows NT позволяет довольно просто переименовывать учетную запись пользователя. Для программной реализации этого процесса используйте метод MoveHere объекта TADsContainer. Несмотря на то что имя изменяется, SID остается тем же, оставляя неизменными списки контроля доступа (ACL). Для переименования учетной записи используйте следующий код Visual Basic:
Dim Containet As TADsContainer
Dim ContainerName As String
Dim OldName As String
Dim User As TADsUser
Dim NewUser As TADsUser
Dim NewName As String'.
OldName = " Old_Account_Name"
NewName = "New_Account_№me". .
ContainerName = "Target_Domain_Name"
Set Container = GetObject ("WinNT:/7" & ContainerName)
Set User = GetObject("WinNT://" & ContainerName & "/" _
& OldName s ",user")
Set NewUser = Container.MoveHere(User.ADsPath, NewName)
Set User = Nothing
Добавление и удаление групп
Немного изменив имя класса, можно повторно использовать тот же код для создания и удаления групп. Тип группы по умолчанию можно определить, просматривая тип связанного объекта. Например, если при связывании базы SAM локальной рабочей станции разрешается создавать только локальную группу, то эта группа будет типом по умолчанию, создаваемым при вызове метода Create объекта lADsContainer.
По умолчанию контроллер домена создает глобальную группу при вызове метода Create. Для устранения неясностей при создании групп, назначьте константу ADSI параметру GroupType для явного указания типа создаваемой группы.
Добавление новой локальной группы с помощью Visual Basic
Для добавления новой локальной группы на контроллере домена, сервере или рабочей станции установите параметр GroupType равным ADD_GROUP_TYPE_LOCAL_GROUP (0x4) после вызова метода Create интерфейса lADsContainer. Добавить новую локальную группу можно с помощью следующего кода Visual Basic:
Dim Container As lADsContainer
Dim ContainerName As String
ContainerName = ”Container_Name_Tq_Manage"
Set Container = GetObject("WinNT://" s ContainerName)
Dim Group As lADsGroup
Dim NewGroup As String
NewGroup = "Requested_Groupname"
Set Group = Container.Create("Group", NewGroup)
Group.Put "groupType", 4
Group.Setinfo
Добавление новой глобальной группы с помощью Visual Basic
Процесс создания глобальной группы контроллера домена аналогичен процессу создания локальной группы, только при создании объекта новой группы в контейнере необходимо использовать параметр add_group_type_global_Group (0x2). Итак, для создания новой глобальной группы используйте следующий код Visual Basic:
Dim Container As lADsContainer
Dim ContainerName As String'.
ContainerName = "Container_Name_To_Manage"
Set Container = GetObject("WinNT://" & ContainerName),
Dim Group As IADsGroup,
Dim NewGroup As String
NewGroup = "Requested_Groupname”
Set Group = Container.Create("Group", NewGroup)
Group.Put "groupType", 2
Group.Setinfo-
Примечание
Несмотря на различие в классах, Windows NT не позволяет использовать для локальной и глобальной групп одинаковые имена.
Удаление группы с помощью Visual Basic
В процессе удаления для Windows NT неважно, к какому типу (глобальная или локальная) принадлежит объект группы, так что можно явно и не определять класс группы. Для удаления группы используйте следующий код Visual Basic:
Dim Container As lADsContainer
Dim ContainerName As String
ContainerName = "Container_Name_To_Manage"
Set Container = GetObject("WinNT://" & ContainerName)
Dim GroupToRemove As String
GroupToRemove = " Group_To_Remove"
Call Container.Delete("Group", GroupToRemove)
Создание модуля класса NTContainerManagement
В этом разделе рассматривается первый пример части II — создание СОМ-сервера NTAdmin.DLL.
Используя модуль класса для создания новых объектов в контейнере и манипулирования свойствами домена, можно разделить бизнес-логику и логику приложения. Такой подход допускает повторное использование кода при создании любых приложений администрирования. ;
Применяя современные стандарты многоуровневой разработки приложений, можно создать COM-объект, который будет содержать весь код управления контейнером и свойством домена, приведенный выше в этой главе. Лучше создавать СОМ-сервер, чем другой тип приложения, поскольку его можно использовать с неадминистраторской учетной записью (делегированное администрирование), а также добавить дополнительную логику в одну атомарную функцию.
Упражнение 3.1. Создание NTAdmin.DLL: функции управления доменом.
■ ■и контейнером
Откройте новый проект Visual Basic ActiveX DLL.
Установите ссылку на библиотеку Active DS Type Library, воспользовавшись диалоговым окном References, доступ к которому осуществляется с помощью команды Projects References.
Переименуйте проект Project 1 в NTAdmin.
Переименуйте модуль класса Classi в NTContainerManagement.
Введите приведенный ниже код в раздел общих объявлений модуля класса.
Public Function EnumerateNamespace() As Variant On Error Resume Next Dim Domain As IADs
Dim NewElement() As Variant
Dim NameSpace As lADsContainer
Dim i As Long
Set NameSpace = GetObject("WinNT:")
For Each Domain In NameSpace
i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Domain.Name■
Next ■
EnumerateNamespace = NewElement
End Function
Public Function QueryDomainProp(ByVai DomainName As String, ByVai PropertyName As String) As Long
Dim Domain As TADsDomain
Dim ADsPath As String
ADsPath = "WinNT://" s DomainName
Set Domain = GetObject(ADsPath)
Select Case UCase(PropertyName)
Case "AUTOUNLOCKINTERVAL"
QueryDomainProp = Domain.AutoUnlockinterval
Case "LOCKOUTOBSERVATIONINTERVAL"
QueryDomainProp = Domain.Lockoutobservationinterval
Case "MAXBADPASSWORDSALLOWED"
QueryDomainProp = Domain.MaxBadPasswordsAllowed
Case "MAXPASSWORDAGE"
QueryDomainProp = Domain.MaxPasswordAge
Case "MINPASSWORDAGE"
QueryDomainProp = Domain.MinPasswordAge
Case "MINPASSWORDLENGTH".
QueryDomainProp = Domain.MinPasswordLength
Case "PASSWORDHISTORYLENGTH"
QueryDomainProp = Domain.PasswordHistoryLength
End Select
End Function
Public Function SetDomainProp(ByVai DomainName As String, _
ByVai PropertyName As String, ByVai NewValue _
As Long) As Boolean
Dim Domain As TADsDomain
Dim ADsPath As String
Dim SetDomainPropStatus As Long
ADsPath = "WinNT://" & DomainName
Set Domain = GetObject(ADsPath)
Select Case UCase(PropertyName)
Case "AUTOUNLOCKINTERVAL"
Domain.AutoUnlockinterval = NewValue
Domain.Setlnfо
Case "LOCKOUTOBSERVATIONINTERVAL"
Domain.Lockoutobservationinterval = NewValue
Domain.Setlnfо
Case "MAXBADPASSWORDSALLOWED"
Domain.MaxBadPasswordsAllowed = NewValue
Domain.SetInfо
Case "MAXPASSWORDAGE"
Domain.MaxPasswordAge = NewValue
Domain.Setinfo
Case "MINPASSWORDAGE"
Domain.MinPasswordAge = NewValue
Domain.Setlnfо
Case "MINPASSWORDLENGTH"
Domain.MinPasswordLength = NewValue
Domain.Setlnfо
Case "PASSWORDHISTORYLENGTH"
Domain.PasswordHistoryLength = NewValue
Domain.Setlnfо
End Select
If Err = 0 Then SetDomainProp = True
End Function
Public Function CreateContainerObject(ByVai ContainerName As _ String, ByVai Objectclass As String, ByVai ObjectName As _ String) As Boolean
Dim Container As TADsContainer
Dim ADsPath As String
ADsPath = "WinNT://" & ContainerName
Set Container = GetObject(ADsPath)
Select Case UCase(Objectclass)
Case "USER"
Dim User As TADsUser
Set User = Container.Create("User", ObjectName) User.Setinfo
Case "GLOBALGROUP"
Dim GlobaIGroup As lADsGroup
Set GlobalGroup = Container.Create("Group", ObjectName)
GlobaIGroup.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP GlobalGroup.Setinfo
Case "LOCALGROUP"
Dim LocalGroup As lADsGroup
Set LocalGroup = Container.Create("Group", ObjectName) LocalGroup.Put "groupType", ADS_GROUP_TYPE_LOCAL_GROUP LocalGroup.Setlnfо Case "COMPUTER"
Dim Computer As lADsComputer
Dim ComputerAccount As TADsUser
Set Computer = Container.Create("Computer", UCase(ObjectName)) Computer.Setinfo
Set ComputerAccount = GetObject("WinNT://" & ContainerName & _ "/” & ObjectName &e"$,user")
ComputerAccount.Put "UserFlags", (ComputerAccount.Get _ ("UserFlags") Or SH1000)
ComputerAccount.SetPassword (LCase(ObjectName)) ComputerAccount.Setinfo
End Select
If Err = 0 Then CreateContainerObject = True End Function
Public Function DeleteContainerObject(ByVai ContainerName As _ String, ByVai Objectclass As String, ByVai ObjectName As _ String) As Boolean
Dim Container As TADsContainer
Dim ADsPath As String
ADsPath = "WinNT://" & ContainerName
Set Container = GetObject(ADsPath)
Call Container.Delete(Objectclass, ObjectName)
If Err = 0 Then DeleteContainerObject = True End Function
Public Function RenameUserAccount(ByVai ContainerName As _
String, ByVai OldUserName As String, ByVai NewUserName As _
String) As Boolean
On Error Resume Next
Dim Container As TADsContainer
Dim User As TADsUser
Set Container = GetObject("WinNT://" & ContainerName)
Set User = GetObject("WinNT://" s ContainerName & "/" _
& OldUserName & ",user")
If Err.Number = 0 Then
Call Container.MoveHere(User.ADsPath, NewUserName)
End If '
If Err.Number = 0 Then RenameUserAccount = True Else RenameUserAccount = False End If End Function'
Public Function EnumerateContainer(ByVai ContainerName As String, Optional ByVai Filter As String) As Variant
On Error Resume Next
Dim LeafObject As IADs Dim Container As lADsContainer Dim i As Long Dim NewElement() As Variant Set Container = GetObject("WinNT://" & ContainerName) If Filter <> "" Then_
Container.Filter = Array(Filter)
End If
For Each Leafobject In Container i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Leafobject.Name Next EnumerateContainer ='NewElement End Function
Скомпилируйте код в виде NTAdmin.DLL. ' 7. Сохраните и закройте проект NTAdmin.
Совет
Если вы не собираетесь использовать код в нескольких приложениях, то можете использовать этот модуль в любом приложении Visual Basic.
Совет
Код проекта, а также скомпилированную его версию можно загрузить по адресу: http://www.williamspublishing.com.
Использование функций модуля
NTContainerManagement
После создания модуля класса NTContainerManagement можно использовать функции этого модуля практически из любого языка программирования, который поддерживает автоматизацию OLE, например Visual Basic, VBScript или JavaScript.
Создав экземпляр модуля класса NTContainerManagement, для управления доменом можно использовать несколько строк кода, которые представляют собой вызовы методов (SetDomainProp, EnumerateContainer и т.д.), содержащихся в этом модуле класса.
Использование NTContainerManagement с помощью Visual Basic
Перед использованием нового модуля класса в среде программирования необходимо создать экземпляр объекта..
Вначале необходимо установить ссылку на NTAdmin. Для этого выберите команду Projects References и в появившемся диалоговом окне References установите соответствующий флажок.
Совет
Если вы используете NTAdmin на другом компьютере, а не на том, где выполнялась компиляция NTAdmin.DLL, то сперва необходимо зарегистрировать в этой системе файл NTAdmin. DLL с помощью программы REGSVR32.
После установки ссылки на NTAdmin.DLL необходимо создать экземпляр объекта следующим образом:
Dim ContainerManagement As NTAdmin.NTContainerManagement
Set ContainerManagement = New NTAdmin.NTContainerManagement
И только после выполнения этих действий можно использовать все семь методов, вводя ContainerManagement. Ме/Ао//. Если у вас активизировано средство автозаполнения интегрированной среды разработки Visual Basic, то при вводе ContainerManagement. появится окно подсказки со списком и синтаксисом каждого доступного метода этого модуля класса.
Использование NTContainerManagement с помощью VBScript Active Server Page.
Скопируйте файл NTAdmin.DLL в соответствующую папку сервера IIS. В консоли управления сервера IIS зарегистрируйте его с помощью программы REGSVR32. Если вы хотите использовать этот DLL-файл в среде делегированного администрирования, создайте пакет MTS и установите привилегированную учетную запись для идентификации пакета.
После регистрации создайте новую ASP-страницу и для создания экземпляра объекта используйте следующий код:
"Dim ContainerManagement ,'’
Set ContainerManagement = ’
Server.CreateObject("NTAdmin.NTContainerManagement")
Доступ к методам осуществляется с помощью следующего синтаксиса: Container- ManagemenLAfedW.
Использование NTContainerManagement с помощью JavaScript Active Server Page
Скопируйте на сервер IIS и зарегистрируйте файл NTAdmin.DLL, как описано в предыдущем разделе.
Для создания экземпляра объекта используйте следующий код JavaScript в ASP-странице:
var ContainerManagement =
Server.CreateObject("NTAdmin.NTContainerManagement");
Описание функций в NTContainerManagement
В табл. 3.1 приведен синтаксис каждого метода интерфейса NTContainerManagement.
ДействиеДействиеПеречисление доменовПеречисление доменовСоздание учетной записи компьютераСоздание учетной записи пользователяСоздание глобальной группыСоздание локальной группыУдаление учетной записи компьютераУдаление учетной записи пользователяУдаление группы,Просмотр значения свойства AutoUnlockintervalСоздание учетной записи компьютераСоздание учетной записи пользователяСоздание глобальной группыСоздание локальной группыУдаление учетной записи компьютераУдаление учетной записи пользователяУдаление группы,Просмотр значения свойства AutoUnlockintervalПросмотр значения свойства LockoutObservationln- tervalПросмотр значения свойства MaxBadPasswordsAl1owedПросмотр значения свойства MaxPasswordAgeПросмотр значения свойства MinPasst з. iAgeПросмотр значения свойства MinPasswordLengthПросмотр значения свойства PasswordHistoryLength Установка значения свойства AutoUnlockinterval Установка значения свойства LockoutObservation- IntervalУстановка значения свойства MaxBadPasswordsAllowedУстановка значения свойства MaxPasswordAge Установка значения свойства MinPasswordAge Установка значения свойства MinPasswordLengthПросмотр значения свойства LockoutObservationln- tervalПросмотр значения свойства MaxBadPasswordsAl1owedПросмотр значения свойства MaxPasswordAgeПросмотр значения свойства MinPasst з. iAgeПросмотр значения свойства MinPasswordLengthПросмотр значения свойства PasswordHistoryLength Установка значения свойства AutoUnlockinterval Установка значения свойства LockoutObservation- IntervalУстановка значения свойства MaxBadPasswordsAllowedУстановка значения свойства MaxPasswordAge Установка значения свойства MinPasswordAge Установка значения свойства MinPasswordLength
Действие
Действие
Перечисление доменов
Перечисление доменов
Создание учетной записи компьютера
Создание учетной записи пользователя
Создание глобальной группы
Создание локальной группы
Удаление учетной записи компьютера
Удаление учетной записи пользователя
Удаление группы,
Просмотр значения свойст
ва AutoUnlockinterval
Создание учетной записи компьютера
Создание учетной записи пользователя
Создание глобальной группы
Создание локальной группы
Удаление учетной записи компьютера
Удаление учетной записи пользователя
Удаление группы,
Просмотр значения свойст
ва AutoUnlockinterval
Просмотр значения свойства LockoutObservationln- terval
Просмотр значения свойства MaxBadPasswordsAl1owed
Просмотр значения свойства MaxPasswordAge
Просмотр значения свойства MinPasst з. iAge
Просмотр значения свойства MinPasswordLength
Просмотр значения свойства PasswordHistoryLength Установка значения свойства AutoUnlockinterval Установка значения свойства LockoutObservation- Interval
Установка значения свойства MaxBadPasswordsAllowed
Установка значения свойства MaxPasswordAge Установка значения свойства MinPasswordAge Установка значения свойства MinPasswordLength
Просмотр значения свойства LockoutObservationln- terval
Просмотр значения свойства MaxBadPasswordsAl1owed
Просмотр значения свойства MaxPasswordAge
Просмотр значения свойства MinPasst з. iAge
Просмотр значения свойства MinPasswordLength
Просмотр значения свойства PasswordHistoryLength Установка значения свойства AutoUnlockinterval Установка значения свойства LockoutObservation- Interval
Установка значения свойства MaxBadPasswordsAllowed
Установка значения свойства MaxPasswordAge Установка значения свойства MinPasswordAge Установка значения свойства MinPasswordLength
Таблица 3.1. Синтаксис методов интерфейса NTContainerManagement
Синтаксис
For Each Item in ContainerManagement. EnumerateNamespace
Debug.Print Item
Next
RetVal = ContainerManagement.CreateContainerObject( "Domain_Name", "Computer", "Computer_Name")
RetVal = ContainerManagement.CreateContainerObject( "Domain_Name", "User", "User_Name")
RetVal = ContainerManagement.CreateContainerObject( "Domain_Name", "GlobalGroup", "Group_Name")
RetVal = ContainerManagement.CreateContainerObject( "Domain_Name", "LocalGroup", "Group_Name")
RetVal = ContainerManagement.DeleteContainerObject( "Domain_Name", "Computer", "Computer_Name")
RetVal = ContainerManagement.DeleteContainerObject( "Domain_Name", "User", "User_Name")
RetVal = ContainerManagement.DeleteContainerObject( "Domain_Name", "Group", "Group_Name")
RetVal = ContainerManagement.QueryDomainProp(
"Dornain_Name", "AutoUnlockinterval")
RetVal - ContainerManagement.QueryDomainProp! "Domain_Name", "Lockoutobservationinterval")
RetVal = ContainerManagement.QueryDomainProp! "Domain_Name", "MaxBadPasswordsAllowed")
RetVal = ContainerManagement.QueryDomainProp!
"Domain_Name", "MaxPasswordAge")
RetVal = ContainerManagement.QueryDomainProp(
"Dornain_Name", "MinPasswordAge")
RetVal = ContainerManagement.QueryDomainProp( "Domain_Name", "MinPasswordLength")
RetVal = ContainerManagement.QueryDomainProp! "Domain_Name", "PasswordHistoryLength")
RetVal - ContainerManagement.SetDomainProp! "Domain_Name", "AutoUnlockinterval", New_Value)
RetVal = ContainerManagement.SetDomainProp( "Domain_Name", "Lockoutobservationinterval", New_Value)
RetVal = ContainerManagement.SetDomainProp! "Domain_Name", "MaxBadPasswordsAllowed", New_Value)
RetVal = ContainerManagement.SetDomainProp! ' "Domain_Name", "MaxPasswordAge", New_Value)
RetVal = ContainerManagement.SetDomainProp! "Domain_Name", "MinPasswordAge", New_Value)
RetVal = ContainerManagement.SetDomainProp! "Domain_Name", "MinPasswordLength", New_Value)
Действие
Синтаксис
Установка значения свойства
PasswordHi stоryLength
Переименование учетной записи пользователя
RetVal = ContainerManagement.SetDomainPropf "Domain_Name", "PasswordHistoryLength", New_Value)
RetVal = ContainerManagement.RenameUserAccount( "Domain_Name", "Old_Account", "New_Account")
Перечисление всех объектов домена
For Each Item in ContainerManagement.
EnumerateContainer("Domain_Name")
Debug.Print Item
Next
Перечисление пользователей домена
For Each Item in ContainerManagement.
EnumerateContainer("Domain_Name", "User")
Debug.Print Item
Next'
Перечисление всех групп домена
For Each Item in ContainerManagement.
EnumerateContainer("Domain_Name", "Group")
Debug.Print Item
Next
Перечисление глобальных групп домена
For Each Item in ContainerManagement.
EnumerateContainer("Domain_Name", "GlobalGroup")
Debug.Print Item
Next
Перечисление локальных групп домена
For Each Item in ContainerManagement.
EnumerateContainer("Domain_Name", "LocalGroup")
Debug.Print Item
Next
Перечисление учетных записей компьютеров домена
For Each Item in ContainerManagement.
EnumerateContainer("Dornain_Name", "Computer") Debug.Print Item
Next
Резюме
Используя интерфейсы IADs, lADsContainer и lADsDomain, разработчик или администратор может создать приложения администрирования документооборота с помощью сценариев, которые перечисляют все домены в пространстве имен WinNT:. После выбора домена можно управлять политикой учетных записей этого домена или же далее просматривать содержимое контейнера.
Одна из наиболее полезных возможностей в приложениях администрирования документооборота — создание и удаление объектов в контейнере. С помощью методов Create и Delete интерфейса lADsContainer в домене могут быть созданы или удалены компьютеры, пользователи, локальные и глобальные группы.
Упрощая код, необходимый для добавления и удаления объектов выбранного контейнера, можно создать модуль класса, реализующий необходимые функции, доступ к которым впоследствии можно получить с помощью любого языка программирования, поддерживающего автоматизацию OLE. Для вызова необходимой функции используется лишь одна строка кода.
Далее в этой части продолжается обсуждение методов перечисления для программного управления объектами, что' позволяет ■ создавать полнофункциональные приложения администрирования с минимальными затратами.
4
Программное управление учетной записью
пользователя
В большинстве компаний простые процессы документооборота наиболее часто подвержены ошибкам. С помощью программных Методов, администраторы, владеющие искусством программирования, могут создавать приложения документооборота, которые выполняют все действия по созданию новой учетной записи, что в конечном счете приводит к уменьшению ошибок.
В этой главе рассматриваются следующие аспекты программного управления свойствами учетной записи пользователя:
управление и манипулирование свойствами учетной записи пользователя;
манипулирование профайлом пользовательского окружения;
манипулирование временем регистрации в системе пользователя и рабочих станций;
манипулирование полями параметров пользователя.
Вы также узнаете, как использовать ADSI для установки новых значений свойств, которые нельзя настроить с помощью стандартных инструментов, например времени последней регистрации пользователя в системе и выхода из нее.
Независимо от того, используете ли вы создаваемое приложение как часть существующего бизнес-процесса или просто собираетесь сэкономить время при выполнении повседневных административных задач, для реализации следующего проекта автоматизации администрирования вполне достаточно средств Visual Basic и ADSI..
Осваивая материал этой главы, вы продолжите создание COM-сервера NTAdmin. DLL, часть которого была создана во время работы над главой 3, “Методы перечисления контейнера и программное управление политикой учетных записей домена”.
Синтаксис связывания пользовательского объекта
При связывании пользовательского объекта можно определить класс User в конце строки связывания для обозначения объекта манипулирования. Это определение класса позволяет увеличить общую производительность приложения.
Синтаксис связывания пользовательского объекта с помощью Visual Basic
Для связывания существующей учетной записи пользователя в домене обратитесь к следующему коду Visual Basic:
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String'
UserDomain = " Та где t_User_Doma in"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" _
UserName & ",user")
Манипулирование свойствами учетной записи пользователя
Из всех интерфейсов провайдера Windows NT наиболее полным набором свойств и методов, необходимых для программного манипулирования учетными записями пользователей, обладает lADsUser. Такое множество свойств и методов может ошеломить даже видавшего виды системного администратора: одна из основных и наиболее часто решаемых задач администрирования — управление пользователями — чаще всего выполняется вручную. С помощью интерфейса lADsUser можно создать приложения и сценарии, с помощью которых автоматизируются рутинные процессы администрирования.
При создании новой учетной записи пользователя необходимо поместить ее в соответствующие задачам этого пользователя группы, а также создать личный каталог. Кроме того, пользовательский личный каталог должен быть доступен другим пользователям, также в зависимости от их прав. После ввода соответствующего имени пользователя, полного имени и описания необходимо также заполнить поля пути профайла и личного каталога в базе SAM для того, чтобы известить Windows NT о местоположении личного каталога пользователя и профайла, перемещающегося с компьютера на компьютер. И наконец, информация о новом пользователе должна быть распространена среди пользователей безопасным и эффективным способом. Используя ADSI и приложение с собственной моделью объектов (например, Outlook), последнее можно выполнить с помощью программных методов.
Время, потраченное на создание сценария автоматизации процесса документооборота, окупится удобством работы пользователей и уменьшением числа ошибок, неизбежных при ручной работе. Используя свойства и методы, реализованные в интерфейсе lADsUser, можно манипулировать практически всеми настраиваемыми параметрами, доступными в диалоговом окне User Properties.
Манипулирование свойством FullName
Для идентификации учетной записи пользователя в большинстве компаний используется полное имя пользователя (чаше всего имя и фамилия и довольно редко отчество), введенное в поле Full Name в диалоговом окне User Properties (рис. 4.1).
В некоторых компаниях это поле используется для идентификации пользователя, т.е. можно создать Web-инструменты, которые выполняют анализ этого поля, дополняя свойства Windows NT свойствами, присущими Active Directory.
Рис. 4.1. Диалоговое окно User Properties
Просмотр значения свойства FullName с помощью Visual Basic
Для просмотра полного имени пользователя применяйте следующий код:
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain - " Target_User_Domain"'
UserName = " Target_User_Name”
Set User = GetObject("WinNT://" 6 UserDomain 6 "/" UserName _ 6 ",user")
Dim RetVal As String RetVal = User.FullName Debug.Print RetVal
Установка нового значения свойства FullName , с помощью Visual Basic
Для ввода нового полного имени пользователя (поле Full Name в базе SAM) используйте код
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
Dim NewFullName As String.
UserDomain - ” Target_User_Domain" '
UserName = ”Target_User_Name"
NewFullName = "New_Value_For_Full_Name_Field"
Set User = GetObject("WinNT://" 6 UserDomain 6 "/" UserName _ & ",user")
User.FullName - NewFullName
User.Setinfo
Манипулирование свойством Description
Свойство Description позволяет ввести дополнительные данные о пользователе, например географическое расположение учетной записи пользователя, отдел или подразделение, идентификационный номер в сети компании и др.
Примечание
Реализуя поддающиеся интерпретации данные в этом поле (свойство Descriptpion, ' а также и FullName), можно существенно увеличить возможности программного администрирования. ', '
Просмотр значения свойства Description с помощью Visual Basic
Для просмотра значения свойства Description используйте следующий код:
Dim User As TADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = " Target_User_Domain"■
UserName = ” Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _'
& ",user")
Dim RetVal As String
RetVal = User.Description
Debug.Print RetVal
Установка нового значения свойства Description с помощью Visual Basic
Для установки нового значения свойства Description используйте следующий код:
Dim User As TADsUser
Dim UserName As String
Dim UserDomain As String
Dim NewDescription As String
UserDomain = ” Target_User_Domainn■
UserName = " Targe t_ Use r_ Name”
NewDescription = ”New_Value_For_Description_Field"'
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _ & ",user")',
User.Description = NewDescription
User.Setinfo
Примечание
Для просмотра отдельных элементов поля, разделенных специальным разделителем, используйте код Visual Basic.
Dim User As TADsUser
Dim UserName As String
Dim UserDomain As String
Dim Delimiter As String
UserDomain = " Target_User_Domain"'
UserName = " Target_User_Name"
Delimiter = " I "
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _;
& ",user")' :
Dim RetVal As String
RetVal = User.Description
Dim FirstDelim As Integer.;
Dim DescriptionLength As Integer
Dim ParsedElement As String
Dim Terminalcondition As Boolean-
StartPosition =1
While Terminalcondition <> True
FirstDelim’ = InStr(1, RetVal, Delimiter)
If FirstDelim = 0 Then
Terminalcondition = True
Else.'
DescriptionLength = Len(RetVal) .
ParsedElement = Left(RetVal, FirstDelim - 1)
Debug.Print Trim(ParsedElement)
RetVal = Right(RetVal,(DescriptionLength - FirstDelim))
End If'’
Wend
Debug.Print Trim (RetVal)
Манипулирование паролями пользователей
Одна из наиболее часто выполняемых административных задач — управление па-. ролями пользователей. Это сброс пароля к известному значению, а также принуждение пользователя изменить пароль при следующей регистрации в системе. .
Просмотр пароля пользователя, хранящегося в базе SAM
Обратите особое внимание, что доступ к этому полю в базе SAM закрыт для любого инструмента, включая ADSL Если вы желаете получить значение пароля пользователя, необходимо прибегнуть к “отмычкам” наподобие программы LOphtCrack. Вопросы взлома пароля пользователя в этой книге не рассматриваются.
Установка нового значения пароля пользователя
с помощью Visual Basic■
Чтобы использовать метод SetPassword, пользователь может и не знать своего текущего (оригинального) пароля, но должен обладать правами администратора домена для выполнения подобной операции.
Если вы хотите изменить пароль пользователя, не зная оригинального пароля, используйте следующий код Visual Basic:
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = " Target_User_Domain".
UserName = " Target_User_Name"■■
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _ & ",user")
Dim NewPassword As String
NewPassword = "Superm@n99"
Call User.SetPassword(NewPassword)
Примечание
:; Не забудьте заменить значение Superm@n99 своим собственным. Помните о том, что . ■ это значение должно удовлетворять ограничениям (например, длина пароля), наклады- \ ваемым системой Windows NT.■ ■
Изменение пароля пользователя с помощью Visual Basic
При смене пароля пользователь должен ввести оба пароля — старый и новый. Этот ’ простой и безопасный метод позволяет обычным пользователям изменить собственный пароль, не имея прав администратора домена. Для изменения пароля учетной записи пользователя предлагается следующий код:
Dim User As ZADsUser
Dim UserName As String
Dim UserDomain As String
tiserDomain = "Target_User_Domain"
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" £ UserDomain £ "/" UserName 2
& ",user")
Dim NewPassword As String
Dim OldPassword As String
NewPassword = "Superm@n26”
OldPassword = "B@tm@n74!"
Call User.ChangePassword(OldPassword, NewPassword)
Совет
При использовании Web-сервера для смены пароля проверьте, чтобы пароль не передавался по сети открытым текстом. Подобные действия необходимо выполнять с помощью безопасного соединения Secure Sockets Layer (SSL). При этом передаваемая информация на время передачи шифруется.,
Манипулирование пользовательскими флагами
Для просмотра состояния пользовательских флагов в базе SAM применяется метод Get интерфейса IADs, который возвращает параметры флага. Ниже приведены некоторые константы, представляющие шестнадцатеричные значения четырех из пяти флагов состояния, отображаемых в окне средства User Manager.
0x00002ADS_U_ACCOUNTDISABLE
0x00010ADS_UF_LOCKOUT
0x00040ADS_UF_PASSWD_CANT_CHANGE
0x10000ADS_UF_DONT_EXPIRE_PASSWD
Примечание
Обратите внимание, что флага для параметра User Must Change Password at Next Logon нет. Этот параметр управляется не флагом, а значением свойства PasswordExpired (установите его равным 1).
Для управления учетной записью пользователя разработчику доступно множество флагов. Более подробное их описание приведено в приложении Б, “Справочник по программированию ADSI 2.5”.
Для установки и просмотра этих шестнадцатеричных значений используйте операторы or, Хог и And следующим образом:
оператор Or — для начальной установки бита (в случае создания новой учетной записи);
оператор Хог — для переключения статуса флага (активизирован или деактиви- зирован);
оператор And — для просмотра значения, хранящегося в базе SAM.
Просмотр значения пользовательского флага с помощью Visual Basic
Для просмотра значения определенного флага используйте следующий код:
Dim User As TADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain - " Target_User_Domain”
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _
& ",user")■
Dim Flags As Long
Flags = User.Get("UserFlags")
If (Flags And SH10000) <> 0 Then
Debug.Print "The specified user account is configured so _
that the password never expires."
End If
Примечание
Обратите внимание, что “дополнительное” шестнадцатеричное значение 0x10000 (Password Never Expires) совместно с пользовательскими флагами дает результат, который затем оценивается. Если возвращается любое число, отличное от 0, можете быть уверены, что для выбранной учетной записи установлен флаг Password Never Expires.
Изменение значения пользовательского флага
С помощью Visual Basic
Аналогичным образом можно изменить значения флагов с помощью метода Put и оператора Хог. Для этого используйте код
Dim user As lADsuser
Dim UserName As String
Dim UserDomain As String
UserDomain = "Target_User_Domain"-.
UserName = " Targe t_User_Name".
Set user = GetObject("WinNT://" S UserDomain & "/" UserName _
S ",user")■
Dim Flags As Long
Flags = User.Get("UserFlags")
User.Put "UserFlags", (Flags Xor SH10000)
User.Setlnfo
После поиска значения UserFlags выполняется операция Хог над текущим свойством UserFlags для изменения значения бита. Затем новое значение сохраняется в каталоге с помощью метода Setinfo.
('аист
Изменив в приведенном коде оператор Хог на Or, можно устанавливать начальное значение флага.’
' Манипулирование флагом User Must Change Password at Next Logon
В большинстве случаев после сброса пароля флаг User Must Change Password at Next Logon должен быть установлен. При этом гарантируется, что пароль по умолчанию не станет новым паролем для учетной записи пользователя.
Эту функциональность можно добавить в код процедуры изменения пароля, если в Политике безопасности компании предусмотрено строгое распределение паролей, т.е. даже руководству не позволено знать пароли пользователей.
Примечание
Однако Windows NT заканчивает срок действия пароля для того, чтобы заставить пользователя изменить его при следующей регистрации в системе. Поэтому Windows NT не позволяет одновременно установить этот флаг и флаг Password Never Expires. При выполнении подобной операции в окне средства User Manager появляется предупреждающее сообщение.
Просмотр значения флага User Must Change Password at Next Logon с помощью Visual Basic
Для просмотра текущего значения флага PasswordExpired используйте следующий код:
Dim.User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = " Targe t_User_Doma in"
UserName = " Target_User_Name”
Set User = GetObject("WinNT://" & UserDomain 6 "/" UserName _ 8 ",user")
Dim PasswordExpired As Integer.
PasswordExpired = User.GetCPasswordExpired") If PasswordExpired = 1 Then
Debug.Print "The user account is configured so that the _
password must be changed on next logon."'
Else
Debug.Print "The user will NOT be required to change the _ account password on next logon."
End If
Примечание
Если свойство PasswordExpired возвращает значение 1, значит, срок действия пароля истек и он должен быть изменен при следующей регистрации в системе. А если это возвращаемое значение равно 0, то пароль еще действителен.
Установка нового значения флага User Must Change Password ■ at Next Logon с помощью Visual Basic.
Для немедленной смены пароля установите значение свойства PasswordExpired равное 1, как показано в следующем фрагменте кода:•
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = " Та где t_User_Domain"
UserName = " Targe t_User_№me"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName
",user")
Dim PasswordExpired As Integer
User.Put "PasswordExpired", 1
User.Setinfo•
Совет
В данном случае используется метод Put интерфейса IDAs для установки нового значения свойства PasswordExpired. Если вы хотите удалить бит PasswordExpired учетной записи пользователя, просто установите значение этого свойства равным 0.
Манипулирование флагом User Cannot Change Password
Хотя этот флаг довольно редко используется, это не значит, что им нельзя управлять программно. Значение этого флага может быть считано, установлено и изменено. Действия над значениями этого флага аналогичны действиям, описанным выше.
Просмотр значения флага User Cannot Change Password с помощью Visual Basic.
Ответить на вопрос, имеет ли право пользователь изменить свой пароль, поможет следующий код:
Dim User As lADsUser
Dim UserName As String■
Dim UserDomain As String
UserDomain = " Target_User_Domain"
UserName = ”Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _
",user").
Dim Flags As Long
Flags = User.Get("UserFlags")
If (Flags And &H00040) <> 0 Then
Debug.Print "The specified user account is configured so _ that the password cannot- be changed."
End If
Установка нового значения флага User Cannot Change Password с помощью Visual Basic .
В некоторых случаях (например, при создании новой учетной записи) необходимо установить определенное значение этого флага. Для явной установки флага User Cannot Change Password и сохранения изменений в базе SAM используйте код
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = " Targe t_User_Doma in"'
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _.
& ",user")
Dim Flags As Long
! Flags = User.Get("UserFlags")
^User.Put "UserFlags", Flags Or &H00040 i User.Setinfo
Изменение значения флага User Cannot Change Password. ' с помощью Visual Basic
Для изменения значения флага User Cannot Change Password воспользуйтесь кодом
Dim User As lADsUser■
Dim UserName As String *
Dim UserDomain As String
UserDomain = "Target_User_Domain"
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/” UserName _ & ",user")
Dim Flags As Long
Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags Xor &H00040 User.Setinfo
Манипулирование флагом Password Never Expires
При создании учетной записи службы рекомендуется установить пользовательский флаг ads_uf_dont_expire_password, который предотвратит сбои и ошибки запуска службы при синхронизации пароля. После установки этого флага учетная запись не имеет срока использования пароля, а также его не нужно будет периодически изменять.'
Просмотр значения флага Password Never Expires с помощью Visual Basic
Для просмотра текущего значения флага Password Never Expires используйте следующий код:.
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = "Target_User_Domain"■
UserName = " Target_User_№me"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _
S ",user").
Dim Flags As Long
Flags = User.Get("UserFlags")
If (Flags And &H10000) <> 0 Then
Debug.Print "The Specified user account is configured so _ that the password never expires.".
End If
Установка нового значения флага Password Never Expires с помощью Visual Basic
Чтобы позволить пользователю снять ограничения на срок действия пароля, установите бит ADS_UF_DONT_EXPIRE_PASSWORD, ИСПОЛЬЗуя КОД■
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = ”Target_User_Domain"
UserName • = " Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _ s ",user") ■
Dim Flags As Long
Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags Or SH10000.
User.Setinfo
Изменение значения флага Password Never Expires с помощью Visual Basic
Для изменения текущего значения поля Password Never Expires в записи пользователя базы SAM используйте следующий код:
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = " Target_User_Domain"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _ & ",user")•
Dim Flags Ast Long
Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags Xor SH1OOOO
User.Setinfo
Манипулирование флагом Account Disabled
С помощью флага ads_uf_accountdisable можно отключить запись в базе SAM для любой учетной записи пользователя. Необходимое для этого свойство реализовано и в интерфейсе lADsUser.
Примечание
Если вы предпочитаете работать с побитовыми операциями, флагом Account Disabled можно манипулировать, используя методику применения флага Password Never Expires. Единственное, что необходимо изменить, — это аргумент, передаваемый методу Put: с 0x10000 (&Н10000) на 0x2 (&Н2).
Просмотр значения флага Account Disabled с помощью Visual Basic
Для манипулирования флагом Account Disabled используется свойство AccountDisabled интерфейса lADsUser. Чтобы просмотреть текущее значение этого свойства, воспользуйтесь кодом
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = "Target_User_Domain"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" s UserDomain s "/" UserName _
& ",user")
Dim RetVal As Boolean
RetVal = User.AccountDisabled Debug.Print RetVal
Установка нового значения флага Account Disabled с помощью Visual Basic .
Для отключения и включения учетной записи пользователя обратитесь к следующему коду:
Dim User As TADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = "Target_User_Domain"
UserName = "Target_User_Name" '
Set User - GetObject("WinNT://" & UserDomain & "/" UserName _ s ",user")
Dim NeWalue As Boolean NeWalue - False
User.AccountDisabled - NeWalue User.Setinfo
Перечисление всех отключенных учетных записей домена с помощью Visual Basic
Иногда с целью проверки необходимо получить список всех отключенных учетных записей. Чтобы выполнить эту операцию, необходимо перечислить все учетные записи пользователей в домене (или локальной базе SAM) и с помощью условия отобрать из полученного списка только отключенные учетные записи пользователей.
Для генерации отчета об отключенных учетных записях используйте следующий код Visual Basic:■
Dim Domain As lADsContainer Dim DomainName As String Dim UserAccount As TADsUser Dim Counter As Integer'
Counter = 0 DomainName = "Target_User_Domain" Set Domain = GetObject("WinNT://" 5 DomainName) Domain.Filter = Array("User")
Debug.Print "The following accounts are disabled in domain: " _ & Domain.Name For Each UserAccount In Domain_
If UserAccount.AccountDisabled = True Then
Debug.Print UserAccount.Name
Counter - Counter + 1 End If Next If Counter =1 Then
Debug.Print "Only 1 user account in the " & Domain.Name _'
" domain is disabled."
Else
Debug.Print Counter & " user accounts are disabled in the " _
Domain.Name & " domain." End If
Манипулирование флагом Account Locked Out
С помощью одного из свойств интерфейса lADsUser можно просматривать и сбрасывать условия блокировки.■
Совет
Как и для свойства AccountDisabled, флаг Account Lockout может использоваться для побитовых операций.
Просмотр значения флага Account Locked Out и свойства
IsAccountLocked с помощью Visual Basic
Чтобы определить, блокирована учетная запись пользователя или нет, используйте следующий код:
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = ’’Target_User_Domain”
UserName = " Targe t_ Use r_Name"
Set User = GetObject("WinNT://" S UserDomain S "/" UserName _
".user")
Dim Retval As Boolean'
Retval = User. IsAccountLocked
Debug.Print Retval
Снятие блокировки учетной записи и изменение значения свойства IsAccountLocked с помощью Visual Basic
Для разблокировки заблокированной учетной записи используйте код
Dim User As lADsUser,
Dim UserName As String
Dim UserDomain As String
UserDomain = ”Target_User_Domain"
UserName = " Target_User_Name”
Set User = GetObject("WinNT://" S UserDomain S "/" UserName _
".user")
If User.IsAccountLocked = True Then
User.IsAccountLocked= False
User.Setinfo
End If.
Примечание
Довольно странно, что корпорация Microsoft в ADS12.5 не реализовала возможность установки значения свойства IsAccountLocked, равного True.
Разблокирование всех заблокированных пользовательских учетных записей домена
В следующем, фрагменте кода Visual Basic перечисляются все учетные записи пользователей домёна, а заблокированные — разблокируются.
Dim Domain As TADsContainer
Dim DomainName As Stringд
Dim UserAccount As lADsUser
Dim Counter As Integer
Counter = 0
DomainName = "Target_User_Domain"
Set Domain = GetObject("WinNT://" & DomainName)
Domain.Filter = Array("User")
For Each UserAccount In Domain
If UserAccount.IsAccountLocked = True Then
Debug.Print UserAccount.Name
UserAccount.IsAccountLocked = False
UserAccount.Setinfo
Counter = Counter + 1
End If
Next
If Counter =1 Then
Debug.Print "Only 1 user account in the " s Domain.Name _ & " domain was unlocked."
Else
Debug.Print Counter & " user accounts were unlocked in the " & Domain.Name S " domain."
End If
Перед запуском этого кода в пространстве имен вашей компании помните о том, что вы увеличивает риск, несанкционированного проникновения в сеть компании с разблокированной учетной записи, которая до этого была заблокирована, например с гостевой.
Манипулирование профайлами пользовательской среды
С помощью ADSI можно программно манипулировать параметрами пользовательского профайла и личного каталога выбранной учетной записи пользователя (рис. 4.2). Эта возможность может пригодиться при переименовании либо объединении личных каталогов или хранилищ пользовательских профайлов.
Рис. 4.2. Диалоговое окно User Environment Profile
* Используя ADSI, администратор может написать несколько строк кода для внесения изменений в соответствующие параметры пользовательского профайла и не тратить времени на выполнение монотонных действий с графическим интерфейсом. Чаше всего именно такие задачи программирования решают системные администраторы сетей современных компаний.
Манипулирование местоположением пользовательского профайла
С помощью интерфейса TADsUser и провайдера Windows NT можно манипулировать местоположением пользовательского профайла учетной записи пользователя в базе SAM.■
Просмотр текущего местоположения пользовательского профайла с помощью Visual Basic '.
Для просмотра текущего значения, используемого Windows NT для определения местоположения пользовательского профайла, воспользуйтесь следующим кодом:
Dim User As TADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = "Target_User_Domain"
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" s UserDomain s "/" UserName _ & ",user")
Dim RetVal As String'
Retval = User.Profile
Debug.Print Retval■
Установка нового местоположения пользовательского профайла с помощью Visual Basic
Для установки нового местоположения пользовательского профайла используйте код
Dim User As TADsUser
Dim UserName As String
Dim UserDomain As String
Dim NewValue As String
UserDomain = ” Target_User_Domain”
UserName = " Target_User_Name”
NewValue = nNew_User_Profile_Path"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _ & ",user")
User. Profile = NeWalue
User.Setinfo
Манипулирование свойством Loginscript
Свойством Loginscript, как и свойством Profile, можно программно управлять.
Просмотр значения свойства Loginscript с помощью Visual Basic
Для просмотра текущего сценария регистрации в системе (значение свойства Loginscript) используйте следующий код:
Dim User As TADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = "Target_User_Domain”
UserName = **Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _
",user")
Dim RetVal As String
RetVal = User.LoginScript
Debug.Print RetVal
Установка нового значения свойства LoginScript с помощью Visual Basic
Определить новый сценарий регистрации выбранной учетной записи пользователя можно с помощью кода
Dim User As TADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = "Target_User_Domain”
UserName = "Target_User_Name".
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _
S'", user")•
Dim NeWalue Aa String
NeWalue = "NewLoginScript.CMD"
User .LoginScript = NeWalue
User.Setinfo.
Манипулирование местоположением личного каталога
пользователя,
Местоположением личного каталога, как и большинством конфигурируемых свойств учетной записи пользователя в базе SAM, можно манипулировать с помощью соответствующего свойства интерфейса TADsUser.
Просмотр текущего местоположения личного каталога пользователя с помощью Visual Basic
Для просмотра текущего местоположения личного каталога пользователя в формате UNC используйте следующий код:-
Dim User As TADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = ”Target_User_Domain’’1
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _ & ",user")
Dim RetVal As String
RetVal = User.HomeDirectory
Debug.Print RetVal
Установка нового местоположения личного каталога пользователя
с помощью Visual Basic
Если необходимо изменить местоположение личного каталога пользователя, воспользуйтесь кодом
Dim User As lADsUser..
Dim UserName As String ■''
Dim UserDomain As String
Dim NewValue As String
UserDomain = n Target_User_Domain"
UserName = " Target_User_Name"
NewValue = " New_Home_DirectorY_Path_Value"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName S ",user")
User.HomeDirectory = NewValue
User.Setinfo
Манипулирование подключением личного каталога пользователя.
Для манипулирования записью о подключении личного каталога пользователя в базе SAM можно использовать метод Get интерфейса IADs для доступа к свойству HomeDirDrive.
Просмотр текущего значения подключения личного каталога пользователя с помощью Visual Basic
Чтобы просмотреть имя логического диска, присвоенного подключенному личному каталогу пользователя, используйте следующий код:
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = " Target_User_Domain"
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _
& ",user")_ .
Dim RetVal As String
RetVal = User.Get("HomeDirDrive")
Debug.Print RetVal
Установка нового значения подключения личного каталога пользователя с помощью Visual Basic.
Чтобы изменить имя логического диска, присвоенного подключенному личному каталогу пользователя, используйте код■■
Dim User As lADsUser.
Dim UserName As String
Dim UserDomain As String■
Dim NewValue As String
UserDomain = " Target_User_Domain" ■
UserName = " Target_User_Name",, ■.
NewValue =• "New_Value_Fdr_Home_Dii^ctory_Drive"' '■-’ ’!‘'
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _' '
& ",user")
User.Put("HomeDirDrive", NewValue)
User.Setinfo.
Совет
Диск подключенного личного каталога пользователя необходимо обозначать следующим образом: буква диска, а затем двоеточие (например, Н:).
Если необходимо определить локальное местоположение личного каталога, установите свойство HomeDirDrive, равное пустой строке, например User. Put ("HomeDirDrive**, "").
Манипулирование временем регистрации пользователя
Windows NT позволяет определить время получения пользователем доступа к ре- су|юам домена (рис. 4.3). Используя свойство LoginHours интерфейса ZADsUser, можно просматривать и устанавливать новые значения поля User Logon Hours в записи пользователя базы SAM. ' 1
Рис. 4.3. Диалоговое окно Logon Hours
ADSI возвращает массив значений variant, который можно обрабатывать с помощью цикла For...Each. Значения, представляющие часы суток, возвращаются из диапазона 0-255. .
Большинство администраторов желают знать время, когда пользователь может зарегистрироваться в системе. Значения меньше 255 указывают, что пользователь не может зарегистрироваться в системе. Если перечислить все значения и просмотреть те, которые меньше 255, можно быстро определить ограничения по времени на регистрацию учетной записи пользователя.
Просмотр времени регистрации пользователя с помощью Visual Basic
Определить время, кода пользователь имеет ограничения на регистрацию в системе, можно с помощью кода
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = ” Target_User_Domain”
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName s ",user")
Dim TimeEntry As Variant
Dim Restriction As Integer
For Each TimeEntry In User.LoginHours
If TimeEntry < 255 Then Restriction = 1 Next If Restriction =1 Then
Debug.Print "User account " s UserDomain s "\" s UserName & " has time restriction placed upon it."
Else ■
Debug.Print "There are no time restrictions affecting user account " S UserDomain S "\" S UserName & "." End If
Примечание
Приведенный фрагмент кода можно выполнять только для учетных записей домена; в ■ локальной базе SAM время регистрации в системе учетной записи не определяется.
Манипулирование регистрацией рабочей станции
Как показано на рис. 4.4, Windows NT позволяет администратору ограничивать регистрацию определенной группы компьютеров. Это свойство полезно, если требуется ограничить учетные записи служб или предотвратить “перемещения” пользователей по рабочим станциям в компании.
Рис. 4.4. Диалоговое окно Logon Workstation
Свойство Loginworkstations интерфейса lADsUser возвращает массив значений variant, содержащих имена компьютеров, для которых ограничена пользовательская регистрация.
Просмотр регистрации рабочих станций с помощью Visual Basic
Используя уже знакомый цикл For.. .Each для перечисления содержимого массива строк Variant, можно вернуть значения всех рабочих станций, для которых ограничена учетная запись пользователя. Для этого используйте следующий код:
On Error Resume Next Dim User As lADsUser Dim UserName As String Dim UserDomain As String Dim Workstation As Variant.
UserDomain = "Target_User_Domain" UserName = " Targe t_User_Name" Set User = GetObject("WinNT://" & UserDomain 5 "/" UserName _ S ",user")
If User.Loginworkstations = "" Then
For Each Workstation In User.Loginworkstations Debug.Print Workstation
Next'■■
Else
Debug.Print User.Loginworkstations End If
Добавление новой регистрации рабочей станции к свойству Loginworkstations с помощью Visual Basic
Чтобы добавить новую рабочую станцию, с которой можно выполнять регистрацию в системе, необходимо установить значение свойства Loginworkstations массиву строк, представляющих имена рабочих станций. Для этого воспользуйтесь кодом
On Error Resume Next'
Dim TargetUserDomain As String Dim TargetUserName As String Dim Value As String Dim User As lADsUser Dim Workstation As Variant Dim NewElement() As Variant’
Dim i As Long Dim EmptyArray As Integer Dim Entry As Variant
Dim ValueAlreadyExists As Integer
TargetUserDomain = " Target_User_Domain"
TargetUserName = ” Target_User_Name*'
Value = "New_Login_Workstation_To_Add"
Set User = GetObject("WinNT://" & TargetUserDomain & "/" _ TargetUserName & ",user")
If IsArray(User.Loginworkstations) = True Then.
For Each Entry In User.Loginworkstations'
i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Entry If Entry = "" Then EmptyArray = 1
If Entry = Value Rhen ValueAlredyExists = 1 Next.
If EmptyArray = 1 Then
User.Loginworkstations = Array(Value)
User.Setinfo'■ ■'
Else.
If ValueAlredyExists о 1 Then.
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = , Entry
User.Loginworkstations = NewElement
User.Setinfo
End If :
End If
Else
If User.Loginworkstations <> Value Then
User.Loginworkstations = Array(User.Loginworkstations, Value) User.Setinfo
End If ■■
End If
Удаление существующей регистрации рабочей станции из свойства Loginworkstations с помощью Visual Basic
Чтобы удалить запись из существующего массива значений свойства Loginworkstations, используйте следующий код:
On Error Resume Next
Dim TargetUserDomain As String
Dim TargetUserName:As String'■
Dim Value As String Dim User As' TADsUser''
Dim Workstation As Variant Dim NewElement() As Variant Dim i As Long TargetUserDomain = "Target_User_Domain" TargetUserName = "Target_User_Name" Value = "Login_ Works tation_To_Remove" Set User = GetObject("WinNT://" & TargetUserDomain & "/" _ TargetUserName & ",user")
If IsArray(User.Loginworkstations) = True Then
Dim Entry As Variant"
For Each Entry In User.Loginworkstations
If Value <> Entry Then’ '
i = UBound(NewElement) +1-
ReDim Preserve NewElement(i) NewElement(i) = Entry
End If'-..
Next'' ■
User.Loginworkstation = NewElement User.Setinfo ■ Else..
if User.Loginworkstations = Value Then...
User.Loginworkstation = Array("").
User.Setinfo.
End If End If.
Манипулирование свойствами
учетной записи
Администратор может определить срок действия учетной записи и ее тип (рис. 4.5).
Рис. 4.5. Диалоговое окно Account Information
С помощью ADSI можно программно манипулировать этими параметрами, используя свойство AccountExpirationDate интерфейса lADsUser и устанавливая флаг ADS_TEMP_DUPLICATE_ACCOUNT.
Просмотр срока действия учетной записи с помощью Visual Basic'
Чтобы узнать срок действия учетной записи, просмотрите значение свойства AccountExpirationDate интерфейса lADsUser, используя следующий код:
Or Error Resume Next Dim User As lADsUser Dim UserName As String.
Dim UserDomain As String UserDomain = ” Target_User_Domain” UserName = " Target_User_Name”■
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _ 4 ",user")
Dim AccountExpirationDate As Date
AccountExpirationDate = User.AccountExpirationDate
Debug.Print AccountExpirationDate
Примечание
В приведенном фрагменте кода с помощью оператора Or Error Resume Next игнорируются ошибки выполнения. Если для учетной записи пользователя не определен срок действия, ADSI сгенерирует ошибку, связанную с отсутствием данного свойства в кэше свойств, и остановится выполнение процедуры. Если вы постоянно забываете использовать оператор Or Error Resume Next, попробуйте переписать предыдущую процедуру в виде функции, передавая ей необходимые аргументы.
При использовании этого оператора ADS1 вернет значение 0, если для учетной записи пользователя не определен срок действия.
Установка срока действия учетной записи с помощью Visual Basic
Если в компании есть временные сотрудники, имеет смысл определить для них срок действия учетной записи, установив соответствующее значение свойству AccountExpirationDate.
Примечание
Обратите внимание, что дата в базе SAM не соответствует данным, представленным в диалоговом окне Account Information. В этом окне отображается последний день, когда пользователь может зарегистрироваться в системе (например, он может получить доступ до 23:59:59 дня, указанного в окне Account Information/
Чтобы установить срок действия учетной записи, используйте следующий код:
Dim User As lADsUser.
Dim UserName As String
Dim UserDomain As String .
UserDomain = " Targe t_User_Doma in"
UserName = " Targe t_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _ & ",user")
Dim AccountExpirationDate As Date
AccountExpirationDate = #mm/dd/yyyy#
User .AccountExpirationDate =• AccountExpirationDate
User.Setinfo
Совет
Если вы хотите снять срок действия пароля, установите значение свойства AccountExpirationDate равным #12:00:00#.
Просмотр типа учетной записи с помощью Visual Basic
Администратор Windows NT может использовать одно из замечательных свойств этой операционной системы — создание глобальных или локальных учетных записей. По умолчанию все учетные записи пользователей являются глобальными, т.е. имеют “силу” во всех доменах. Локальная учетная запись ограничена тем доменом, в котором она создана.
Локальная учетная запись используется довольно редко, например необходимо запретить пользователю доступ к ресурсам удаленных доменов или пользователю домена, не имеющего доверительных отношений, разрешить доступ (временный) к ресурсам вашего домена. Несмотря на это, ADSI позволяет манипулировать этим типом учетной записи.
Для просмотра текущего состояния флага используйте оператор And так, как и для других пользовательских флагов. Если возвращается значение, отличное от нуля, значит, флаг ads_uf_temp_duplicate_account установлен для учетной записи, как показано в приведенном коде Visual Basic.
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = " Target_User_Domain"
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _' _
4 ",user")
Dim Flags As Long
Flags = User.Get("UserFlags")
If (Flags And &H100) <> 0 Then
Debug.Print "Local Account"
Else
Debug.Print "Global Account" End If .
С помощью ADSI тип учетной записи можно изменять с глобальной (по умолчанию) на локальную. Для этого необходимо изменить пользовательский флаг ads_uf_temp_duplicate_account (ОхЮО) в базе SAM выбранной учетной записи.
Обратите внимание, что метод Setinfo следует вызывать дважды — для установки флага ADS_UF_TEMP_DUPLICATE_ACCOUNT (0x100) или ADS_NORMAL_ACCOUNT (0x200). Windows NT не позволяет установить два флага одновременно, так что для предотвращения конфликта необходимо вначале снять один флаг, а затем установить другой.
Преобразование глобальной учетной записи в локальную
Для изменения типа учетной записи пользователя с глобальной на локальную используйте следующий код Visual Basic:
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = ” Target_User_Domain"
UserName = " Target_User_Name”
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _
4 ",user")'
Dim Flags As Long
Flags = User.Get("UserFlags")
If (Flags And 4H200) <> 0 Then
User.Put "UserFlags", Flags Xor &H200
User.Setinfo
Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags Xor &H100
User.Setinfo
End If
Преобразование локальной учетной записи в глобальную'
Для изменения типа учетной записи пользователя с локальной на глобальную воспользуйтесь кодом Visual Basic■
Dim User As lADsUser
Dim UserName As String_
Dim UserDomain As String
UserDomain = " Target_User_Domain"
UserName = ” Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _ 4 ",user")
Dim Flags As Long
Flags = User.Get("UserFlags")
If (Flags And 4H100) <> 0 Then
User.Put "UserFlags", Flags Xor 4H100'
User.Setinfo
'Flags = User.Get ("UserFlags")
User.Put "UserFlags", Flags Xor &H200
User.Setinfo End If
Манипулирование свойством Parameters
Корпорация Microsoft предлагает разработчикам область хранения данных, доступ к которой можно получить, вызвав метод Get интерфейса IADs пользовательского свойства Parameters провайдера Windows NT. В этом поле хранится информация о местоположении профайла Citrix/Terminal Server, а также специфическая пользовательская информация RAS.'
Примечание
С помощью Visual Basic и ADSI довольно сложно программно управлять параметрами профайла Citrix/Terminal Server. Поэтому описание этого процесса выходит за рамки книги. Более подробную информацию можно найти по адресу: http://msdn.ml его soft.com/isapi/msdnlib.ide?theURL=/lIbrary/psdk/ termserv/wtsapi_9hgu.htm.
Настройка параметров RAS требует установки дополнительного DLL-файла, который находится в ADSI Resource Kit.
Программное управление свойствами, недоступными с помощью стандартных графических инструментов операционной системы
Существует несколько свойств, которые недоступны для стандартных графических инструментов операционной системы Windows NT. Доступ к ним можно получить только с помощью ADSL Многие из этих свойств относятся ко внутренним счетчикам системы.
Просмотр значения свойства BadLoginCount с помощью Visual Basic
Используя свойство BadLoginCount интерфейса lADsUser, можно просмотреть значение счетчика, применяемого для подсчета количества неверных попыток регистрации в системе.
Система использует это значение для определения момента блокировки учетной записи. Строго говоря, для системного администратора это значение малопривлекательно. С помощью ADSI можно только просмотреть значение этого счетчика, используя следующий код: On Error Resume Next Dim User As lADsUser Dim UserName As- String Dim UserDomain As String UserDomain = " Target_User_Domainn UserName = " Target_User_Name"-
Set User = GetObject("WinNT://" & UserDomain & "/" UserName 4 ".user")
Dim RetVal As Integer RetVal = User.BadLoginCount Debug.Print RetVal
Примечание
Для предотвращения ошибок (если значения этого свойства нет в кэше свойств) опять-таки используется оператор On Error Resume Next.
Просмотр значения свойства LastLogin для выбранного компьютера с помощью Visual Basic
Это свойство особенно полезно при просмотре базы данных учетных записей локального компьютера, но оно может возвратить неожиданный результат в больших доменах, содержащих несколько резервных контроллеров. Это связано с тем, что пользователь может быть аутентифицирован на любом резервном контроллере домена Windows NT. Для просмотра даты последней регистрации пользователя на сервере или рабочей станции воспользуйтесь кодом
On Error Resume Next Dim User As lADsUser Dim UserName As String Dim UserDomain As String UserDomain = " Target_User_Domain" UserName = " Targe t_ Use r_Name"
Set User = GetObject("WinNT://" 4 UserDomain & "/" UserName _ 4 ".user")
Dim RetVal As Date■
RetVal = User.LastLogin Debug.Print RetVal
Примечание
; Если пользователь никогда не регистрировался в системе, ADSI возвращает ошибку, 1 что приводит к остановке работы приложения. И опять на помощь приходит опера, тор On Error Resume Next.
. Просмотр значения свойства LastLogoff для выбранного компьютера с помощью Visual Basic
Кроме даты последней регистрации в системе, можно определить дату последнего . завершения работы пользователем. И опять-таки можно получить непредсказуемый ' результат при использовании в сети компании нескольких контроллеров домена.
; Для просмотра даты последнего завершения работы в домене используйте следую- • щий код:
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String.
UserDomain = " Target_User_Domain"
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _
",user")
Dim RetVal As Date
RetVal = User.LastLogoff
Debug.Print RetVal
Просмотр значения свойства PasswordMinimumLength учетной записи пользователя с помощью Visual Basic
Для просмотра минимальной длины пароля выбранной учетной записи пользователя отобразите значение свойства PasswordMinimumLength с помощью следующего кода:
Dim User As lADsUser''
Dim UserName As String
Dim UserDomain As String'
UserDomain = " Target_User_Domain"
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _
",user")
Dim RetVal As Integer
RetVal = User.PasswordMinimumLength,
Debug.Print RetVal
Примечание
Обратите внимание, что с помощью провайдера Windows NT можно только просмотреть минимальную длину пароля.
Просмотр значения свойства PasswordRequired учетной записи пользователя с помощью Visual Basic
Чтобы определить, необходимо ли применять пароль существующей учетной записи пользователя, обратитесь к коду
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = " Target_User_Domain"
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" UserName _
",user")
Dim RetVal As Boolean
RetVal = User.PasswordRequired
Debug.Print RetVal
Установка значения свойства PasswordRequired учетной записи пользователя с помощью Visual Basic
Чтобы разрешить отдельному пользователю применять пустой пароль, используйте следующий код:
Dim User As lADsUser
Dim UserName As String
Dim UserDomain As String
UserDomain = " Target_User_Domain"■
UserName = " Targe t_User_Name".
Set User = GetObject("WinNT://" & UserDomain & "/" UserName & ",user")
Dim NewValue As Boolean
NewValue = True
User.PasswordRequired = NewValue
User.Setinfo
Просмотр срока действия пароля пользователя с помощью Visual Basic
По умолчанию Windows NT не позволяет администратору определять различный максимальный срок действия пароля для привилегированных учетных записей. Однако можно создать службу или приложение, которые перечисляют членов группы, просматривают срок действия пароля для каждого пользователя группы, а затем устанавливают бит PasswordExpired каждой учетной записи.
Во многих организациях установлен срок действия паролей от 60 до 90 дней. Этого времени вполне достаточно, чтобы с помощью существующих средств взлома подобрать пароль администратора.
В следующем коде Visual Basic для пользователей группы Domain Admins срок действия паролей равен 30 дням.-.
Dim Group As lADsGroup
Dim GroupName As String
Dim GroupDomain As String
GroupDomain = " Target_User_Domain"
GroupName = "Domain Admins".
Set Group = GetObject("WinNT://" & GroupDomain & "/" GroupName _ 6 ", group")
Dim Member As Variant
Dim User As lADsUser
For Each Member In Group.Members
Set User = GetObject("WinNT://" & GroupDomain & "/" Member.Name _
",user")•
If User.Get("PasswordAge") > 2592000 Then
If (User.Get("UserFlags") And &H10000) = 0 Then
Debug.Print Member.Name
'Для просмотра закомментируйте следующие две строки
User.Put "PasswordExpired", CLng(l)
User.Setlnfo.
End If
End If.'
Next1'
Примечание
Обратите внимание, что большинство временных значений в базе SAM, в том числе и значение свойства PasswordAge, выражается в секундах.
Считывание значения срока действия пароля компьютера
В главе 3, “Методы перечисления контейнера и программное управление политикой учетных записей домена”, речь шла о создании учетной записи компьютера. Для выполнения этого процесса необходимо использовать несколько типов связывания: для
создания объекта в контейнере компьютера, для непосредственного создания объекта компьютера, записываемого в каталог, и для объекта, манипулирующего значениями пользовательскими флагами и паролем.
Учетная запись компьютера, по сути, является скрытой учетной записью пользователя, что предоставляет широкие возможности для хранения дополнительных данных об этом компьютере. Можно использовать свободные поля учетной записи компьютера для хранения данных об основных пользователях этой системы или же физического расположения этого компьютера. Однако гораздо важнее знать, когда этот компьютер последний раз аутентифицировался в домене, чтобы в случае ■ необходимости очистить базу SAM от устаревших данных.•
Средство Server Manager хранит список учетных записей компьютеров, которые месяцами могут не регистрироваться в домене. Администраторы часто забывают просматривать этот список и удалять ненужные записи.
При первом создании учетной записи компьютера повторите процесс установки начального пароля. Как часть канала безопасности, который устанавливается между контроллером домена и рабочей станцией, этот пароль должен быть изменен обычным образом. Комбинируя такое поведение системы с просмотром свойства PasswordAge учетной записи компьютера, можно программно определить, какие компьютеры не регистрировались в домене в определенный промежуток времени.
Как указано в статье Q197478 из Microsoft Knowledge Base, пароли учетных записей компьютеров изменяются по умолчанию каждые семь дней. Если в вашей компании эта смена запрещена (процесс запрещения смены паролей учетных записей компьютеров описан в статье Q154501), можно написать код для определения компьютера, который не изменял свой пароль последние семь дней, т.е. можно предположить/что этот компьютер не подключался к сети. Для большей безопасности измените временной интервал от 90 до 180 дней, чтобы гарантированно определить неактивность систем мобильных пользователей.
Для определения учетной записи компьютера, не подключавшегося к сети более 180 дней, используйте следующий код Visual Basic:
Dim Container As lADsContainer
Dim TargetDomain As String
TargetDomain = uDomain_In_Which_To_Find_01d_Machine_Accounts”
Set Container = GetObject("WinNT://" & TargetDomain)
Dim Member As Variant.
Dim Computer As lADsUser
Container.Filter = Array("Computer")
For Each Member In Container
Set Computer = GetObject("WinNT://" & TargetDomain & "/" _
& Member.Name & "$,user")
If Computer.Get("PasswordAge") > 15552000 Then
Debug.Print Computer.ADsPath & " " & Computer.Get("PasswordAge")
End If.
Next
Если в приведенном фрагменте кода оператор Debug.Print заменить на Container. Delete, можно удалить старые записи об учетных записях серверов или рабочих станций.
Используя вызов Container.Delete с просмотром пользовательского флага ads_uF_workstation_trust_account, можно реализовать безопасное удаление, как показано в следующем фрагменте кода:
Dim Container As,lADsContainer -
Dim TargetDomain As String
TargetDomain = ’’Domain_In_WSich_To_Flnd_Old_Machine_Accounts'' Set Container = GetObject("WinNT://" & TargetDomain) Dim Member As Variant Dim Computer As lADsUser Dim Flags As Variant
Container.Filter = Array("Computer")
For Each Member In Container
Set Computer = GetObject("WinNT://" & TargetDomain & "/" _ & Member.Name & "$,user") If Coirputer.Get("PasswordAge") > 15552000 Then
Flags = Computer.Get("UserFlags")
If (Flags And &H1000) <> 0 Then
Call Container.Delete("computer", Member.Name) End If End If
Next
Внимание
Основной контроллер домена не обновляет пароли каждые семь дней, так что не удаляйте учетную запись основного контроллера домена! .
В приведенном выше фрагменте кода безопасное удаление учетных записей компьютеров выполняется с помощью проверки пользовательского флага. Лучше всего перед удалением устаревших записей просмотреть их с помощью оператора Debug. Print, чтобы не удалить функционирующие системы.
Создание модуля класса NTUserManagement
В этом разделе продолжим рассматривать процедуру создания приложения СОМ- :ервера NTAdmin.DLL, начатую в главе 3, “Методы перечисления контейнера и про- раммное управление политикой учетных записей домена”.
Упражнение 4.1. Создание NTAdmin.DLL: функции управления учетными запи- ■ сями пользователей/• ,
Откройте проект Visual Basic ActiveX DLL NTAdmin, начало создания которого описывается в главе 3. Этот проект можно найти по адресу: http:// www.williamspublishing.com.
Добавьте к проекту новый модуль класса. Если вы начали новый проект, то не забудьте установить ссылку на библиотеку Active DS Type Library с помощью диалогового окна References, доступ к которому осуществляется с помощью команды Projects References.
Переименуйте новый модуль в NTUserManagement. Введите приведенный код в раздел общих объявлений модуля класса.
Public Function QueryUserProperty(ByVai TargetUserDomain As _
String, ByVai TargetUserName As String, ByVai PropertyToQuery _ As String) As Variant
On Error Resume Next
Dim User As lADsUser
Set User = GetObject("WinNT://" & TargetUserDomain & "/" _
& TargetUserName &
",user")'
Select Case UCase(PropertyToQuery)
Case "FULLNAME"
QueryUserProperty = User.FullName
Case "DESCRIPTION"
■ QueryUserProperty = User.Description
Case "ACCOUNTDISABLED"
QueryUserProperty = User.AccountDisabled
Case "ISACCOUNTLOCKED"
QueryUserProperty = User.IsAccountLocked
Case "PROFILE"""
QueryUserProperty = User.Profile
Case "LOGINSCRIPT"
QueryUserProperty = User.Loginscript
Case "HOMEDIRECTORY"
QueryUserProperty = User.HomeDirectory
Case "HOMEDIRDRIVE"
QueryUserProperty = User.Get("HomeDirDrive")
Case "LOGINHOURS"
Dim TimeEntry As Variant
Dim Restriction As Integer
For Each TimeEntry In User.LoginHours
If TimeEntry < 255 Then Restriction = 1 Next If Restriction = 1 Then
QueryUserProperty = False
Else
QueryUserProperty = True End If Case "ACCOUNTEXPIRATIONDATE"
QueryUserProperty = User.AccountExpirationDate
Case "ACCOUNTTYPE"
Dim Flags As Long.
Flags = User.Get("UserFlags")
If (Flags And &H100) <> 0 Then
QueryUserProperty = "LOCAL"
Else
QueryUserProperty = "GLOBAL" End If
Case "BADLOGINCOUNT"
QueryUserProperty = User.BadLoginCount
Case "LASTLOGIN"
QueryUserProperty = User.LastLogin
Case "LASTLOGOFF"
QueryUserProperty = User.LastLogoff
Case "PASSWORDEXPIRED"
QueryUserProperty = User.Get("PasswordExpired")
Case "PASSWORDMINIMUMLENGTH"■
QueryUserProperty = User.PasswordMinimumLength
Case "PASSWORDREQUIRED"
QueryUserProperty = User.PasswordRequired
Case "PASSWORDAGE"
QueryUserProperty = User.Get("PasswordAge")
End Select
End Function
Public Function SetUserProperty(ByVai TargetUserDomain As _ String, ByVai TargetUserName As String, ByVai PropertyToQuery As String, ByVai NewValue As Variant) As Boolean
On Error Resume Next
Dim User As TADsUser
Set User = GetObject("WinNT://" & TargetUserDomain & "/" _ & TargetUserName & ",user") Select Case UCase(PropertyToQuery)
Case "FULLNAME"
User.FullName = NewValue
Case "DESCRIPTION"
User.Description = NewValue
Case "ACCOUNTDISABLED"
User.AccountDisabled = NewValue Case "ISACCOUNTLOCKED"
User.IsAccountLocked = NewValue
Case "PROFILE"
User.Profile = NewValue
Case "LOGINSCRIPT"
User.Loginscript = NewValue Case "HOMEDIRECTORY"
User.HomeDirectory = NewValue Case "HOMEDIRDRIVE"
Call User.Put("HomeDirDrive", NewValue)
Case "ACCOUNTEXPIRATIONDATE"
User.AccountExpirationDate = NewValue Case "ACCOUNTTYPE"
Dim Flags As Long
Flags = User.Get("UserFlags")
If (Flags And &H200) <> 0 Then
User.Put "UserFlags", Flags Xor &H200
User.Setinfo
Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags Xor &H100
Else'
If (Flags And SH100) <> 0 Then
User.Put "UserFlags", Flags Xor &H100
User.Setinfo
Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags Xor &H200 End If
End If
Case "PASSWORDEXPIRED"
Call User.Put("PasswordExpired", NewValue)
Case "PASSWORDREQUIRED"
User.PasswordRequired = NewValue
End Select
User.Setinfo
If Err.Number = 0 Then SetUserProperty = True Else _ SetUserProperty = False
End Function
Public Function ChangeUserPassword(ByVai TargetUserDomain As String, Byval TargetUserName As String, Byval OldPassword As String, ByVai NewPassword As String) As Boolean
Dim User As lADsUser
Set User = GetObject("WinNT://" & TargetUserDomain & "/" _ & TargetUserName & ",user") Call User.ChangePassword(OldPassword, NewPassword)
If Err.Number = 0 Then ChangeUserPassword = True Else _ ChangeUserPassword = False
End Function
Public Function SetUserPassword(Byval TargetUserDomain As _ String, ByVai TargetUserName As String, Byval NewPassword As String) As Boolean
Dim User As TADsUser
Set User = GetObject("WinNT://" & TargetUserDomain & "/" _ s TargetUserName & ",user") Call User.SetPassword(NewPassword)
If Err.Number = 0 Then SetUserPassword = True Else _ SetUserPassword = False
End Function
Public Function UserFlag(ByVai TargetUserDomain As String, _ ByVai TargetUserName As String, ByVai Action As String, _ ByVai UserFlagConstant As String) As Boolean Dim User As TADsUser Dim Flags As Long
Set User = GetObject("WinNT://" & TargetUserDomain & "/" _
& TargetUserName & ",user")
Flags = User.Get("UserFlags")
Select Case UCase(UserFlagConstant)
Case "PASSWD_CANT_CHANGE" 1
Select Case UCase(Action)
Case "SET"
User.Put "UserFlags", Flags Or &H40 User.Setinfo
If Err.Number = 0 Then UserFlag = True Else _
UserFlag = False'
Case "QUERY" If (Flags And &H40) <> 0 Then
UserFlag = True
Else
UserFlag = False‘
End If Case "TOGGLE"
User.Put "UserFlags", Flags Xor &H40 User.Setinfo
If Err.Number = 0 Then UserFlag = True Else _ UserFlag = False End Select
Case "DONT_EXPIRE_PASSWD"
Select Case UCase(Action)
Case "SET"
User.Put "UserFlags", Flags Or SH10000 User.Setinfo
If Err.Number = 0 Then UserFlag = True Else _ UserFlag = False Case "QUERY"
If (Flags And sHlOOOO) <> 0 Then
UserFlag = True
Else ■ UserFlag = False End If Case "TOGGLE"
User.Put "UserFlags", Flags Xor &H1QOOO User.Setinfo
If Err.Number = 0 Then UserFlag = True Else _ UserFlag = False End Select
End Select
End Function
Public Function SetLogonWorkstations(ByVai TargetUserDomain As String, ByVai TargetUserName As String, ByVai Action As String, ByVai Value As String) As Boolean
On Error Resume Next Dim User As TADsUser Dim Workstation As Variant Dim NewElement() As Variant Dim i As Long Dim Entry As Variant Dim EmptyArray As Integer Dim ValueAlreadyExists As Integer Set User = GetObject("WinNT://" S TargetUserDomain S "/" _ & TargetUserName & ",user") Select Case UCase(Action)
Case "ADD"
If IsArray(User.Loginworkstations) = True Then For Each Entry In User.Loginworkstations
i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Entry
■ If Entry = "" Then EmptyArray = 1
If Entry = Value Then ValueAlreadyExists = 1 Next If EmptyArray = 1 Then
User.Loginworkstations = Array(Value) User.Setinfo Else
If ValueAlreadyExists о 1 Then i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Value User.Loginworkstations = NewElement User.Setinfo ■ End If End If Else
If User.Loginworkstations <> Value Then
User.Loginworkstations = Array(User.Loginworkstations, Value)■
User.Setlnfo End If
End If
Case "REMOVE"
If IsArray(User.Loginworkstations) = True Then For Each Entry In User.Loginworkstations If UCase(Value) <> UCase(Entry) Then
i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Entry End If
Next
User.Loginworkstations = NewElement User.Setlnfo Else
If User.Loginworkstations = Value Then User.Loginworkstations = Array("") User.Setlnfo End If End If End Select
If (Err.Number = 0 Or Err.Number = 9 Or Err.Number = 92) Then SetLogonWorkstations = True
Else
SetLogonWorkstations = False
End If
End Function
Public Function EnumerateLogonWorkstations(ByVai _ TargetUserDomain As String, ByVai TargetUserName As String) _ As Variant
On Error Resume Next Dim User As lADsUser Dim Workstation As Variant Dim NewElement() As variant Dim i As Long
Set User = GetObject("WinNT://" & TargetUserDomain & "/" _ s TargetUserName & ",user") If User.Loginworkstations = "" Then
For Each Workstation In User.Loginworkstations
i = UBound(NewElement) + 1 'ReDim Preserve NewElement(i)
NewElement(i) = Workstation Next'
EnumerateLogonWorkstations = NewElement Else EnumerateLogonWorkstations = Array(User.Loginworkstations) End If End Function
Скомпилируйте код в виде NTAdmin.DLL.
Сохраните и закройте проект NTAdmin.
("онст
Код проекта, а также скомпилированную его версию, можно найти по адресу: http://www.williamspublishing.сот.•
Использование функций модуля NTUserManagement
После создания модуля класса NTUserManagement можно использовать его функции практически из любого языка программирования, который поддерживает автоматизацию OLE, например Visual Basic, VBScript или JavaScript.
('онет
Создание экземпляра объекта и необходимый синтаксис приведены в главе 3. Не забудьте изменить имя класса на NTUserManagemen t, где это необходимо.
В табл. 4.1 приведен синтаксис каждого метода интерфейса NTUserManagement.
Таблица 4.1. Синтаксис методов интерфейса NTUserManagement
ДействиеСинтаксис
Просмотр полного имени пользователя
QueryUserProperty("Target_User_Domain", "Target_User_Name", "FullName")
Просмотр описания пользователя
QueryUserProperty("Target_User_Domain", "Target_User_Name", "Description")
Определение состояния отключения учетной записи
QueryUserProperty("Target_User_Domain", "Target_User_Name", "AccountDisabled")
Определение состояния блокировки учетной записи
QueryUserProperty("Target_User_Domain", "Target_User_Name", "IsAccountLocked")
Действие
Синтаксис
Просмотр месторасположе-
QueryUserProperty("Target_User_Domain",
ния пользовательского профайла
Просмотр сценария регистрации
Просмотр месторасположения личного каталога
Просмотр имени логического диска, присвоенного подключенному личному каталогу
Просмотр условий временной регистрации
Просмотр срока действия учетной записи
Просмотр типа учетной записи (локальная или гло- бальная)
Просмотр числа неверных попыток регистрации в системе
Просмотр даты последней регистрации
Просмотр даты последнего выхода из системы
Просмотр срока действия пароля
Просмотр минимальной длины пароля
Просмотр возможности использования пустого пароля
Просмотр срока действия пароля
Установка полного имени пользователя
Установка описания пользователя
Отключение учетной записи
"Target_User_Name", "Profile")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "Loginscript")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "HomeDirectory")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "HomeDirDrive")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "LoginHours")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "AccountExpirationDate")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "AccountType")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "BadLoginCount")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "LastLogin")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "LastLogoff")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "PasswordExpired")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "PasswordMinimumLength")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "PasswordRequired")
QueryUserProperty("Target_User_Domain", "Target_User_Name", "PasswordAge")
SetUserProperty("Target_User_Domain", "Target_User_Name", "FullName", "NewValue")
SetUserProperty("Target_User_Domain", "Target_User_Name", "Description", "NewValue")
SetUserProperty("Target_User_Domain", "Target_User_Name", "AccountDisabled", True)
Сброс блокировки учетной записи
SetUserProperty("Target_User_Domain", "Target_User_Name", "isAccountLocked", True)
Установка месторасположения пользовательского профайла
SetUserProperty("Target_User_Domain", "Target_User_Name", "Profile", "NewValue")
Действие
Синтаксис
Установка сценария регистрации
Установка месторасположения личного каталога
SetUserProperty("Target_User_Domain", "Target_User_Name", "Loginscript", "NewValue")
SetUserProperty("Target_User_Domain", "Target_User_Name", "HomeDirectory", "NewValue")
Установка имени логического диска, присвоенного подключенному личному каталогу
Установка срока действия учетной записи
SetUserProperty("Target_User_Domain", "Target_User_Name", "HomeDirDrive", "NewValue")
SetUserProperty("Target_User_Domain",
"Target_User_Name", "AccountExpirationDate",
#NewValue#)
Изменение типа учетной записи
SetUserProperty("Target_User_Domain", "Target_User_Name", "AccountType", "")
Установка срока действия пароля
Установка возможности использования пустого пароля Изменение пароля пользователя
Установка пароля пользователя
Просмотр бита User Cannot Change Password
Установка бита User Cannot Change Password
Изменение бита User Cannot Change Password
Просмотр бита Password Never Expires
Установка бита Password Never Expires
Изменение бита Password Never Expires
Добавление регистрации рабочей станции
Удаление регистрации рабочей станции
SetUserProperty("Target_User_Domain", "Target_User_Name", "PasswordExpired", True)
SetUserProperty("Target_User_Domain", "Target_User_Name", "PasswordRequired", True)
ChangeUserPassword("Target_User_Domain", "Target_User_Name","Old_Password", "New_Password")
SetUserPassword("Target_User_Domain", "Target_User_Name", "New_Password")
UserFlag("Target_User_Domain", "Target_User_Name", "Query", "PASSWD_CANT_CHANGE")
UserFlag("Target_User_Domain", "Target_User_Name", "Set", "PASSWD_CANT_CHANGE")
UserFlag("Target_User_Domain", "Target_User_Name", "Toggle", "PASSWD_CANT_CHANGE")
UserFlag("Target_User_Domain", "Target_User_Name", "Query", "DONT_EXPIRE_PASSWD")
UserFlag("Target_User_Domain", "Target_User_Name", "Set", "DONT_EXPIRE_PASSWD")
UserFlag("TaBget_User_Domain", "Target_User_Name", "Toggle", "DONT_EXPIRE_PASSWD")
SetLogonWorkstations("Target_User_Domain", "Target-Us^J^5™6" , "№", "New_Logon_Workstation")
SetLogonWorkstations("Target_User_Domain", "Target_User_Name", "Remove", "Workstation_To_Remove")
Перечисление регистрации рабочих станций
For Each Item In EnumerateLogonWorkstations( ”Target_User_Domain", "Target_User_Name")
Debug.Print Item
Next
Резюме
Используя интерфейс TADsUser, можно автоматизировать большинство ежеднев- 1ых административных задач. Комбинируя функции перечисления со свойствами и гетодами интерфейса TADsUser, можно просматривать и манипулировать учетными аписями в связанных контейнерах и содержащихся в них объектах.
Интерфейс TADsUser можно применять не только для учетных записей поль- ователей, но и для учетных записей компьютеров, что открывает возможности, 1едоступные с помощью инструментов операционной системы. Например, можно аполнить неиспользуемые поля данными об основном пользователе этого ком- 1ьютера, его физическом месторасположении или принадлежности к единице 1нфраструктуры компании.
Используя срок действия пароля учетной записи пользователя, можно заставить пользователей с привилегированными учетными записями изменять свои пароли чаде других пользователей. Уменьшив срок действия пароля “критически важных” /четных записей до 30 дней, можно предотвратить попытки взлома этих паролей с помощью метода последовательного перебора. Не забывайте, что шифрование базы ЗАМ с помощью утилиты SysKey — наилучшая защита от подобного взлома.
С помощью интерфейса TADsUser можно получить доступ к полям и счетчикам, которые недоступны обычным средствам операционной системы Windows NT, напри- чер BadLoginCount, LastLogin и LastLogoff. На основе примеров кода Visual Basic, приведенных в этой главе, можно создать полнофункциональное приложение для управления пользователями.
Программное управление группой
Управление группами и членами группы — одна из типичных операций, выполняемых администратором при управлении безопасностью файловой системы. Используя с помощью Visual Basic методы интерфейсов lADsGroup и lADsUser, можно просматривать и манипулировать группами в пространстве имен Windows NT. Приведенные в этой главе фрагменты кода помогут вам при создании приложения управления безопасностью Windows NT, в котором используется аутентификация по умолчанию и механизмы контроля доступа.
Кроме описания манипулирования группами, в этой главе рассматриваются практические способы управления безопасностью файловой системы, когда необходимо дать строго разграничивающий доступ к файлам и каталогам, размешенным в разделе с файловой системой NTFS.
Опираясь на материал этой главы, вы сможете продолжить процесс создания приложения СОМ-сервера NTAdmin.DLL, начатый еще в главе 3, “Методы перечисления контейнера и программное управление политикой учетных записей домена”.
Администрирование групп безопасности
Windows NT
Интерфейс lADsGroup поддерживает полное управление группой объектов в доменах или отдельной базе SAM серверов либо рабочих станций Windows NT. С помощью этого интерфейса (рис. 5.1) можно выполнять следующие функции в пространстве имен Windows NT: ■
Рис. 5.1. Диалоговое окно Group Membership
добавлять членов к любой выбранной группе;
удалять членов из любой выбранной группы;
перечислять членов группы;
. • выяснять принадлежность пользователя к определенной группе;
просматривать или устанавливать дескриптор любой выбранной группе.
Новые возможности интерфейса lADsGroup появляются при его совместном использовании с методом Groups интерфейса TADsUser.
Связывание группы
Для манипулирования объектом группы с помощью ADSI вначале необходимо связать его с желаемым объектом группы. В общем случае синтаксис этого связывания выглядит следующим образом:
Setobject("WinNT://" s DomainName s "/" & GroupName & ",group")
Обратите внимание на класс объектов, являющийся частью строки связывания. Помните, что явное его определение обеспечивает оптимальную производительность.
Совет
Несмотря на эти необязательные параметры, имя класса должно всегда определяться как часть строки связывания для устранения двусмысленности и повышения производительности.
Связывание группы с помощью Visual Basic
В качестве примера связывания рассмотрим следующий код:
Dim Group As lADsGroup
Dim GroupName As String
Dim GroupDomain As String
GroupDomain = " Target_Group_Domain"
GroupName = " Target_Group_Name"
Set Group = GetObject("WinNT://" & GroupDomain & "/" s GroupName s ".group")
Для выполнения операции связывания объекта группы в вашей среде просто замените значения GroupDomain и GroupName соответствующими значениями, применимыми в вашей компании. Связав объекты, можно манипулировать доступными свойствами и методами интерфейса lADsGroup.
Добавление пользователей в группу
Довольно часто системным администраторам приходится добавлять учетные записи пользователей к какой-нибудь группе. В интерфейсе lADsGroup есть метод Add, с помощью которого можно управлять членами группы.
Для добавления нового члена текущего связанного объекта группы используйте следующий синтаксис:
Group.Add(ADsPath of User Object)
Совет
Вы можете явно установить ADsPath как WinNT://Domain/User или же связать объект пользователя и затем передать значение свойства ADsPath методу Add интерфейса lADsGroup.
Добавление пользователей в группу с помощью Visual Basic
Для добавления пользователя к существующей группе Windows NT предлагается следующий код:
Dim Group As ZADsGroup
Dim GroupName As String
Dim GroupDomain As String
Dim User As ZADsUser
Dim UserName As String
Dim UserDomain As String
GroupDomain = " Target_Group_Domain"
GroupName = " Target_Group_Name"
UserName = " Target_User_Name"
UserDomain = " Target_User_Domain"
Set User = GetObject("WinNT://" s UserDomain S "/" S UserName _
S ",user")
Set Group = GetObject("WinNT://" s GroupDomain s "/" S GroupName s ", group")
Group.Add(User.ADsPath)
Group.SetInfо
Удаление пользователя из группы
Если пользователя можно добавить, то его можно и удалить из группы с помощью соответствующего метода интерфейса ZADsGroup. Синтаксис метода Remove подобен синтаксису Add и выглядит следующим образом:
Group.Remove(ADsPath of User Object)
Удаление пользователей из группы с помощью Visual Basic
Для удаления пользователя из существующей группы используйте код
Dim Group As ZADsGroup
Dim GroupName As String
Dim GroupDomain As String
Dim User As ZADsUser
Dim UserName As String
Dim UserDomain As String
GroupDomain = " Target_Group_Domain"
GroupName = " Target_Group_Name"
UserName = " Target_User_Name"
UserDomain = " Target_User_Domain"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName _
S ",user")
Set Group = GetObject("WinNT://" 4 GroupDomain s "/" & GroupName _
S ", group")
Group.Remove(User.ADsPath)
Перечисление членов группы
С помощью средства User Manager можно просмотреть членов группы, а также добавить или удалить учетные записи.
Перечисление членов группы с помощью Visual Basic
Для перечисления всех пользователей выбранной группы используйте следующий код:
Dim Group As lADsGroup
Dim GroupName As String
Dim GroupDomain As String
SroupDomain = " Target_Group_Domain"
SroupName = " Target_Group_Name"
Set Group = GetObject("WinNT://" & GroupDomain s "/" s GroupName 6 ", group")
For Each Member In Group.Members
Debug.Print Member.Name
Hext
Просмотр группы, к которой принадлежит пользователь
Метод IsMember возвращает значение типа Boolean, указывающее, принадлежит ли переданная ему учетная запись пользователя текущей связанной группе. Чтобы эта операция прошла без ошибок, ее следует выполнять перед добавлением пользователя к определенной группе.
Совет
Комбинируя значение, возвращаемое методом IsMember, с другими условиями, можно добиться потрясающих результатов. Например, перед выполнением какого-либо действия можно проверять принадлежность учетной записи к группе администраторов.
Просмотр группы, к которой принадлежит пользователь, с помощью Visual Basic
Для определения группы, к которой принадлежит пользователь, воспользуйтесь кодом
Dim Group As lADsGroup '
Dim GroupName As String‘
Dim GroupDomain As String
Dim User As lADsUser.
Dim UserName As String
Dim UserDomain As String
GroupDomain = " Targe t_Group_Doma in"
GroupName = " Target_Group_Name"
UserName = ” Target_User_Name"
UserDomain = " Target_User_Domainn
Set User = GetObject("WinNT://" s UserDomain s "/" s UserName _
6 ",user")
Set Group = GetObject("WinNT://" S GroupDomain S "/" & GroupName _
S ", group")
Dim RetVal As Boolean
RetVal = Group.IsMember(User.ADsPath)
Debug.Print RetVal.
Примечание
Обратите внимание, что вначале связывается учетная запись пользователя, а затем пользовательский объект ADsPath передается методу IsMember. На это есть две причины. Во-первых, необходимо удостовериться, что такая учетная запись существует перед просмотром группы, к. которой она принадлежит. А во-вторых, на компьютерах, не являющихся контроллерами домена (за исключением их явного объявления),
ADSI вернет неверный результат. Использование свойства ADsPath в качестве аргумента метода IsMember — единственный способ правильного и аккуратного определения группы, к которой принадлежит пользователь.
Примечание
При использовании метода IsMember важно помнить, что значение False возвращается в том случае, если пользователь является участником всех глобальных групп.
Исследование возможности использования метода IsMember для контроля визуализации элементов интерфейса в Active Server Pages
Один их наиболее полезных для Web-разработчиков методов интерфейса lADsGroup — IsMember. Многие функции ADSI доступны только для пользователей привилегированной учетной записи, в то время как метод IsMember может применять любой пользователь.
Для Web-разработчиков, часто имеющих дело со страницами, защищенными системами Challenge/Response или Basic Authentication, это свойство поможет создать более “изощренный” Web-интерфейс. Конечно, для этого можно использовать другие объекты, но IsMember — более эффективный и простой метод контроля визуализации Web-страниц по принадлежности пользователя к определенной группе.
Используя метод IsMember в Active Server Page, можно активизировать и деактиви- зировать элементы интерфейса по принадлежности пользователя к определенной группе. Это позволит отказаться от использования файлов типа cookies, баз данных пользовательских предпочтений и даже предотвратить (щелчком на ссылке) отображение данных, доступ к которым пользователю запрещен.
Рассмотрим следующий сценарий использования метода IsMember в сценариях Active Server Page: руководящим менеджерам компании необходимо корректировать оценки производительность сотрудников, используя новое intranet-приложение. Чтобы максимально упростить пользовательский интерфейс, команда разработчиков решила, что ссылки на документы будут доступны только ограниченному кругу пользователей. С помощью метода IsMember интерфейса IADs Group разработчик может выполнить запрос к базе SAM и выяснить, принадлежит ли пользователь к группе (в данном примере к группе руководящих менеджеров), которая может выполнять это действие.
В отличие от клиентских сценариев, ASP может скрыть от пользователя весь код и сгенерировать для просмотра результирующий HTML-документ. Если условие проверки принадлежности пользователя к определенной группе возвращает значение False, то пользователь не принадлежит к “привилегированной ” группе и все ссылки на конфиденциальные документы работать не будут.
Просмотр и установка значений поля описания группы
В базе SAM запись о каждой глобальной или локальной группе содержит необязательное поле, в которое можно ввести описание функций этой группы. Если в это поле ввести данные, удовлетворяющие заранее принятому стандарту (например, функции группы или имя приложения, используемого пользователями группы), то оно может использоваться при выполнении расширенных запросов с помощью методов перечисления ADSL
Для просмотра и установки значений поля описания группы предназначено свойство Description интерфейса lADsGroup. .
Просмотр значения поля описания группы с помощью Visual Basic
Чтобы просмотреть значение поля описания группы, воспользуйтесь следую- цим кодом:
Dim Group As ZADsGroup
Dim GroupName As String
Dim GroupDomain As String
GroupDomain = " Targe t_Group_Doma in”
GroupName = ” Target_Group_Name".
Set Group = GetObject("WinNT://" & GroupDomain 6 "/" & GroupName _
S ", group")
Dim RetVal As String
RetVal = Group.Description
Debug.Print RetVal
Установка нового значения поля описания группы с помощью
Visual Basic
Программная установка нового значения поля описания группы осуществляется практически так же, как и его считывание.
Сонет
Возможность программного управления полем описания группы особенно полезна в приложениях установки, которые создают новую группу или добавляют необходимую информацию к уже существующим группам..
Для установки нового значения поля описания группы используйте код
Dim Group As ZADsGroup
Dim GroupName As String
Dim GroupDomain As String
Dim GroupDescription As String
GroupDomain = " Target_Group_Domain”
GroupName = " Target_Group_Name"
GroupDescription = ” Target_Group_Description” ■
Set Group = GetObject("WinNT://" & GroupDomain & "/" & GroupName _
S ", group")
Group.Description = GroupDescription
Group.Setinfo
Если же информацию в поле описания группы требуется дополнить, сначала просмотрите существующие данные, затем объедините их с новыми и сохраните в каталоге. Используйте для этого следующий код Visual Basic:
Dim Group As ZADsGroup
Dim OriginalValue As String
Dim ValueToAppend As String
Dim NewValue As String
Dim GroupName As String
Dim GroupDomain As String
GroupDomain = " Targe t_Group_Doma in"
GroupName = ” Target_Group_Name”
Set Group = GetObject("WinNT://" & GroupDomain & "/" & GroupName _
S ", group")
OriginalValue = Group.Description
ValueToAppend = " (Owner=NT Engineering)"
'lewvalue = Originalvalue & ValueToAppend
Group.Description = NewValue
Group.Setlnfo
Перечисление пользователей — членов группы
С помощью средства User Manager можно просмотреть список всех групп домена, а также группы, к которым принадлежит определенный пользователь. Метод Members интерфейса lADsGtoup позволяет просмотреть список всех пользователей, входящих в выбранную группу, а также перечислить все группы, к которым принадлежит выбранный пользователь.
Перечисление с помощью Visual Basic групп, членом которых является пользователь
Для просмотра списка групп, к которым принадлежит пользователь, используйте следующий код:
Dim User As TADsUser
Dim Group AS TADsGroup
Dim UserDomain As String
Dim UserName As String
UserDomain = " Target_User_Domain"'
UserName = " Target_User_Name"
Set User = GetObject("WinNT://" s UserDomain s "/" s UserName _
S ",user")
For Each Group In User.Groups '
Debug.Print Group.Name
Next
Использование групп для управления безопасностью файловой системы
Для управления разрешениями файловой системы Microsoft предлагает довольно специфичные методы, которые одновременно снижают риск и упрощают администрирование. Строго следуя ее рекомендациям, можно выполнять программное управление разрешениями файловой системы с помощью ADSL
К сожалению, в большинстве компаний не соблюдают рекомендации Microsoft по управлению разрешениями файловой системы, поскольку они представляются слишком сложными в поддержке. Microsoft рекомендует следующую стратегию управления группами безопасности Windows NT.
Поместите все учетные записи пользователей в глобальные группы домена.
Добавьте эти глобальные группы в локальные группы домена.
Добавьте разрешения на доступ к ресурсам с помощью списка контроля доступа (Access Control List — ACL), включив запись контроля доступа (Access Control Entry — АСЕ) для локальной группы.
Однако большинство компаний не следуют приведенным рекомендациям и применяют собственную стратегию безопасности. Тем не менее не стоит пренебрегать рекомендациями разработчиков из Редмонда, хотя бы, например, из-за элегантности администрирования. Если вы постоянно следуете правилу “объединять пользователей в глобальные группы, глобальные — в локальные, разрешения ресурсов использовать только в локальных группах”, то после установки каталога не нужно добавлять или удалять АСЕ из ACL ресурса. Простое создание группы для каждого каталога, которому необходимы уникальные разрешения, поможет устранить все непосредственные манипуляции с ACL.
Рассмотрим следующую структуру каталога:
\'
D:\Data.
D:\Data\MSOfficeData
\DataWisualStudioData
\Apps
\Apps\MSOffice
D:\Apps\VisualStudio
В большинстве компаний доступ к определенным папкам устанавливается с помощью модификации ACL, т.е. добавления АСЕ учетной записи пользователя или глобальной группы, к которой принадлежит пользователь. Таком образом довольно просто можно разрешить доступ К папкам D:\Data\MSOffice И D:\Data\MSOfficeData. Однако подобная операция существенно усложняется при установке аналогичных разрешений для 10—20 папок.
Создание дочерней структуры
Вы можете получить более жесткий контроль над объектами файловой системы, создав одну локальную группу на файловом сервере для каждого каталога в структуре. Если пользователю необходимы различные уровни доступа (Read Only, Change, Full Control или No Access), в каталоге можно создать несколько локальных групп для выполнения всех необходимых условий разграничения доступа.
Начиная с корневого каталога, предоставьте доступ группе D Drive (вместо диска D можно использовать любой необходимый диск) и распространите изменения вниз по дереву файловой структуры. Продолжая перемешаться вниз по этой структуре, создайте для каждого каталога необходимую локальную группу, требующую уникальных разрешений в файловой системе.
После создания локальных групп добавьте к ним пользователей, которым необходим соответствующий доступ к файлам в каталогах, т.е. пользователь, имеющий доступ к верхнему элементу созданной структуры, автоматически получает доступ ко всем дочерним элементам. И наоборот: пользователь, получивший доступ к дочерней структуре, не получает необходимых прав в родительских элементах этой структуры. В табл. 5.1 приведен пример списка контроля доступа к каталогам.
Таблица 5.1. Создание иерархической структуры файловой системы
Ресурс
Локальная группа
Уровень доступа
D:
D_Drive_FC
Full Control
D_Drive_CH.
Change.
D_Drive_RO
Read Only
D:\Apps
D_Drive_FC
Дочерняя (Full Control)
D_Drive_CH
Дочерняя (Change)
D_Drive_RO
Дочерняя (Read Only)
D_Apps_FC
Full Control
D_Apps_CH
Change Control
D_Apps_RO
Read Only
D: \Apps\MSOffice
D_Drive_FC
Дочерняя (Full Control)
D_Drive_CH
Дочерняя (Change)
D_Drive_RO
Дочерняя (Read Only)
Окончание табл. 5.1
Ресурс
Локальная группа
Уровень доступа
D_Apps_FC
Дочерняя (Full Control)
D_Apps_CH ■
Дочерняя (Change)
D_Apps_RO
Дочерняя (Read Only)
D_Apps_MSOffice_FC
Full Control
D_Apps_MSOffice_CH
Change
D_Apps_MSOffice_RO
Read Only
Если пользователь является членом группы D_Apps_MSOffice_RO, то эта группа имеет доступ только для чтения к каталогу D:\Apps\MSOffice, а к родительским структурам этого каталога (D:\AppsX и D:X) — нет.
Если создать глобальную группу MSOfficeUsers в домене, то ее можно добавить к соответствующим локальным группам на сервере (D_Apps_MSOffice и D_Apps_MSQfficeData'l, что устраняет необходимость явной установки разрешений для этих каталогов каждой учетной записи пользователя.
Теперь после добавления учетных записей пользователей к глобальной группе MSOffice_Users в домене любая учетная запись, принадлежащая к этой группе, будет иметь доступ к каталогам с программами и данными, связанными с MSOffice.
Примечание
Процесс создания групп и помещения в них соответствующих учетных записей пользователей довольно длительный. Однако, выполнив его один раз, впоследствии можно более эффективно управлять (как вручную, так и программно с помощью ADSI) безопасностью файловой системы. .
Устраняя необходимость манипулирования ACL каждого отдельного ресурса, вы снижаете риск неверной модификации этого ACL, что может привести к несанкционированному доступу пользователей к закрытым ранее ресурсам. Помните, что основная задача администратора заключается в управлении группами пользователей, а не списками контроля доступа к определенным ресурсам.
При разработке приложений администрирования, использующих описанный метод, соблюдайте особое внимание, поскольку одна-единственная ошибка может открыть несанкционированный доступ к ресурсу. Прежде чем запускать созданное приложение в сети компании, проанализируйте правильность его функционирования в тестовой среде.
Создание модуля класса NTGroupManagement
Теперь можете продолжить создание приложения СОМ-сервера NTAdmin.DLL.
Упражнение 5.1. Создание NTAdmin.DLL: функции управления группами пользователей.
Откройте проект Visual Basic ActiveX DLL NTAdmin, который вы начали создавать, читая главу 3. Этот проект можно найти по адресу: http:// www.williamspublishing.com.
Добавьте к проекту новый модуль класса. Если вы начали новый проект, то не забудьте установить ссылку на библиотеку Active DS Type Library, используя диалоговое окно References, доступ к которому осуществляется с помощью команды Project ^References.
Переименуйте новый модуль в NTGroupManagement. Введите следующий код в раздел общих объявлений модуля класса:
Public Function ManageGroup(ByVai TargetGroupDomain As String, _ ByVai TargetGroupName As String, ByVai TargetUserDomain As _ String, ByVai TargetUserName As String, ByVai Action As _ String) As Boolean
Dim Group As lADsGroup
Dim User As TADsUser
Set User = GetObject("WinNT://" s TargetUserDomain s "/" _ s TargetUserName s ",user").
Set Group = GetObject("WinNT://" s TargetGroupDomain s "/” _ s TargetGroupName s ", group") Select Case UCase(Action)
Case "ADD"
Group.Add (User.ADsPath)
Case "REMOVE"
Group.Remove (User.ADsPath)
End Select
Group.SetInfо
If Err.Number = 0 Then ManageGroup = True Else MahageGroup = False End Function
Public Function EnumerateGroupMembers(ByVai TargetGroupDomain As _:
String, ByVai TargetGroupName As String) As Variant
On Error Resume Next
Dim Group As lADsGroup-
Dim NewElement!) As Variant
Dim i As Long
Set Group = GetObject("WinNT://" s TargetGroupDomain s "/" _
s TargetGroupName s ", group")
For Each Member In Group.Members
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = Member.Name
Next'
EnumerateGroupMembers = NewElement
End Function
Public Function VerifyGroupMembership(ByVai TargetGroupDomain As _
String, ByVai TargetGroupName As String, ByVai TargetUserDomain _
As String, ByVai TargetUserName As String) As Boolean
Dim Group As lADsGroup
Dim User As lADsUser
Set User = GetObject("WinNT://" s TargetUserDomain s "/" _
s TargetUserName s ",user")
Set Group = GetObject("WinNT://" s TargetGroupDomain s "/" _
s TargetGroupName s ",group")
VerifyGroupMembership = Group.IsMember(User.ADsPath)
End Function
Public Function QueryGroupDescription(ByVai TargetGroupDomain _
As String, ByVai TargetGroupName As String) As String
Dim Group As lADsGroup
Set Group = GetObject("WinNT://" s TargetGroupDomain s "/" _
s TargetGroupName s ", group")
QueryGroupDescription = Group.Description
End Function
Public Function SetGroupDescription(ByVai TargetGroupDomain As _ String, ByVai TargetGroupName As String, ByVai NewDescription As String) As Boolean '
Dim Group As lADsGroup.
Set Group = GetObject("WinNT://" S TargetGroupDomain S "/" _
& TargetGroupName & ", group")
Group.Description = NewDescription
Group.SetInfо
If Err.Number = 0 Then SetGroupDescription = True _
Else SetGroupDescription = False
End Function
Скомпилируйте код в виде NTAdmin.DLL.
Сохраните и закройте проект NTAdmin.
Совет
Код проекта, а также скомпилированную его версию можно найти по адресу: http://www.williamspublishing.com.
Использование функций модуля NTGroupManagement
После создания модуля класса NTGroupManagement можно использовать его функции практически из любого языка программирования, который поддерживает автоматизацию OLE, например Visual Basic, VBScript или JavaScript.
Совет
Создание экземпляра объекта и необходимый синтаксис приведены в главе 3. Не забудьте изменить имя класса на NTGroupManagement, где это необходимо.
В табл. 5.2 приведен синтаксис каждого метода интерфейса NTGroupManagement.
Таблица 5.2. Синтаксис методов интерфейса NTGroupManagement
ДействиеСинтаксис
Добавление пользователя к группеУдаление пользователя из группыПеречисление всех пользователей в группеДобавление пользователя к группеУдаление пользователя из группыПеречисление всех пользователей в группеDebug.Print ManageGroup("Group_Target_Domain", "Target_Group_Name", "Target_User Dorna in", "Target_UserName", "Add")
Добавление пользователя к группе
Удаление пользователя из группы
Перечисление всех пользователей в группе
Добавление пользователя к группе
Удаление пользователя из группы
Перечисление всех пользователей в группе
Debug.Print ManageGroup("Group_Target_Domain", "Target_Group_Name”, "Target_UserDomain", "Target_UserName", "Remove")
For Each Item In EnumerateGroupMem-
bers("Group_Target_Domain", "Target_Group_Name") Debug.Print Item
Next
Проверка принадлежности пользователя к группеПросмотр описания выбранной группыУстановка нового описания выбранной группыПроверка принадлежности пользователя к группеПросмотр описания выбранной группыУстановка нового описания выбранной группыDebug.Print VerifyGroupMember-
Проверка принадлежности пользователя к группе
Просмотр описания выбранной группы
Установка нового описания выбранной группы
Проверка принадлежности пользователя к группе
Просмотр описания выбранной группы
Установка нового описания выбранной группы
ship("Group_Target_Domain", "Target_Group_Name", "Target_UserDomain", "Target_UserName")
Debug.Print QueryGroupDescription( "Group_Target_Domain", "Target_Group_Name")
Debug.Print SetGroupDescription! "Group_Target_Domain", "Target_Group_Name", "New_Group_Description")
Резюме
Используя методы интерфейсов lADsGroup и lADsUser, разработчики могут создавать приложения на основе базы SAM Windows NT для управления безопасностью приложения. Кроме того, системный администратор получает в свое распоряжение программное средство управления группами.
Для соответствующего управления файловой системой можно использовать ADSI для управления разрешениями каталогов и доступа к приложениям. Хотя с помощью ADSI нельзя непосредственно модифицировать список ACL выбранного ресурса, этот интерфейс, в отличие от программ комплекта Resource Kit, является идеальным средством управления членами групп.
Потенциал ADSI, расширяющий функциональность по умолчанию, не ограничивается созданием новых групп и добавлением к ним пользователей — все зависит от способностей разработчика или администратора. Создав небольшое приложение администрирования, можно существенно сократить время выполнения ежедневных монотонных административных функций.
6
' Программное управление компьютером и службами
Кроме возможности манипулирования пространством имен, ADSI обеспечивает разработчиков и администраторов мощным набором программных интерфейсов для просмотра и управления атрибутами компьютеров в сети компании.
Свойства только для чтения, предоставляемые провайдером Windows NT в интерфейсе lADsComputer, наилучшим образом подходят для управления программным потоком; это позволяет администратору или разработчику устанавливать определенный критерий, например: “приложение может быть запущено только на компьютерах под управлением операционной системы Windows NT”.
Интерфейс lADsService позволяет модифицировать состояние установленных служб, а также имя и путь исполняемых файлов службы.
С помощью интерфейса IADs Serviceoperations можно запускать, останавливать, приостанавливать, просматривать состояние установленных служб на любом выбранном компьютере.
В этой главе речь пойдет об использовании этих трех интерфейсов провайдера Windows NT.
Просмотр свойств компьютера: интерфейс lADsComputer
С помощью интерфейса lADsComputer можно просмотреть различные свойства компьютера, включая использование уровня аппаратных абстракций (Hardware Abstraction Layer — HAL), а также пользователя и организацию, где зарегистрирован этот компьютер. В отличие от инструментов редактирования системного реестра, используемых для манипулирования этими свойствами, все свойства интерфейса lADsComputer провайдера Windows NT применяются только для чтения.
Именно поэтому интерфейс lADsComputer наилучшим образом подходит для сбора статистической информации о компьютерах сети компании или для управления программным потоком. Если необходимо манипулировать значениями свойств этого интерфейса, придется воспользоваться традиционными методами, например редактированием реестра с помощью соответствующих средств операционной системы.
( овет
С помощью фильтра Computer интерфейса lADsContainer можно перечислить все компьютеры в домене. Эта операция более подробно описывалась в главе 3, “Методы перечисления контейнера и программное управление политикой учетных записей домена ”.
Просмотр имени зарегистрированного владельца компьютера с помощью Visual Basic
Просмотреть имя зарегистрированного владельца компьютера можно с помощью параметра Registerowner системного реестра. Но для этого также можно использовать ADSI и следующий код Visual Basic:
Dim Computer As TADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
ComputerDomain = "Target_Computer_Domain"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" _
& ComputerName & ", computer")
Dim RetVal As String
RetVai = Computer.Owner
Debug.Print RetVal
Просмотр с помощью Visual Basic организации, на которую зарегистрирован компьютер
Для этого можно воспользоваться параметром Registerorganization системного реестра. Аналогичное действие можно выполнить с помощью ADSL
Dim Computer As TADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
ComputerDomain = " Target_Conputer_Domain"
ComputerName = ” Target_Computer_Name”
Set Computer- GetObject("WinNT://" & ComputerDomain & "/" _
ComputerName & ", computer")
Dim RetVal As String
RetVal = Computer.Division
Debug.Print RetVal
Просмотр с помощью Visual Basic операционной системы, установленной на компьютере
Для просмотра текущего названия операционной системы, установленной на выбранном компьютере, используйте следующий код Visual Basic:
Dim Computer As TADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
ComputerDomain = " Target_Computer_Domain"
ComputerName = ” Target_Computer_Name”
Set Computer- GetObject("WinNT://" & ComputerDomain & "/" _
& ComputerName & ", computer")
Dim RetVal As String
RetVal = Computer .OperatingSystem
Debug.Print RetVal
Примечание
Если запустить этот код на компьютере под управление Windows NT Workstation, будет возвращено значение Windows NT.
Просмотр с помощью Visual Basic версии операционной системы, установленной на компьютере
Используя свойство OperatingSystemVersion интерфейса lADsComputer, можно узнать номер версии установленной операционной системы Windows на любом компьютере'сети. Для этого используйте следующий код:
Dim Computer As lADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
ComputerDomain = " Target_Computer_Domain"
ComputerName = " Target_Computer_Name"
Set Computer= GetObject("WinNT://" & ComputerDomain & "/" _
ComputerName & ", computer")
Dim RetVal As String
RetVal = Computer.OperatingSystemVersion
Debug.Print RetVal
Примечание
При использовании этого кода возвращается полный номер операционной системы (т.е. со всеми ее ревизиями), например для Windows NT Workstation 4.0 возвращается значение 4.0.
Просмотр типа процессора с помощью Visual Basic
Используя свойство processor интерфейса lADsComputer, можно узнать архитектуру (Alpha или х86), семейство, модель и номер версии установленного в компьютере процессора (или процессоров). Для получения этих данных воспользуйтесь кодом
Dim Computer As lADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
ComputerDomain = "Target_Computer_Domain"
ComputerName = " Target_Computer_Name”
Set Computer= GetObject("WinNT://" & ComputerDomain & "/" _ & ComputerName & ", computer")
Dim RetVal As String
RetVal = Computer.Processor
Debug.Print RetVal
Примечание
Возвращаемые данные выглядят следующим образом: х86 Family 5 Model 4
Stepping 3.
Просмотр установленного HAL в Windows NT с помощью Visual Basic
Можно предположить, что свойство Processorcount возвращает целое число, соответствующее числу установленных в компьютере процессоров. Но на самом деле это
не так. Оно отображает используемый в системе HAL. Для просмотра применяемого в системе уровня аппаратных абстракций воспользуйтесь следующим кодом:
Dim Computer As ZADsComputer
Dim ComputerName As String'
Dim ComputerDomain As String
Computer Domain = "Target_Computer_Domain"
ComputerName = " Target_Computer_Name"
Set Computer= GetObject("WinNT://" & ComputerDomain & "/" _
4 ComputerName & "/Computer'')•
Dim RetVal As String
RetVal = Computer.Processorcount
Debug.Print RetVal
Просмотр и манипулирование службами компьютера: интерфейс lADsService
ADSI предлагает два интерфейса для управления службами Windows NT: lADsService и ZADsServiceOperations. Интерфейс lADsService предназначен для управления конфигурацией установленных служб, a lADsServiceOperations — для администрирования. В этом разделе рассматриваются следующие возможности интерфейса lADsService:
перечисление служб, установленных на выбранном компьютере;
просмотр и установка зависимостей службы;
модификация имени, пути и поведения установленных служб;
просмотр состояния установленной службы..
Перечисление с помощью Visual Basic служб, установленных на выбранном компьютере
Просмотреть список служб, установленных на компьютере, можно с помощью диалогового окна Services (рис. 6.1). Это окно открывается при двойном щелчке на одноименной пиктограмме в окне Control Panel. ■
StartedAutomaticStartedAutomaticManualStartedManualStartedAutomateAutomaticStartedAutomaticManual ManualStarted ManualStartedAutomaticStartedAutomaticManualStartedManualStartedAutomateAutomaticStartedAutomaticManual ManualStarted ManualServices
StartedAutomatic
StartedAutomatic
Manual
StartedManual
StartedAutomate
Automatic
StartedAutomatic
Manual Manual
Started Manual
StartedAutomatic
StartedAutomatic
Manual
StartedManual
StartedAutomate
Automatic
StartedAutomatic
Manual Manual
Started Manual
• Eventlog
FTP Pub6$hing Service
^ Heartbeat Service
i IIS Admin Service
Messenger
. MSDTC
.V Net Logon
./ Network DDE
Network DDE DSDM
NT LM Security Support Provider
>£<^ :
S^rtup Parameters: • • '. v
Puc. 6.1. Диалоговое окно Services
Для генерации списка служб на выбранном компьютере свяжите объект Computer, а затем сузьте полученный результирующий набор до служб с помощью свойства Filter интерфейса lADsContainer.
Комбинируя процесс перечисления со свойствами и методами интерфейсов lADsService и ZADsServiceOperations, можно довольно быстро создать приложения администрирования без применения обычных API-функций.
Для генерации списка служб выбранного компьютера используйте следующий код Visual Basic:
Dim Computer As TADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
ComputerDomain = "Target_Computer_Domain"
ComputerName = " Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" _
& ComputerName & ",computer").
Computer.Filter = Array("service")
Dim Service As lADsService
For Each Service In Computer
Debug.Print Service.Name
Next
Совет
С помощью цикла For.. .Next можно вызывать любое свойство или метод интерфейса lADsService для отображения или модифицирования информации, относящейся к отдельной службе.
Связывание служб с помощью Visual Basic
Если известно программное имя службы (чаще всего исполняемое имя), то после связывания ее параметрами можно манипулировать. Для связывания службы используйте код
Dim Computer As TADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
Dim Service As lADsService
Dim Targetservice As String
Targetservice = " Target_Service_Name"
ComputerDomain = ” Target_Computer_Domain”
ComputerName = " Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/"
& ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
Просмотр зависимостей службы с помощью Visual Basic
Для просмотра службы, зависимой от другой службы, воспользуйтесь следующим кодом:■
On Error Resume Next
Dim Computer As TADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
Dim Service As lADsService
Dim Targetservice As String
Targetservice = "Та где t_Service_Name"
Computer Domain = "Target_Computer_Domain"
ComputerName = " Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" _
ComputerName & ", computer")
Set Service = Computer.GetObject("service". Targetservice)
If IsArray(Service.Dependencies) = True Then,
Dim Entry As Variant
For Each Entry In Service.Dependencies
Debug.Print Entry
Next
Else
Debug.Print Service.Dependencies'
End If■
После выполнения приведенного кода появится список зависимостей в виде массива, который можно использовать для дальнейшего манипулирования.
Сонет
В качестве примера связанных служб просмотрите отношения между службами IISADMIN и W3SVC. На компьютере с установленным сервером IIS остановка службы IISADMIN приведет к появлению диалогового окна с вопросом, следует ли остановить службу WWW-публикации (служба W3SVQ. Если просмотреть свойство Dependencies службы W3SVC, то можно заметить, что служба IISADMIN определена как зависимая от W3SVC.
Установка новой зависимой службы с помощью Visual Basic
После установки новой службы иногда необходимо определить для нее зависимость. Проше всего это сделать с помощью ADSI и следующего кода Visual Basic:
On Error Resume Next.
Dim Computer As lADsComputer
Dim Service As lADsService
Dim NewElement() As Variant
Dim i As Long
Dim EmptyArray As Integer1
Dim DependencyAlreadyExists As Integer
Dim ComputerDomain As String
Dim Targetcomputer As String
Dim Targetservice As String
Dim NewDependency As String
Targetservice = " Targe t_Service_Name"
ComputerDomain = "Target_Computer_Domain"
Targetcomputer = "Target_Computer_Name”’
NewDependency = "mssqlserver"'
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" _
Targetcomputer & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
If IsArray(Service.Dependencies) = True Then
Dim Entry As Variant
For Each Entry In Service.Dependencies
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = Entry
If Entry = "" Then EmptyArray = 1
If Entry = NewDependency Then DependencyAlreadyExists = 1
Next'
If EmptyArray = 1 Then
Service.Dependencies = Array(NewDependency)
Service.Setinfo
Else
If DependencyAlreadyExists <> 1 Then
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = NewDependency
Service.Dependencies = NewElement
Service.Setinfo
End If-
End If
Else
If Service.Dependencies <> NewDependency Then
Service.Dependencies = Array(Service.Dependencies, NewDependency) Service.Setinfo
End If'
End If
Просмотр отображаемого имени службы с помощью Visual Basic
При манипуляции установленной службой необходимо помнить, что имя, используемое для связывания службы, не совпадает с отображаемым именем в диалоговом окне Service. Windows NT позволяет администратору или разработчику определить дополнительную запись для каждой службы, чтобы впоследствии ссылаться на ее более “дружественное” имя. Свойство имени службы — это короткое имя, используемое для программной идентификации службы, которая совпадает с именем исполняемой службы. Свойство отображаемого имени службы — это строка, которая может быть определена для более естественной манипуляции службами с помощью графических инструментов.
Для просмотра отображаемого имени службы воспользуйтесь следующим кодом:
Dim Computer As lADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
Dim Service As lADsService
Dim Targetservice As String
Targetservice = " Target_Service_№me"
ComputerDomain = "Target_Computer_Domain"
ComputerName = " Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" _
& ComputerName & "/Computer")'
Set Service = Computer.GetObject("service", Targetservice)
Debug.Print Service.DisplayName
Если невозможно извлечь имя службы из ее отображаемого имени, то для представления имени в окне Immediate интегрированной среды разработки Visual Basic используйте код
Dim Computer As lADsComputer
Dim ComputerName As String
Dim ComputerDomain As String Dim StringToFind As String
ComputerDomain = " Targe t_Computer_Domain’’
ComputerName = " Target_Computer_Name".
StringToFind = " Display_Name_To_Find”
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" _
S ComputerName & ", computer")
Computer. Filter = Array ("service")
Dim Service As lADsServiceFor Each Service In Computer
If InStr(Service.DisplayName, StringToFind) <> 0 Then
Debug.Print Service.Name; " = "; Service.DisplayName
End If Next
После излечения имени службы из ее отображаемого имени его можно использовать для манипуляций.
Совет
Если преобразовать описанный выше фрагмент кода в функцию, то можно передавать результат в другие связанные со службами функции, используя лишь одну строку кода Visual Basic, например:
Dim Computer As lADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
Dim Service As lADsService
Dim Targetservice As String
Dim ServiceDisplayName As String
ServiceDisplayName = " Display_Name_of_Service”
ComputerDomain = " Target_Computer_Domain”.
ComputerName = "Target_Computer_Name"
Targetservice = GetServiceName(ServiceDisplayName, _
ComputerDomain, ComputerName)
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" _
& ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
Debug.Print Service.Hostcomputer
Public Function GetServiceName(DisplayName As String, _
ComputerDomain As String, ComputerName As String) As String
Dim Computer As lADsComputer
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" _ s ComputerName ", computer")
Computer.Filter = Array("service")
Dim Service As lADsService.
For Each Service In Computer
If InStr(Service.DisplayName, DisplayName) <> 0 Then
GetServiceName = Service.Name
End If
Next
2nd Function
Установка нового отображаемого имени службы с помощью Visual Basic
Изменить отображаемое имя службы можно с помощью присвоения нового значе- шя свойству DisplayName. Для этого используйте следующий код:
)im Computer as lADsComputer )im ComputerName As String.
Dim ComputerDomain As String
Dim Service As IADsService
Dim Targetservice As String
Dim NewDisplayName As String
Targetservice = " Target_Service_№me"
ComputerDomain = "Target_Computer_Domain"
ComputerName = "Target_Computer_Name"
NewDisplayName = "New_Service_Display_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/"
& ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
Service.DisplayName = NewDisplayName
Service.Setinfo
Просмотр имени компьютера с помощью Visual Basic
Свойство Hostcomputer определяет параметр ADsPath компьютера, на котором запушена служба. В большинстве случаев это свойство соответствует параметру ADsPath текущего связанного объекта Computer.
Для просмотра значения свойства Hostcomputer воспользуйтесь кодом
Dim Computer As lADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
Dim Service As lADsService
Dim Targetservice As String
Targetservice = "Target_Service_Name"
ComputerDomain = " Target_Computer_Domain”
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/"
& ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
Debug.Print Service.Hostcomputer
Примечание
С помощью ADSI нельзя программно установить новое значение этого свойства.
Просмотр исполняемого пути службы с помощью Visual Basic
Службы Windows NT являются исполняемыми, так что они могут быть запушены вне границ текущего контекста пользователя, т.е. некоторые службы запускаются независимо от имени пользователя, зарегистрированного в системе. Каждая служба поддерживает собственный путь исполнения, который определяется значением свойства Path.
Ditn Computer As lADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
Dim Service As lADsService
Dim Targetservice As String
Targetservice = "Target_Service_Name"
ComputerDomain = " Targe t_Computer_Doma in"
omputerName = " Target_Computer_Name"
st Computer = GetObject("WinNT://" & ComputerDomain & "/" ComputerName & ", computer")
st Service = Computer.GetObject("service", Targetservice)
ebug.Print Service.Path■
Остановка нового исполняемого пути службы : помощью Visual Basic
Для изменения исполняемого пути службы не обязательно ее переустанавливать. Достаточно изменить значение свойства Path интерфейса lADsService после пере- :ещения необходимых файлов.
Примечание
Модифицировать значение свойства Path можно и во время работы службы, но все изменения вступят в силу только после ее перезапуска.
Для изменения пути исполняемого файла службы используйте следующий код:
im Computer As IADsComputer
im ComputerName As String
im ComputerDomain As String'
im Service As lADsService
im Targetservice As String
im NewServicePath As String
'argetService = "Target_Service_Name"
:omputerDomain = " Target_Computer_Domain"
lomputerName = " Target_Computer_Name"
lewServicePath = ”New_Path_To_Executable"
let Computer = GetObject("WinNT://" & ComputerDomain & "/" _
: ComputerName & ", computer")■
let Service = Computer.GetObject ("service", Targetservice)
lervice.Path = NewServicePath
lervice. Setinfo
Досмотр имени учетной записи службы с помощью
Visual Basic '
Все службы запускаются вне контекста учетной записи пользователя. Незави- имо от выбора учетной записи, она запускается вне границ контекста текущего юльзователя. Это позволяет службам запускаться даже в том случае, если пользо- атель не зарегистрировался в системе, и выполнять привилегированные операми, если в настоящее время в системе зарегистрировался непривилегированный юльзователь.
При щелчке на кнопке Startup в диалоговом окне Service появляется диалоговое «но (рис. 6.2), в котором можно определить учетную запись пользователя, ассоции- юванную с выбранной службой. С помощью интерфейса lADsService аналогичные ействия можно выполнить программно.
Рис. 6.2. В этом диалоговом окне можно ассоциировать учетную запись пользователя с выбранной службой ,
Чтобы узнать имя учетной записи пользователя, ассоциированной со службой, необходимо просмотреть значение свойства ServiceAccountName интерфейса TADsService, используя следующий код Visual Basic:
Dim Computer As TADsComputer
Dim ComputerName As String
Dim ComputerDornain As String Dim Service As TADsService Dim Targetservice As String Targetservice = " Target_Service_Name" ComputerDomain = " Targe t_Cemputer_Doma in" ComputerName = " Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
Debug.Print Service.ServiceAccountName
Совет
Используя функцию перечисления, можно просмотреть все учетные записи служб на выбранном компьютере.
Примечание
С помощью ADSI нельзя программно установить новое значение этого свойства.
Просмотр типа запуска службы с помощью Visual Basic
Тип запуска службы можно узнать с помощью значения свойства Servicestart интерфейса TADsService. В табл. 6.1 приведены значения пяти используемых для этого констант, однако в Windows NT чаще всего применяются последние три.
Таблица 6.1. Константы типа запуска службы
Константа
Значение
ADS_SERVICE_BOOT_START
0
ADS_SERVICE_SYSTEM_START
1
ADS_SERVICE_AUTO_START
2
ADS_SERVICE_DEMAND_START
3
ADS_SERVICE_DISABLED
4
Внимание
Если попытаться установить значение, которого нет в табл. 6.1, например 5, то появится сообщение об ошибке..
Используя приведенные значения констант, можно определить тип запуска служ-
>ы с помощью следующего кода Visual Basic:
Jim Computer As TADsComputer
Jim ComputerName As String
Jim ComputerDomain As String
Jim Service As TADsService
Jim Targetservice As String
rargetService = " Target_Service_Name"
JomputerDomain = " Target_Computer_Domain"
SomputerName = " Target_Computer_Name"
Jet Computer = GetObject("WinNT://" & ComputerDomain & "/" _
> ComputerName & ", computer")
Jet Service = Computer.GetObject("service", Targetservice)
Select Case Service.StartType
Case 0 Debug.Print "BOOT"
Case 1
Debug.Print "SYSTEM"
Case 2 Debug.Print "AUTOMATIC"
Case 3
Debug.Print "MANUAL"
Case 4.j ■ . . .
Debug.Print "DISABLED",
Snd Select
Установка типа запуска службы с помощью Visual Basic
Кроме просмотра, можно также устанавливать новый тип запуска службы, исполь- уя значения описанных в предыдущем разделе констант. Итак, для программного манипулирования типом запуска службы используйте следующий код:
Jim Computer As TADsComputer
Jim ComputerName As String
Jim ComputerDomain As String
Jim Service As TADsService
Jim Targetservice As String
’argetService = " Ta rget_Service_Name"
JomputerDomain = " Target_Computer_Domain"
JomputerName = " Target_Computer_Name"
Jet Computer = GetObject("WinNT://" & ComputerDomain & "/"
ComputerName 4 ", computer")
Set Service = Computer.GetObject("service", Targetservice)
'Для остановки службы используйте значение 4,
'для ручного запуска —Зи для автозапуска — 2
Service.StartType = 4
Service.Setinfo
Примечание
Обратите внимание, что значения свойства StartType должны быть целыми; возможные значения этого свойства приведены в табл. 6.1.
Просмотр и манипулирование работой службы: интерфейс lADsServiceOperations
Дтя программного запуска, остановки, приостановки, продолжения выполнения или изменения пароля учетной записи установленной службы используется интерфейс LADsServiceOperations.
Примечание
Используя функции перечисления со свойством Status, можно просматривать текущее состояние всех служб на выбранном компьютере.
В этом разделе речь пойдет об использовании следующих возможностей интерфейса lADsServiceOperations:
перечисление состояния службы;
просмотр состояния определенной службы;
запуск, остановка, приостановка, продолжение выполнения и отключение установленной службы;
установка нового пароля учетной записи службы.
Просмотр состояния службы с помощью Visual Basic
Для эмуляции функций диалогового окна Service в разрабатываемом приложении можно перечислить установленные службы на выбранном компьютере, а затем классифицировать их состояние.
В табл. 6.2 приведены значения констант состояния служб интерфейса lADsServiceOperations.
Таблица 6.2. Константы состояния службы
Константа
Значение
ADS_SERVICE_STOPPED
1 '
ADS_SERVICE_START_PENDING
2
ADS_SERVICE_STOP_PENDING
3
ADS_SERVICE_RUNNING
4'
Константа
Значение
RDS_SERVICE_CONTINUE_PENDING
5
MS_SERVICE_PAUSE_PENDING
6
M)S_SERVI CE_PAUSE D
7
RDS_SERVICE_ERROR
8
Для просмотра состояния службы используйте следующий код Visual Basic:
to Computer As lADsComputer
to ComputerName As String
to ComputerDomain As String
omputerDomain = " Target_Computer_Domain”
omputerNarne = " Target_Computer_Name”
et Computer = GetObjectCWinNT://" S ComputerDomain s "/" _
ComputerName S ",computer")'
omputer. Filter - Array("service")
to Service As lADsServiceOperations
im Servicestatus As String
or Each Service In Computer
Select Case Service.Status : Case 1
Servicestatus = "Stopped"
Case 2
. Servicestatus = "Start Pending"
Case 3
Servicestatus = "Stop Pending"
Case 4
Servicestatus = "Running" . Case 5
Servicestatus = "Continue_Pending"
Case 6
Servicestatus = "Pause_Pending"
Case 7
Servicestatus = "Paused"
Case 8
. Servicestatus = "Error"
End Select
Debug.Print Service.Name S vbTab & Servicestatus ext
1апуск службы с помощью Visual Basic
Иногда после просмотра состояния всех служб на выбранном компьютере необходи- ю остановить или, наоборот, запустить одну из служб. Используя ADSI, эту задачу южно выполнить программно, “не посещая лично” необходимых компьютеров домена.
Итак, для программного запуска установленной службы воспользуйтесь кодом
im Computer As lADsComputer
im ComputerName As String im ComputerDomain As String im Service As lADsService im Targetservice As String argetService = ” Target_Service_Name" omputerDomain = " Targe t_Computer_Doma in"
ComputerName = " Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" _
& ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
If Service.Status = 1 Then
Service.Start
Debug.Print "Служба " & Service.Name & " запущена."
Else
If Service.Status = 4 Then
Debug.Print "Служба " & Service.Name & " уже запущена."
Else
Debug.Print "Служба " & Service.Name & " не может быть запущена." End If
End If
Совет
Если служба установлена, но в настоящее время отключена, ее запустить нельзя. Перед запуском такой службы попробуйте установить значение свойства startType, равное 2 или 3. ■
Остановка службы с помощью Visual Basic
Для остановки запущенной службы используйте следующий код:
Dim Computer As lADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
Dim Service As lADsService
Dim Targetservice As String-
Targetservice = "Target_Service_Name"
ComputerDomain = "Target_Computer_Domain"
ComputerName = " Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" _
& ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
If Service.Status = 4 Then
Service.Stop'
Debug.Print "Служба " & Service.Name & " остановлена."
Else
If Service.Status = 1 Then
Debug.Print "Служба " & Service.Name & " уже остановлена."
Else
Debug.Print "Служба " & Service.Name & " не может быть остановлена." End If
End If
Приостановка службы с помощью Visual Basic
Приостановить запущенную службу можно с помощью кода
Dim Computer As lADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
Dim Service As lADsService
Dim Targetservice As String
Targetservice = " Target_Service_Name"
ComputerDomain = " Target_Computer_Domain"
omputerName = ’’ Target_Computer_Name"
et Computer = GetObject("WinNT://" & ComputerDomain & "/" _ ComputerName & ", computer")
et Service = Computer.GetObject("service", Targetservice)
f Service.Status = 4 Then'
Service.Pause
Debug.Print "Служба " & Service.Name & " приостановлена."
Use
If Service.Status = 7 Then
Debug.Print "Служба " & Service.Name & " уже приостановлена.
Else
Debug.Print "Служба " & Service.Name & " не может быть _ приостановлена."
End If
;nd if
Совет
Если служба не поддерживает метод Pause, появится критическая ошибка. Чтобы избежать ее, проверьте возможность приостановки этой службы в диалоговом окне Services или в коде используйте оператор On Error Resume Next.
Продолжение выполнения приостановленной службы
: помощью Visual Basic
Если служба приостановлена, то для продолжения ее выполнения используйте сле- 1ующий код:'
Dim Computer As lADsComputer
Dim ComputerName As String
Dim ComputerDomain As String
Dim Service As lADsService
Dim Targetservice As String
FargetService = " Target_Service_Name"
Domputer Domain = " Target_Computer_Domain"
ComputerName = " Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" _
ComputerName & ", computer")
Set Service = Computer.GetObject ("service", Targetservice)
tf Service. Status = 7 Then
Service.Continue
Debug.Print "Служба " & Service.Name & " после приостановки _ запущена."
Use
If Service.Status = 4 Then
Debug.Print "Служба " & Service.Name & " уже запущена."
End If Ind If
Установка нового пароля службы с помощью Visual Basic
Интерфейс XADsServiceOperaions обеспечивает администратора или разработчика 1еобходимыми свойствами манипулирования службой; с точки зрения безопасности >дно из его достоинств — это поддержка метода set Pas sword, с помощью которого южно изменить пароль учетной записи службы. \
Для установки пароля используется свойство ServiceAccountName с помощью следующего кода Visual Basic:
Dim Computer As lADsComputer
Dim ComputerName As String
Dim ComputerDornain As String
Dim Service As lADsService
Dim Targetservice As String
Dim NewPassword As String
Targetservice = " Target_Service_Name"
ComputerDomain = " Target_Computer_Domain" •
ComputerName = " Targe t_ Сотри ter_Name"
NewPassword = " New_Passwordn
Set Computer = GetObject("WinNT://" s ComputerDomain 6 "/"
S ComputerName & "/Computer")
Set Service = Computer.GetObject("service", Targetservice) Service.SetPassword(NewPassword)
Service.Setinfo
(o«em
После программного изменения пароля учетной записи службы в базе SAM необходимо повторно выполнить приведенный код для каждой зависимой службы, чтобы синхронизировать измененную информацию, связанную с аутентификацией.
Создание модуля класса;
NTComputerManagement;
Теперь вы можете продолжить создание начатого в главе 3, “Методы перечисления 1 контейнера и программное управление политикой учетных записей домена”, прило- j жения COM-сервера NTAdmin. DLL.i
Упражнение 6.1. Создание NTAdmin.dll: функции управления компьютером \ | и службами
Откройте проект Visual Basic ActiveX DLL NTAdmin, который вы начали создавать во время чтения главы 3. Этот проект можно найти по адресу: http://www.williamspublishing.com.
Добавьте к проекту новый модуль класса. Если вы начали новый проект, то не забудьте установить ссылку на библиотеку Active DS Type Library, используя диалоговое окно References, доступ к которому осуществляется с помощью команды Projects References.
Переименуйте новый модуль в NTComputerManagement. Введите приведенный код в раздел общих объявлений модуля класса.
Public Function QueryComputerProperty(ByVai TargetDomain As _,;
String, ByVai Targetcomputer As String, ByVai PropertyToQuery _ As String) As String
On Error Resume Next
Dim Computer As lADsComputer
Set Computer = GetObject("WinNT://" s TargetDomain s "/" _
s Targetcomputer ", computer")
Select Case UCase(PropertyToQuery)
Case "DIVISION"
QuerycomputerProperty = Computer.Division
Case "OPERATINGSYSTEM"
QueryComputerProperty = Computer.OperatingSystem
Case "OPERATINGSYSTEMVERSION"
QueryComputerProperty = Computer.OperatingSystemVersion
Case "OWNER"
QueryComputerProperty = Computer.Owner
Case "PROCESSOR"
QueryComputerProperty = Computer.Processor
Case "PROCESSORCOUNT"'
QueryComputerProperty = Computer.Processorcount End Select
End Function
Public Function QueryServiceProperty(ByVai TargetDomain As _
String, ByVai Targetcomputer As String, ByVai Targetservice As
String, ByVai PropertyToQuery As String) As String
On Error Resume Next
Dim Computer As lADscomputer
Dim Service As lADsService
Set Computer = GetObject("WinNT://" 4 TargetDomain & "/" _
& Targetcomputer ", computer")
Set Service = Computer.GetObject("service", TargetService)
Select Case UCase(PropertyToQuery)
Case "STARTTYPE"
Dim StartType As String
Select Case Service.StartType
Case 0
StartType = "Boot_Start"
StartType = "System_Start"
StartType = "Automatic"
StartType = "Manual"
StartType = "Disabled"■
End Select
QueryServiceProperty = StartType
Case "DISPLAYNAME"
QueryServiceProperty = Service.DisplayName
Case "HOSTCOMPUTER"
QueryServiceProperty = Service.Hostcomputer
Case "PATH"
QueryServiceProperty = Service.Path
case "SERVICEACCOUNTNAME"
QueryServiceProperty = Service.ServiceAccountName End Select
End Function
Public Function QueryServiceDependencies(ByVai TargetDomain As
String, ByVai Targetcomputer As String, ByVai Targetservice As
String) As Variant*
On Error Resume Next
Dim Computer As lADscomputer
Dim Service As lADsService
Dim NewElementO As Variant
Dim i As Long
Set Computer = GetObject("WinNT://" & TargetDomain & "/" _
Targetcomputer ", computer")
Set Service = Computer.GetObject("service", Targetservice)
If IsArray(Service.Dependencies) = True Then
Dim Entry As Variant
For Each Entry In Service.Dependencies
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = Entry
Next
QueryServiceDependencies = NewElement
Else
QueryServiceDependencies = Array(Service.Dependencies) End If
End Function
Public Function SetServiceProperty(ByVai TargetDomain As String, _ ByVai Targetcomputer As String, ByVai Targetservice As String, _ ByVai PropertyToSet As String, ByVai NewValue As Variant) As Boolean
Dim Computer As lADsComputer
Dim Service As lADsService
Set Computer = GetObject("WinNT://" & TargetDomain & "/" _
Targetcomputer ", computer")
Set Service = Computer.GetObject("service", Targetservice)
Select Case UCase(PropertyToSet)
Case "STARTTYPE"
Service.StartType = NewValue
Service.SetInfо
Case "DISPLAYNAME"
Service.DisplayName = NewValue
Service.SetInfо
Case "PATH"
Service.Path = NewValue
Service.SetInfо
Case "SERVICEACCOUNTNAME"
Service.ServiceAccountName = NewValue
Service.Setinfo
End Select
If Err.Number = 0 Then
SetServiceProperty = True
Else
SetServiceProperty = False
End If
End Function
Public Function AddServiceDependency(ByVai TargetDomain As String, _ ByVai Targetcomputer As String, ByVai Targetservice As String, _
ByVai NewDependency As String) As Boolean
On Error Resume Next
Dim Computer As lADsComputer
Dim Service As lADsService
Dim NewElement() As Variant
Dim i As Long
Dim EmptyArray As Integer
Dim DependencyAlreadyExists As Integer
Set Computer = GetObject("WinNT://" & TargetDomain & "/" _
.Targetcomputer ", computer")
Set Service = Computer.GetObject("service", Targetservice)
If IsArray(Service.Dependencies) = True Then
Dim Entry As Variant
For Each Entry In Service.Dependencies
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = Entry
If Entry = "" Then EmptyArray = 1
If Entry = NewDependency Then DependencyAlreadyExists = 1 Next
If EmptyArray = 1 Then
Debug.Print "empty"
Service.Dependencies = Array(NewDependency) Service.SetInfо
Else
If DependencyAlreadyExists о 1 Then i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = NewDependency Service.Dependencies = NewElement Service.Setinfo
End If
End If
Else
If Service.Dependencies <> NewDependency Then
Service.Dependencies = Array(Service.Dependencies, _ NewDependency)
Service.Setinfo
End If'
End If
Debug.Print Err.Number S " " S Err.Description
If Err.Number = 0 Or Err.Number = 9 Or Err.Number = 92 Then AddServiceDependency = True 1
Else
AddServiceDependency = False
End If
End Function
Public Function RemoveServiceDependency(ByVai TargetDomain As _ String, ByVai Targetcomputer As String, ByVai Targetservice As String, ByVai DependencyToRemove As String) As Boolean
On Error Resume Next
Dim Computer As lADsComputer
Dim Service As lADsService
Dim NewElement() As Variant■
Dim i As Long
Dim EntryCounter As Integer
Set Computer = GetObject("WinNT://" & TargetDomain & "/" _ & Targetcomputer ”, computer")
Set Service = Computer.GetObject("service", Targetservice) If IsArray(Service.Dependencies) = True Then
Dim Entry As Variant
For Each Entry In Service.Dependencies If Entry <> DependencyToRemove Then
EntryCounter = EntryCounter + 1'
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i).
NewElement(i) = Entry
End If
Next
Select Case EntryCounter
Case 0
Service ..Dependencies = Array ("")
Case 1
Service.Dependencies = Entry
Case EntryCounter > 1
Service.Dependencies = NewElement End Select
Service.Setinfo Else
If Service.Dependencies = DependencyToRemove Then Service.Dependencies = Array("") Service.Setlnfо
End If
End If
If Err.Number = 0 Or Err.Number = 9 Then RemoveServiceDependency = True Else
RemoveServiceDependency = False End If End Function
Public Function EnumerateServices(ByVai TargetDomain As String, ByVai Targetcomputer As String, ByVai WithStatus As Boolean) _ As Variant On Error Resume Next Dim Computer As lADsComputer Dim Service As lADsService Dim Servicestatus As String Dim NewElement() As Variant Dim i As Long
Set Computer - GetObject("WinNT://" & TargetDomain 6 "/" _ 6 Targetcomputer ", computer") Computer.Filter = Array("service") For Each Service In Computer i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) If WithStatus = True Then Select Case Service.Status Case 1
Servicestatus = "Stopped" Case 2
Servicestatus = "Start Pending" Case 3
Servicestatus = "Stop Pending" Case 4
Servicestatus = "Running" Case 5
Servicestatus = "Continue Pending" Case 6
Servicestatus = "Pause Pending" Case 7 Servicestatus = "Paused" Case 8 Servicestatus = "Error" End Select NewElement(i) = Service.Name 6 vbTab s Servicestatus Else NewElement(i) = Service.Name End If Next EnumerateServices = NewElement End Function
Public Function Serviceoperations(ByVai TargetDomain As String, ByVai Targetcomputer As String, ByVai Targetservice As String, ByVai Serviceoperation As String) As Boolean
Dim Computer As lADsComputer
Dim Service As lADsServiceOperations
Set Computer = GetObject("WinNT://" 6 TargetDomain 6 "/" _ s Targetcomputer ", computer") Set Service = Computer.GetObject("service", Targetservice) Select Case UCase(Serviceoperation) Case "START" If Service.Status = 1 Then Service.Start End If Case "STOP"'
If Service.Status = 4 Then Service.Stop End If Case "CONTINUE" If Service.Status = 7 Then Service.Continue•
End If ' Case "PAUSE" If Service.Status = 4 Then Service.Pause End If End Select If Err.Number = 0 Then Serviceoperations = True Else
Serviceoperations = False End If End Function
Public Function SetServiceAccountPassword(ByVai TargetDomain As String, ByVai Targetcomputer As String, ByVai Targetservice As , String, NewPassword As String) As Boolean Dim Computer As lADsComputer Dim Service As lADsServiceOperations Set Computer = GetObject("WinNT://" S TargetDomain S "/" _ & Targetcomputer ", computer") Set Service = Computer.GetObject("service", TargetService) Call Service.SetPassword(NewPassword) If Err.Number = 0 Then SetServiceAccountPassword = True Else SetServiceAccountPassword = False End If End Function
Скомпилируйте код в виде NTAdmin. DLL.
Сохраните и закройте проект NTAdmin.
Совет
Код проекта, а также скомпилированную его версию можно найти по адресу: http://www.williamspublishing.com.
Использование функций модуля NTComputerManagement
После создания модуля класса NTComputerManagement можно использовать его функции практически из любого языка программирования, который поддерживает автоматизацию OLE, например Visual Basic, VBScript или JavaScript.
Совет
Создание экземпляра объекта и необходимый синтаксис приведены в главе 3. Не за будьте изменить имя класса на NTComputerManagement, где это необходимо.
В табл. 6.3 приведен синтаксис каждого метода интерфейса NTComputerManagement.
Таблица 6.3. Синтаксис методов интерфейса NTComputerManagement
Действие
Синтаксис
Просмотр подразделения
QueryComputerProperty("Domain_Name", "Computer_Name", "Division")
Просмотр организации
QueryComputerProperty("Domain_Name", "Computer_Name", "Owner")
Просмотр названия операционной системы
Просмотр версии операционной системы
QueryComputerProperty("Domain_Name", "Computer_Name", "OperatingSystem")
QueryComputerProperty("Domain_Name", "Computer_Name", "OperatingSystemVersion")
Просмотр типа процессора
QueryComputerProperty("Domain_Name", "Computer_Name", "Processor")
Просмотр установленного HAL
QueryComputerProperty("Domain_Name", "Computer_Name", "Processorcount")
Перечисление установленных служб
For Each Item In EnumerateServices("Domain_Name", "Computer_Name", False)
Debug.Print Item
Next
Просмотр типа запуска службы
Просмотр отображаемого имени службы
Просмотр имени компьютера службы
Просмотр пути к исполняемому файлу службы
Просмотр имени учетной записи службы
QueryServiceProperty("Domain_Name", "Computer_Name", "Service_Name", "StartType")
QueryServiceProperty("Domain_Name", "Computer_Name", "Service_Name", "DisplayName")
QueryServiceProperty("Domain_Name", "Computer_Name", "Service_Name", "Hostcomputer")
QueryServiceProperty("Domain_Name", "Computer_Name", "Service_Name", "Path")
QueryServiceProperty("Domain_Name", "Computer_Name", "Service_Name", "ServiceAccountName")
Просмотр зависимостей службы
For Each Item In QueryServiceDependen- cies("Domain_Name", "Computer_Name", "Service_Name")
Debug.Print Item
Next
Установка типа запуска службы
SetServiceProperty("Domain_Name", "Computer_Name", "Service_Name", "StartType", 2)
Допустимые значения: 0 — Boot_Start,
1 — System_Start, 2 — Automatic_Start,
3 — Manual_Start, 4 — Disabled
Установка отображаемого имени службы
SetServiceProperty("Domain_Name", "Computer_Name", "Service_Name", "DisplayName", "New_Display_Name")
Окончание табл. 6.3
Действие
Синтаксис.
Установка пути к исполняемому файлу службы
Установка имени учетной записи службы
SetServiceProperty("Domain_Name", "Computer_Name", "Service_Name", "Path", "New_Path")
SetServiceProperty("Dornain_Name", "Computer_Name", "Service_Name", "S erviceAccountName", "Service_Account_Name")
Добавление зависимостей службы
Удаление зависимостей службы
AddServiceDependency("Domain_Name", "Computer_Name", "Service_Name", "New_Dependency")
RemoveServiceDependency("Domain_Name", "Computer_Name", "Service_Name", "Dependency_To_Remove")
Перечисление служб
For Each. Item In EnumerateServices("Domain_Name", "Computer_Name", False)
Debug.Print Item'
Next
Перечисление служб с их состоянием
For Each Item In EnumerateServices("Domain_Name", "Computer_Name", True)
Debug.Print Item
Next
Запуск остановленной службы
Serviceoperations("Domain_Name", "Computer_Name", "Service_Name", "Start")
Остановка запущенной службы
Приостановка запущенной службы
Продолжение выполнения приостановленной службы Изменение пароля службы
Serviceoperations("Domain_Name", "Computer_Name", "Service_Name", "Stop")
Serviceoperations("Domain_Name", "Computer_Name", "Service_Name", "pause")
Serviceoperations("Domain_Name", "Computer_Name", "Service_Name", "Continue")
SetServiceAccountPassword("Domain_Name", "Computer_Name", "Service_Name", "New_Password")
Резюме
С помощью интерфейсов lADsComputer, TADsService И TADsServiceOperator администратор может создавать специальные запросы значений важных свойств на выбранном компьютере, а также манипулировать службами на любом компьютере или в группе компьютеров сети компании.
Интерфейс lADsComputer обеспечивает необходимой информацией о компьютере в ресурсе домена, включая тип установленной операционной системы и текущий HAL. Кроме того, эти функции можно встроить в приложение для ограничения типов систем, на которых его можно запускать. Например, приложение может запускаться только на двухпроцессорных компьютерах под управлением операционной системы Windows NT 4.0 и выше.
Интерфейс TADsService предназначен для модификации параметров службы, установленных по умолчанию, таких как путь к исполняемому файлу, просмотр зависимостей службы и даже изменение отображаемого имени службы.
С Помощью интерфейса lADsServiceOperator можно создать приложение, которое позволяет синхронизировать пароль в базе SAM и пароль, используемый для за-
пуска службы. При разработке Web-приложений администрирования могут оказатьс полезными возможности запуска службы на любом компьютере в сети компании.
В этой главе, как и в остальных главах части II, “Исследование провайдеро ADS1: Windows NT”, приведены фрагменты кода, которые после небольшой модер низании помещаются в соответствующий модуль класса ActiveX DLL (COM сервера) NTAdmin. DLL, создание которого рассматривается, начиная с главы 3 “Методы перечисления контейнера и программное управление политикой учетны) записей домена”. Функции этого модуля можно использовать с помощью практически любого языка программирования, который поддерживает автоматизацию OLE например Visual Basic, VBScript или JavaScript.
Добавив этот модуль к своему арсеналу инструментов администрирования, вы намного быстрее сможете выполнять монотонные административные функции.
Программное управление ' файловыми ресурсами и ресурсами печати
Кроме управления пользователями, группами, свойствами уровня, доменами, системными службами, с помощью ADSI можно манипулировать файловыми ресурсами и ресурсами печати на всех компьютерах в сети компании.
Интерфейсы ADSI TADsFileService, TADsFileServiceOperations И lADsFileShare позволяют перечислять совместно используемые ресурсы и управлять ими на выбранном компьютере, а комбинируя эти интерфейсы с lADsContainer, можно создавать новые совместно используемые файловые ресурсы.
После создания новых ресурсов можно просматривать и управлять сессиями, которые ассоциированы с каждым открытым ресурсом. Загружая в коллекцию (интерфейс lADsCollection) содержимое динамического интерфейса lADsSession, можно программно просматривать и удалять пользовательские сессии, подключенные к каждому совместно используемому файловому ресурсу.
Интерфейсы ADSI TADsPrintQueue И lADsPrintQueueOperations позволяют перечислять задания существующей очереди печати и управлять ею. Для просмотра заданий печати очереди и управления ими можно использовать интерфейсы iad- sPrintJob И IADsPrintJobOperations.
С помощью описанных интерфейсов и приведенного в этой главе кода можно создавать приложения для управления:
файловыми ресурсами;
файловыми сессиями;
открытыми ресурсами;
ресурсами печати.
В конце главы продолжается описание создания приложения СОМ-сервера NT Admin.DLL.
Управление файловыми ресурсами
С помощью интерфейсов TADsFileService, TADsFileServiceOperations, lADsFileShare, lADsSession И lADsContainer можно программно создавать и удалять совместно используемые файловые ресурсы. Эти интерфейсы также можно применять для просмотра открытых сессий и ресурсов.
Независимо от того, создаете ли вы Web-интерфейс для управления файловыми ресурсами, сессиями и прочим или совместно используемый ресурс, который является частью большой программы автоматизации документооборота, ADSI предоставляет простые методы выполнения задач управления ресурсами.
Связывание контейнера LanmanServer с помощью Visual Basic
Для перечисления совместно используемых ресурсов компьютера в первую очередь необходимо связать контейнер LanmanServer с конкретным компьютером. Это выполняется с помошью следующего кода:
Dim FileService As TADsFileService
Dim ComputerName As String
Dim ComputerDomain As String
ComputerDomain = " Targe t_Computer_Doma in"
ComputerName = " Target_Computer_Name"
Set FileService = GetObject("WinNT://" & ComputerDomain & "/" _
& ComputerName & "/LanmanServer,fileservice")
Перечисление совместно используемых ресурсов системы с помощью Visual Basic
Команда меню Stop Sharing программы Windows File Manager (файл winfile.exe) позволяет просмотреть все совместно используемые ресурсы на локальном компьютере (рис. 7.1). Кроме этого, для просмотра нескрытых совместно используемых ресурсов локального или удаленного компьютера применяется средство Network Neighborhood.
Рис. 7.7. Диалоговое окно Stop Sharing Directory
Чтобы просмотреть эту информацию программным способом, можно воспользоваться ADS1 для связи контейнера LanmanServer и последующего применения цикла For.. .Each. Итак, для перечисления всех неадминистративных совместно используемых ресурсов на любом компьютере воспользуйтесь кодом
Dim FileService As TADsFileService •
Dim FileShare As TADsFileShare
Dim ComputerName As String
Dim ComputerDomain As String
ComputerDomain = "Target_Computer_Domain”
ComputerName = " Target_Computer_Name"
Set FileService = GetObject("WinNT://" & ComputerDomain & "/” _
& ComputerName & "/LanmanServer")'
For Each FileShare In FileService
•' Debug.Print FileShare.Name Next
Примечание
После запуска этого кода все созданные пользователем скрытые совместно используемые ресурсы (к их имени добавлен символ $7 отображаются, а системные скрытые совместно используемые ресурсы ДРС$, ADMINS, С$ и т.д.) — нет. Несмотря на то что зти ресурсы не отображаются в списке, ими можно манипулировать как обычными совместно используемыми ресурсами.
Связывание определенного файлового совместно используемого ресурса с помощью Visual Basic
Если необходимо связать определенную службу компьютера, вначале следует связать контейнер LanmanServer, а затем имя одного из множества объектов этого контейнера. Для этого используйте следующий код:
Dim FileShare As lADsFileShare
Dim ComputerName As String
Dim ComputerDomain As String .
Dim ShareName As String
ComputerDomain = " Target_Computer_Domain"
ComputerName = " Targe t_Computer_Na me"
ShareName = " Targe t_Share_Name"
Set FileShare = GetObject("WinNT://" & ComputerDomain & "/" _■
4 ComputerName & "/LanmanServer/" & ShareName & ", fileshare")
Просмотр числа пользователей, использующих общий ресурс, с помощью Visual Basic■
При щелчке на кнопке Shares в диалоговом окне свойств компьютера в окне Server Manager появится информация о числе пользователей, использующих общий ресурс компьютера. Для программного просмотра этого числа можно воспользоваться свойством CurrentUserCount интерфейса LADsFileShare. Это значение используется как в статистических отчетах загрузки файлового сервера, так и для удовлетворения праздного любопытства системного администратора.
Для просмотра числа пользователей, работающих в настоящее время с определенным совместно используемым ресурсом, используйте следующий код: '
Dim FileShare As lADsFileShare
Dim ComputerName As String
Dim ComputerDomain As String
Dim ShareName As String
ComputerDomain = " Target_Computer_Domain”
ComputerName = " Ta rget_Computer_Name"
ShareName = " Target_Share_Name"
Set FileShare = GetObject("WinNT://" & ComputerDomain & "/" _
4 ComputerName & "/LanmanServer/" & ShareName)
Dim RetVal As String■
RetVal = FileShare.CurrentUserCount
Debug.Print RetVal
Примечание
Свойство cur rentuser Count предназначено только для чтения; система при подключении к ресурсу нового пользователя самостоятельно изменяет значение этого свойства.
Просмотр описания совместно используемого ресурса с помощью Visual Basic
При установке переключателя Share As во вкладке Sharing диалогового окна свойств ресурса (рис. 7.2) можно просмотреть этот совместно используемый ресурс или ввести комментарии к нему.
Рис. 7.2. В поле Comments можно ввести комментарии совместно используемого ресурса
Комментарием совместно используемого ресурса можно программно управлять с помощью свойства Description интерфейса TADsFileShare. Для просмотра комментария совместно используемого ресурса воспользуйтесь кодом
Dim FileShare As TADsFileShare
Dim ComputerName As String .
Dim ComputerDomain As String
Dim ShareName As String
Dim RetVal As String
ComputerDomain = " Targe t_Computer_Doma in”
ComputerName = " Target_Computer_Name"
ShareName = " Targe t_Share_Name”
Set FileShare = GetObject("WinNT://" & ComputerDomain & "/"
& ComputerName & "/LanmanServer/" & ShareName)
RetVal = FileShare.Description
Debug.Print RetVal
Совет
Комментарии могут содержать довольно полезную информацию. Пример ее использования приведен в главе 4, “Программное управление учетной записью пользователя ”.
Установка нового описания совместно используемого ресурса с помощью Visual Basic
Для программного ввода нового комментария совместно используемого ресурса используйте следующий код:
Dim FileShare As IADsFileShare1
Dim ComputerName As String
Dim ComputerDomain As String
Dim ShareName As String
Dim NewFileShareDescription As String
ComputerDomain - " Target_Computer_Domain''
ComputerName = " Targe t_ Сотри ter_Name"
ShareName - " Target_Share_Name"
NewFileShareDescription = " New_File_Share_Description'*
Set FileShare = GetObject("WinNT://" & ComputerDomain & "/” _■
ComputerName & "/LanmanServer/" & ShareName)
FileShare.Descript ion = NewFileShareDescription
FileShare.Set Info
Просмотр с помощью Visual Basic имени компьютера, на котором расположен совместно используемый ресурс
Иногда перед манипулированием совместно используемым ресурсом необходимо проверить его наличие на выбранном компьютере. Для выполнения этих действий с помощью ADSI воспользуйтесь кодом
Dim FileShare As lADsFileShare
Dim ComputerName As String
Dim ComputerDomain As String
Dim ShareName As String
ComputerDomain = " Target_Computer_Domain"
ComputerName = " Target_Computer_Name"
ShareName = " Target_Share_Name"
Set FileShare = GetObject("WinNT://" & ComputerDomain & "/" _
ComputerName 4 "/LanmanServer/" 4 ShareName)
Debug.Print FileShare.Hostcomputer
Примечание
После запуска этого фрагмента кода возвращается значение свойства ADsPa th узла, которое нельзя изменять.
Просмотр с помощью Visual Basic максимального числа пользователей, подключенных к совместно используемому ресурсу
Как видно из рис. 7.2, Windows NT позволяет ограничивать число пользователей, подключенных к совместно используемому ресурсу.
- По умолчанию ADSI создает совместно используемый ресурс без ограничения числа подключаемых пользователей, но в некоторых случаях его необходимо изменять. Для просмотра возможного числа подключенных пользователей выясните значение свойства MaxUserCount с помощью следующего кода:
Dim FileShare As lADsFileShare;'
Dim ComputerName As String
Dim ComputerDomain As String
Dim ShareName As String
ComputerDomain = "Target_Computer_Domain"
ComputerName = "Target_Computer_Name"
ShareName = " Target_Share_Name"
Set FileShare = GetObject("WinNT://" S ComputerDomain S "/"
S ComputerName & "/LanmanServer/" S ShareName)
Debug.Print FileShare.MaxUserCount
Совет
Если возвращается значение -1, то к совместно используемому ресурсу может подключаться неограниченное число пользователей.
Установка с помощью Visual Basic нового максимального числа пользователей, подключенных к совместно используемому ресурсу
Для программного изменения числа пользователей, подключенных к совместно используемому ресурсу, воспользуйтесь кодом
Dim FileShare As ZADsFileShare
Dim ComputerName As String Dim ComputerDomain As String’
Dim ShareName As String
Dim NewFileShareMaximumUsers As Integer
ComputerDomain = "Target_Computer_Doinain"
ComputerName = " Target_Computer_Naine"
ShareName = " Targe t_Share_Name”
NewFileShareMaximumUsers = Maximum_Users_Value
Set FileShare = GetObject("WinNT://" s ComputerDomain s "/" _
S ComputerName S "/LanmanServer/" S ShareName) FileShare.MaxUserCount = NewFileShareMaximumUsers FileShare.SetInfо
Просмотр пути расположения совместно используемого ресурса с помощью Visual Basic
Средство Server Manager позволяет просмотреть физическое расположение совместно используемого ресурса (рис. 7.3).
Для программного определения расположения совместно используемого ресурса необходимо просмотреть значение свойства path с помощью следующего кода:
Dim FileShare As lADsFileShare
Dim ComputerName As String
Dim ComputerDomain As String*
Dim ShareName As String
ComputerDomain = ’’Target_Computer_Domain’’
ComputerName = "Target_Conputer_Name"
ShareName = " Target_Share_Name"■
Set FileShare = GetObject("WinNT://" & ComputerDomain s "/" s ComputerName & "/LanmanServer/" s ShareName)
Debug.Print FileShare.Path
Рис. 7.3. Просмотр пути расположения совместно используемых ресурсов выбранного компьютера в диалоговом окне Shared Resources
Программное создание совместно используемого ресурса с помощью Visual Basic
Для создания нового совместно используемого ресурса вызовите метод Create интерфейса TADsContainer. Этот метод генерирует новую запись в контейнере LanmanServer. Перед вызовом метода Setinfo интерфейса iads необходимо установить значение свойства Path интерфейса lADsFileShare, равное пути к местоположению создаваемого совместно используемого файлового ресурса. Это единственное условие, которое необходимо выполнять при создании нового ресурса; кроме этого можно ввести его описание.
Для создания нового совместно используемого ресурса и заполнения поля описания выполните следующий код:
Dim Container As TADsContainer
Dim FileShare As LADsFileShare
Dim ComputerName As String
Dim ComputerDomain As String
Dim'ShareName As String
Dim NewFileSharePath As String
Dim NewFileShareDescription As String
ComputerDomain = " Target_Computer_Domain"
ComputerName = " Target_Computer_Name"
ShareName = ” Target_Share_Name"
NewFileSharePath = " Path_To_Share".
NewFileShareDescription = ’’ File_Share_Comment"
Set Container = GetObject("WinNT://" s ComputerDomain s "/" _
6 ComputerName S "/LanmanServer")■
Set FileShare = Container.Create("fileshare", ShareName)
FileShare.Path = NewFileSharePath
FileShare .-Description = NewFileShareDescription
FileShare.MaxUserCount = -1
FileShare.Setinfo
Удаление совместно используемого ресурса с помощью Visual Basic
Если вы решили удалить совместно используемый ресурс, необходимо связать контейнер LanmanServer и удалить объект, представляющий этот “ненужный” ресурс.
Для программного удаления совместно используемого ресурса на выбранном компьютере используйте метод Delete интерфейса lADsContainer с помощью кода
Dim Container As lADsContainer■
Dim ComputerName As String
Dim ComputerDomain As String
Dim ShareName As String
Dim RetVal As Integer
ComputerDomain = "Target_Computer_Domain"•
ComputerName = " Target_Conputer_Name”
ShareName = " Targe t_Share_Name"
Set Container = GetObject("WinNT://" & ComputerDomain & "/"
& ComputerName & "/LanmanServer")
Call Container.Delete("fileshare", ShareName)
Управление файловыми сессиями
С помощью средства Server Manager можно просмотреть все сессии, ассоциированные с определенными ресурсами (рис. 7.4). То же самое можно сделать и программно, используя интерфейсы lADsFileServiceOperations и LADsSessions.
Рис. 7.4. В этом диалоговом окне отображаются все сессии
Мониторинг пользовательских сессий существенно расширяет возможности разрабатываемого приложения администрирования, например можно просматривать число подключенных пользователей для отслеживания условий лицензирования приложения.
Примечание
Всеми значениями свойств интерфейса TADsSession динамически управляет операционная система; пользователь только может их просматривать.
Перечисление пользовательских сессий с помощью Visual Basic
Следующий код Visual Basic позволяет перечислять все сессии на выбранном компьютере, имя компьютера, с которого зарегистрировался пользователь, а также
временные характеристики подключения — время использования ресурса и время простоя (в секундах).
Dim FileService As TADsFileServiceOperations'
Dim ComputerName As String
Dim ComputerDomain As String.
Dim Session As ZADsSession
ComputerDomain = " Target_Computer_Domain"’
ComputerName = " Target_Computer_Name”
Set FileService = GetObject("WinNT://" 4 ComputerDomain 4 "/" _
4 ComputerName 4 "/LanmanServer")
For Each Session In FileService.Sessions
Debug.Print "Сессия:" & Session.Name 4 " установлено _
пользователем: _ " 4 Session.User 4 " с компьютера: " _
4 Session.Computer 4 " время соединения: " _
4 Session.ConnectTime 4 " время простоя: " 4 Session.IdleTime Next
В приведенном фрагменте кода используются следующие свойства интерфейса TADsSessionN
User — имя пользователя, установившего соединение;
Computer — имя компьютера, с которого установлено соединение;
ConnectTime — количество секунд, прошедших с момента установки соединения;
IdleTime — количество секунд с момента последнего действия с соединением;
Name — свойство, необходимое для связывания с отдельной сессией.
Управление отдельными сессиями с помощью Visual Basic
В отличие от большинства интерфейсов в ADSI, интерфейс lADsSession создается динамически. Чтобы обойти это ограничение, необходимо использовать интерфейс lADsCollection для добавления и удаления объектов из коллекции, что позволяет управлять пользовательскими сессиями.
Кроме того, возможность просмотра отдельной пользовательской сессии может существенно увеличить эффективность разрабатываемого приложения администрирования по сравнению с методами перечисления файловых серверов сети, которые, скорее всего, имеют сотни (если не тысячи) открытых сессий.
Для связывания определенной пользовательской сессии используйте следующий код:
Dim FileService As lADsFileServiceOperations
Dim .ComputerName As String
Dim ComputerDomain As String
Dim Session As lADsSession
Dim Collection As lADsCollection
Dim UserSessionName As String•
Dim UserSession As lADsSession
ComputerDomain = " Target_Computer_Domain"
ComputerName = " Target_Computer_Name” .
UserSessionName = " Target_Session”
Set FileService = GetObject("WinNT://" 4 ComputerDomain 4 "/" _
4 ComputerName 4 "/LanmanServer")
Set Collection = FileService.Sessions
Set UserSession = Collection.GetObject(UserSessionName)
Отключение отдельной пользовательской сессии с помощью Visual Basic
Иногда вам, как администратору системы, необходимо отключить пользователя от используемого им ресурса. Это выполняется или с помощью графических инструментов (средство Server Manager), или программно:
Dim FileService As ZADsFileServiceOperations
Dim ComputerName As String
Dim ComputerDomain As String
Dim Session As TADsSession
Dim Collection As lADsCollection
Dim UserSessionName As String
ComputerDomain = "Target_Computer_Domain"
ComputerName = " Targe t_ Сотри ter_Name"
UserSessionName = " Targe t_Session”
Set FileService = GetObject("WinNT://" & ComputerDomain S "/"
S ComputerName S "/LanmanServer")
Set Collection = FileService.Sessions
Collection.Remove (UserSessionName)
Совет
Windows NT/2000 достаточно прозрачно восстанавливает пользовательскую сессию при повторном запросе клиентом ребурса. Приведенный код лучше всего использовать непосредственно перед выполнением операций, требующих отключения пользователей, например резервного копирования или обновления файлов, используемых в настоящее время.
Отключение всех пользовательских сессий с помощью Visual Basic
Для этого опять-таки можно воспользоваться средством Server Manager. Программный способ состоит в создании коллекции, а затем в удалении всех ее элементов.
Отключение всех пользовательских сессий можно выполнить с помощью следующего кода:
Dim FileService As ZADsFileServiceOperations
Dim ComputerName As String
Dim ComputerDomain As String"
Dim Session As TADsSession
Dim Collection As lADsCollection
ComputerDomain = " Targe t_Computer_Domain"
ComputerName = " Target_Computer_Name”
Set FileService = GetObject("WinNT://" & ComputerDomain & "/" _
& ComputerName & "/LanmanServer")
Set Collection = FileService.Sessions
For Each Session In Collection
Collection.Remove (Session.Name)
Next
Управление открытыми ресурсами
В каждой пользовательской сессии существуют ресурсы, ассоциированные с соединением. Если используется Microsoft Access, ассоциированный MDB-файл описывает открытый ресурс в окне Server Manager. Применяя ADSI, можно перечислить все
текущие используемые файлы, а затем просмотреть пользователя и информацию о числе блокировок для каждого открытого ресурса.
Возможность отключения пользователя от ресурса играет существенную роль при выполнении некоторых административных задач, связанных с миграцией данных. При отсутствии доступа к файлу (блокирован пользователем) единственный способ выполнить с ним необходимые административные действия — отключить пользователя.
Примечание
К сожалению, описанная возможность отключения не реализована в ADSI 2.5.
Перечисление открытых ресурсов с помощью Visual Basic
Для просмотра всех открытых ресурсов можно воспользоваться графическими средствами операционной системы (рис. 7.5). А для программного выполнения аналогичной задачи необходимо использовать цикл For.. .Next для перечисления содержимого коллекции ZADsResource.
Рис. 7.5. Диалоговое окно Open ResourcesРис. 7.5. Диалоговое окно Open Resources
Рис. 7.5. Диалоговое окно Open Resources
Рис. 7.5. Диалоговое окно Open Resources
Чтобы перечислить все открытые ресурсы на выбранном компьютере, используйте следующий код:
Dim FileService As ZADsFileServiceOperations
Dim ComputerName As String
Dim ComputerDomain As String
Dim Resource As ZADsResource
Comput er Domain = " Target_Computer_Domain"
ComputerName = "Target_Computer_Name"
Set FileService = GetObject("WinNT://" & ComputerDomain S "/" _
S ComputerName & "/LanmanServer")
For Each Resource In FileService.Resources
Debug.Print "Идентификатор ресурса: " S Resource.Name & " _
Ресурс: " & Resource.Path " Открыт: " & Resource.User _ s " Число блокировок: " & Resource.LockCount
Next
Примечание
свойства интерфейсасвойства интерфейсаВ строке Debug. Print приведены не все существующие
свойства интерфейса
свойства интерфейса
LADsResource.
Рассмотрим более подробно приведенные свойства интерфейса ZADsResource:
Name — генерируемое системой значение, присвоенное ресурсу и используемое для его идентификации в коллекции;
Path — физическое расположение открытого ресурса;
user — имя пользователя, открывшего ресурс;
Lockcount — число блокировок ресурса.
Тестирование свойств одного открытого ресурса с помощью Visual Basic
Windows NT автоматически присваивает свойство Name открытым ресурсам компьютера. Для фильтрации данных, соответствующих определенному пользователю и ресурсу, скомбинируйте условие с перечислением (как показано в предыдущем разделе).
- Для просмотра всех открытых определенным пользователем ресурсов воспользуйтесь кодом
Dim FileService As lADsFileServiceOperations
Dim ComputerName As String
Dim ComputerDomain As String
Dim ResourceUser As String Dim ResourcePath As String Dim Resource As lADsResource.■
Dim Collection As lADsCollection
ComputerDomain = " Та где t_Computer_Doma in"
ComputerName = "Target_Computer_Name"
ResourceUser = " Target_Username”
Set FileService = GetObject("WinNT://" & ComputerDomain S "/" _
& ComputerName & "/LanmanServer")
Set Collection = FileService.Resources
Debug.Print "Пользователь " s ResourceUser & " _ использует следующие открытые ресурсы:" For Each Resource In Collection
If Resource.User = ResourceUser Then Debug.Print Resource.Path
End If
Next
Совет
Изменяя операторы условия и содержимое переменной ResourceUser, можно просмотреть список всех пользователей, в настоящее время ассоциированных с открытым ресурсом, или даже отобразить все файлы, которые в настоящее время ими блокированы.
Управление ресурсами печати
Несмотря на попытки создать безбумажный офис, все равно иногда (а в некоторых случаях всегда) необходимо иметь под рукой твердую копию документа, т.е. иметь доступ к принтеру. Для компьютера принтер — это всего лишь огромный набор служебных команд. Интерфейс ADSI обладает функциями управления очередью печати и заданиями печати, ассоциированными с сетевым принтером.
Перечисление очередей печати с помощью Visual Basic
В большинстве хорошо структурированных сетей компаний один или несколько серверов являются серверами печати. Для просмотра всех очередей печати на всех компьютерах в домене можно воспользоваться комбинацией перечисления очереди печати и функций контейнера для учетных записей компьютеров.
Примечание
Обратите внимание, что процесс перечисления в больших доменах может выполняться довольно продолжительное время.
■ Если известно сетевое имя сервера печати, используйте следующий код Visual Basic для поиска всех очередей печати на этом компьютере:
Dim ComputerName As String
Dim ComputerDomain As String
Dim Container As ZADsContainer
Dim PrintQueue As ZADsPrintQueue
ComputerDomain = " Target_Computer_Domain'’
ComputerName = " Target_Computer_Name"
Set Container = GetObject("WinNT://" & ComputerDomain S "/" _ S ComputerName)
Container.Filter = Array("PrintQueue")
For Each PrintQueue In Container
Debug.Print PrintQueue.Name
Next.
Связывание определенной очереди печати с помощью Visual Basic
Можно перечислить все компьютеры, а затем использовать условие для определения необходимой очереди на основе ее точного имени. Но лучше всего использовать простое связывание непосредственно с объектом очереди. Для этого используйте следующий код:'
Dim ComputerName As String'
Dim ComputerDomain As String
Dim PrintQueueName As String
Dim PrintQueue As ZADsPrintQueue
ComputerDomain = " Target_Computer_Domain"
ComputerName = " Target_Computer_Name”
PrintQueueName = ” Targe t_Print_Queue"
Set PrintQueue = GetObject("WinNT://" S ComputerDomain S "/" _ 6 ComputerName & "/" & PrintQueueName & ", printqueue")1
Просмотр свойств очереди печати с помощью Visual Basic
С помощью интерфейса ZADsPrintQueue можно просмотреть свойства существующей очереди печати (табл. 7.1).
Таблица 7.1. Свойства интерфейса TADsPrintQueue
Свойство
Описание
Возвращаемый тип данных
BannerPage
Применяется для получения (установки) пути к файлу, используемому для отдельного задания печати
String
Datatype
Определяет тип данных, которые могут быть выполнены очередью; обычно RA W
String
Default JobPriority Приоритет по умолчанию, назначенный новому за.Данию
Integer
Description
Текстовое поле для описания задания печати
String
Свойство
Описание
Возвращаемый тип данных
Location
Текстовое поле для описания физического расположения принтера
String
Model
Название драйвера принтера, используемого для этой очереди
String
Name
Программное имя принтера
String
PrintDevices
Определяет пути к другим принтерам в пуле принтера
Variant
PrinterPath
Определяет путь к принтеру
String
Printprocessor
Процессор печати, ассоциированный с этой очередью; обычно устанавливается winprint
String
Priority
Приоритет, ассоциированный с очередью печати. Администратор может создавать очередь печати с высоким приоритетом для небольших заданий печати и, наоборот, с низким приоритетом для очередей печати больших документов
Integer
StartTime
Устанавливает нижний предел точного времени для использования этой очередью
Date
UntilTime
Устанавливает верхний предел точного времени для использования этой очередью
Date
Каждое из описанных свойств (кроме PrintDevice) можно протестировать с помощью следующего фрагмента кода:
Dim ComputerName As String
Dim ComputerDomain As String•
Dim PrintQueueName As String
Dim PrintQueue As TADsPrintQueue
Dim RetVal As String
ComputerDpmain = " Target_Computer_Domain"
ComputerName = " Target_Computer_Name”
PrintQueueName = " Target_Print_Queue"
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" _
S ComputerName S "/" & PrintQueueName)
RetVal = PrintQueue.Model
Debug.Print RetVal
Внимание
При назначении типа данных возвращаемой переменной обращайте особое внимание на тип данных, возвращаемых каждым свойством, чтобы избежать ошибки несоответствия типа.
Для манипулирования свойством PrintDevice (которое возвращает массив строк значений типа variant) используйте следующий код Visual Basic:
Dim ComputerName As String
Dim ComputerDomain As String
Dim PrintQueueName As String
Dim PrintQueue As TADsPrintQueue
Dim Item As Variant
ComputerDomain = " Target_Computer_Domain”
ComputerName = " Target_Computer_Name"
PrintQueueName = " Target_Print_Queue"
Set PrintQueue = GetObject("WinNT://" S ComputerDomain S "/"
i ComputerName & "/" & PrintQueueName)
If IsArray(PrintQueue.PrintDevices) Then
For Each Item In PrintQueue.PrintDevices
Debug.Print Item
Next
Slse
Debug.Print PrintQueue.PrintDevices
2nd If
Программное управление очередью печати с помощью Visual Basic
Интерфейс lADsPrintQueueOperations позволяет администратору просматривать состояние очереди, приостанавливать и продолжать выполнение операций очереди, а также просматривать текущий список заданий печати в очереди. Используя свойства и методы этого интерфейса, можно создавать полнофункциональные приложения управления очередью печати, в том числе и с Web-интерфейсом.
Просмотр состояния очереди
С помощью интерфейса lADsPrintQueueOperations можно просматривать текущее состояние очереди печати; для этого используется возвращаемое методом Status значение.
Dim PrintQueue As lADsPrintQueueOperations
Dim ComputerName As String
Dim ComputerDomain As String
Dim PrintQueueName As String
Dim Retval As Long'
ComputerDomain = '" Target_Computer_Domain"
ComputerName = " Target_Computer_Name”
PrintQueueName = " Target_Print_Queue”
Set PrintQueue = GetObject("WinNT://" & ComputerDomain S "/" _
t, ComputerName & "/" S PrintQueueName) ,
RetVal = PrintQueue. Status
Debug.Print Retval
Чтобы упростить расшифровку возвращаемого методом Status значения, можно использовать список констант, приведенный в табл. 7.2)
Таблица 7.2. Константы состояния очереди печати
Константа
Значение
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
0x4'0000
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
Приостановка очереди печати
В некоторых случаях необходимо приостановить процесс печати, чтобы срочно распечатать какой-либо документ. Для программной приостановки очереди печати можно воспользоваться методом Pause интерфейса IADsPrintQueueOperations с помощью следующего кода Visual Basic:
Dim PrintQueue As LADsPrintQueueOperations
Dim ComputerName As String
Dim ComputerDomain As String
Dim PrintQueuёName As String
Dim RetVal As Long
ComputerDomain = " Target_Computer_Domain"
ComputerName = " Targe t_Computer_Name"
PrintQueueName = " Target_Print_Queue”
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" _
& ComputerName & "/" & PrintQueueName)
PrintQueue.Pause
Примечание
Чтобы эффект использования методов Pause и Resume проявился, необходимо время. Так что, если сразу же после их вызова просмотреть значение свойства status интерфейса TADsPrintQueueOperations, изменения не проявятся.
Возобновление очереди печати'
Для восстановления печати заданий из очереди печати после их приостановки ис- юльзуйте следующий код Visual Basic:
Dim PrintQueue As LADsPrintQueueOperations
Dim ComputerName As String
Dim ComputerDomain As String
Dim PrintQueueName As String
Dim RetVal As Long
DomputerDomain = " Target_Conputer_Domain"
ComputerName = " Target_Computer_Name"
PrintQueueName = " Target_Print_Queue”
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/"
6 ComputerName & "/" & PrintQueueName)
PrintQueue. Resume
Перечисление заданий печати в очереди
Для просмотра заданий печати необходимо дважды щелкнуть на пиктограмме принтера в папке Printers. Появится диалоговое окно со списком заданий (рис. 7.6).
:<* laseinteng on SFRVIR1 •
Pouted
RHHI
ЕМеТ'^ИМ’Р'*' Йем H*
OocumeniName г . ./
. ISNiw
J Owner
j Реом
i Si» ■
. J SvtwMed , v
-1РЫ1-'1
*1 Directory Services I oday
2 Enumeration
3 IAD$Exten$«on Interface
thomas.eck thomas.eck thomas.eck
1
1
1
76.5KB
39.2KB
52.9KB
еле.озрм 7/26/99
8.18 30 PM 7/26/99
81840 PM 7/26/99
Рис. 7.6. Содержимое очереди печати выбранного принтера
Используя цикл For... Next и метод Print Jobs интерфейса TADsPrintQueueOp- erations, можно программно перечислить содержимое очереди в виде массива значений типа Variant. Для отображения программного идентификатора, имени документа, его владельца и общего числа страниц задания печати в очереди используйте следующий код Visual Basic:
Dim PrintQueue As IADs PrintQueueOperat ions
Dim ComputerName As String
Dim ComputerDomain As String
Dim PrintQueueName As String
Dim PrintJob As TADsPrintJob
ComputerDomain = " Target_Computer_Domain"
ComputerName = " Target_Computer_Name" jrintQueueName = " Target_Print_Queue"
•Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" _
6 ComputerName & "/" & PrintQueueName)
For Each PrintJob in PrintQueue. Print Jobs
Debug.Print PrintJob.Name S " " s PrintJob.Description & " "
6 PrintJob.User & " " & PrintJob.TotalPages
Next
Кроме программного идентификатора, имени документа, его владельца, общеп числа страниц задания печати, можно просмотреть еще несколько свойств, которьи приведены в табл. 7.3.
Таблица 7.3. Свойства интерфейса IADs Printjob
Метод/Свойство
Описание
Только для чтения
Возвращаемый тип данных
Description
Заголовок документа'
Нет
String
HostPrintQueue
ADsPath компьютера очереди
Да
String
Notify
Идентификатор пользователя, по которому будет отправлено уведомление об окончании печати
Нет
String
Priority
Приоритет задания в очереди
Нет
Integer
Size
Размер задания (в байтах)'
Да
Long
StartTime
Время начала печати задания
Нет
Date
TimeSubmitted
Время постановки задания в очередь
Да '
Date
TotalPages
Общее количество страниц задания
Да.
Long
UntilTime
Окончательное время печати задания
Нет
Date
User
Владелец задания печати
Да
String
Используя оператор Debug. Print, можно просмотреть значения этих свойств или же сохранить их в переменной соответствующего типа данных.
Изменение приоритета задания печати для определенного . пользователя
Вы можете манипулировать свойствами интерфейса iadsPrintjob, имеющими значения, установленные не только для чтения. Рассмотрим код Visual Basic, в котором всем заданиям печати определенного пользователя присваивается значение приоритета, равное 99.
Dim PrintQueue As LADsPrintQueueOperations
Dim ComputerName As String
Dim ComputerDomain As String
Dim PrintQueueName As String Dim PrintJob As IADsPrintJob Dim UserToPrioritize As String ComputerDomain = "Target_Computer_Domain" ComputerName = " Target_Computer_Name"•
PrintQueueName = " Target_Print_Queue”
UserToPrioritize = " User_To_Elevate_Priority"
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" _
& ComputerName & "/" & PrintQueueName)
For Each PrintJob in PrintQueue.PrintJobs
If PrintJob.User = UserToPrioritize Then.
PrintJob.Priority = 99 PrintJob.SetInfо
End If Next
Дополнительные свойства интерфейса LADsPrintJobOperations
Интерфейс lADsPrintJobOperations обладает множеством свойств. Но получить реальное состояние задания печати невозможно, поскольку эта информация довольно быстро изменяется. Значения, возвращаемые “временными ” свойствами этого интерфейса, представляют собой моментальный снимок состояния очереди печати. Список этих свойств приведен в табл. 7.4.
Таблица 7.4. Свойства и методы интерфейса lADsPrintJobOperations
Метод/Свойство
ОписаниеТолько для
Возвращаемый тип
чтения
данных
PagesPrinted
Число напечатанных страницДа
Long
Position
Положение выделенного задания Нет'
в очереди печати
Long
Status
Текущее состояние задания пе- Да
Paused (1)
чати
Error (2) Deleting (4) Printing (10) Offline (20) PaperOut (40) Printed (80) Deleted (100)
TimeElapsed
Время до окончания печати зада- Да ния (в секундах)
Long
Удаление задания из очереди печати
Иногда необходимо удалить задание из очереди печати. Эта операция в ADSI выполняется с помощью интерфейса lADsContainer: вначале создается коллекция, возвращаемая методом Print Jobs интерфейса lADsPrintQueueOperations. а после этого можно удалять необходимые объекты (задания печати).
Для удаления задания необходимо знать его программный идентификатор. Это значение типа Integer или Long, благодаря которому различаются документы в очереди печати. Программный идентификатор — это значение свойства Name объекта lADsPrintJob. Для удаления всех заданий печати определенного пользователя используйте следующий код Visual Basic:
Dim PrintQueue As IADs Print Queueoperations
Dim Printjob As lADsPrintJob1
Dim ComputerName As String
Dim ComputerDomain As String
Dim PrintQueueName As String
Dim Collection As lADsCollection ,
Dim UserToRemove As String"
ComputerDomain = " Target_Computer_Domain"
ComputerName = " Targe t_Computer_Name"
PrintQueueName = " Targe t_Pr in t_Queue"
UserToRemove = " User_To_Remove_From_Queue"
Set PrintQueue = GetObject("WinNT://" & ComputerDomain S "/"
8 ComputerName & "/" & PrintQueueName)
Set Collection = PrintQueue. Print Jobs
For Each Printjob In PrintQueue. Print Jobs
If PrintJob.User = userToRemove Then Collection.Remove (CStr(PrintJob.Name))
End If
Next
Очистка очереди печати
Для удаления всех заданий можно воспользоваться кодом из предыдущего раздела, убрав проверку условия принадлежности задания определенному пользователю. Существует и еще один способ —- вызов метода Purge интерфейса lADsPrintQueueOpera- tions. Строго говоря, функция перечисления использует намного больше ресурсов, чем метод Purge. А кроме того, метод Printjobs интерфейса lADsPrintQueue делает “моментальный снимок” текущих заданий в очереди печати. Так что распечатываемый в момент связывания документ может привести к ошибкам связывания.
Итак, для полной очистки определенной очереди печати используйте следующий код Visual Basic:
Dim PrintQueue As lADsPrintQueueOperations
Dim ComputerName As String
Dim ComputerDomain As String
Dim PrintQueueName As String
Dim RetVal As Long
ComputerDomain = " Target_Computer_Domain"
ComputerName = " Target_Computer_Name”
PrintQueueName = " Target_Print_Queue"
Set PrintQueue = GetObject("WinNT://" s ComputerDomain & "/" _
& ComputerName & "/" & PrintQueueName)
PrintQueue.Purge
Создание модуля класса
NTResourceManagement.
Теперь вы можете продолжить создание приложения СОМ-сервера NTAdmin.DLL, описание которого начато в главе 3, “Методы перечисления контейнера и программное управление политикой учетных записей домена”.
Упражнение 7.1. Создание NTAdmin.DLL; функции управления ресурсами
Откройте проект Visual Basic ActiveX DLL NTAdmin, который вы начали создавать во время чтения главы 3. Этот проект можно найти по адресу: http://www.williamspublishing.com.
Добавьте к проекту новый модуль класса. Если вы начали новый проект, то не забудьте установить ссылку на библиотеку Active DS Type Library, используя диалоговое окно References, доступ к которому осуществляется с помощью команды Project^ References.
Переименуйте новый модуль в NTResourceManagement. Введите приведенный код в раздел общих объявлений модуля класса.
Public Function EnumerateShares(ByVai TargetComputerDomain As _
String, ByVai TargetComputerName As String) As Variant
On Error Resume Next
Dim FileService As IADsFileService
Dim FileShare As lADsFileShare
Dim NewElement() As Variant
Dim i As Integer
Set FileService = GetObject("WinNT://" S TargetComputerDomain _ S "/" & TargetComputerName S "/LanmanServer")
For Each FileShare In FileService
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = FileShare.Name
Next
EnumerateShares = NewElement
End Function
Public Function ManageShareProperty(ByVai TargetComputerDomain As String, ByVai TargetComputerName As String, ByVai TargetShareName As String, ByVai Action As String, ByVai ShareProperty As _ String, Optional ByVai NewValue As Variant) As Variant
Dim FileShare As lADsFileShare
Set FileShare = GetObject("WinNT://" S TargetComputerDomain _
S "/" S TargetComputerName S "/LanmanServer/" & TargetShareName) Select Case UCase(Action)
Case "QUERY”
Select Case UCase(ShareProperty)
Case "CURRENTUSERCOUNT"
ManageShareProperty = FileShare.CurrentUserCount
Case "DESCRIPTION"
ManageShareProperty = FileShare.Description
Case "HOSTCOMPUTER"
ManageShareProperty = FileShare.Hostcomputer
Case "MAXUSERCOUNT"
ManageShareProperty - FileShare.MaxUserCount
Case "PATH"
ManageShareProperty = FileShare.Path End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(ShareProperty)
Case "DESCRIPTION"
FileShare.Description = NewValue
Case "MAXUSERCOUNT"
FileShare.MaxUserCount = NewValue
End Select
FileShare.SetInfо
If Err.Number = 0 Then ManageShareProperty = True End If
End Select
End Function
Public Function ManageShares(ByVai TargetComputerDomain As String, ByVai TargetComputerName As String, ByVai TargetShareName As _ String, ByVai Action As String, Optional ByVai SharePath As _
String, Optional ByVai Sharecomment As String) As Boolean
Dim Container As lADsContainer
Dim"Fileshare As lADsFileShare
Set Container = GetObject("WinNT://" & TargetComputerDomain _
"/" & TargetComputerName & "/LanmanServer")
Select Case UCase(Action)
Case "CREATE"
■If SharePath <> "" Then
Set FileShare = Container.Create("fileshare", _'
TargetShareName)
FileShare.Path = SharePath•
FileShare.Description = ShareComment
FileShare.MaxUserCount = -1
FileShare.Setlnfо
End If
Case "REMOVE"■
Call Container.Delete("fileshare", TargetShareName)
End Select
If Err.Number = 0 Then ManageShares = True
End Function
Public Function EnumerateSessions(ByVai TargetComputerDomain _
As String, ByVai TargetComputerName As String) As Variant
On Error Resume Next
Dim FileService As lADsFileServiceOperations
Dim Session As lADsSession'
Dim NewElement() As Variant
Dim i As Integer
Set FileService = GetObject("WinNT://" & TargetComputerDomain
"/" & TargetComputerName & "/LanmanServer")
For Each Session In FileService.Sessions
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = “Session Name:" & Session.Name & " _ established by User: " & Session.User & " from Computer: " _ & Session.Computer S " Connect Time: " S Session.ConnectTime & " Idle Time: " & Session.idleTime
Next
EnumerateSessions = NewElement
End Function
Public Function DisconnectSession(ByVai TargetComputerDomain As , String, ByVai TargetComputerName As String, ByVai _ TargetUserSession As String) As Boolean
Dim FileService As TADsFileServiceOperations
Dim Session As lADsSession
Dim Collection As lADsCollection
Set FileService = GetObject("WinNT://" & TargetComputerDomain
"/" & TargetComputerName & "/LanmanServer")
Set Collection = FileService.Sessions
If UCase(TargetUserSession) <> "ALL" Then
Collection.Remove (TargetUserSession)
Else
For Each Session In Collection
Collection.Remove (Session.Name)
Next
End If
If Err.Number = 0 Then DisconnectSession = True
End Function •
Public Function EnumerateOpenResources(ByVai _
TargetComputerDomain As String, ByVai TargetComputerName _
As String) As Variant
On Error Resume Next
Dim FileService As TADsFileServiceOperations.
Dim Resource As lADsResource
Dim NewElement() As Variant
Dim i As Integer
Set FileService = GetObject("WinNT://" & TargetComputerDomain
"/" & TargetComputerName & "/LanmanServer")
For Each Resource In FileService.Resources
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = "ResourcelD:" s Resource.Name S " Resource::" _ S Resource.Path & " Opened by::" s Resource.User _
S " Lock Count::" & Resource.LockCount
Next
EnumerateOpenResources = NewElement•
End Function
Public Function EnumeratePrintQueues(ByVai TargetComputerDomain _
As String, ByVai TargetComputerName As String) As Variant
On Error Resume Next
Dim Container As TADsContainer
Dim PrintQueue As lADsPrintQueue
Dim NewElement() As Variant
Dim i As Integer
Set Container = GetObject("WinNT://" & TargetComputerDomain _
S "/" & TargetComputerName)
Container.Filter = Array("PrintQueue")
For Each PrintQueue In Container
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = PrintQueue.Name
Next
EnumeratePrintQueues = NewElement
End Function'
Public Function ManagePrintQueueProperty(ByVai TargetComputerDomain As String, ByVai TargetComputerName As String, TargetPrintQueue As . String, ByVai QueuePropertyName As String, ByVai Action As String, . Optional ByVai NewValue As Variant) As Variant
'On Error Resume Next•
Dim PrintQueue As lADsPrintQueue
Dim NewElement() As Variant
Dim i As Integer
Dim Item As Variant
Set PrintQueue = GetObject("WinNT://" s TargetComputerDomain _
"/" & TargetComputerName s "/" s TargetPrintQueue)
Select Case UCase(Action)
Case "QUERY"'
Select Case UCase(QueuePropertyName)
Case "BANNERPAGE"
ManagePrintQueueProperty = PrintQueue.BannerPage
Case "DATATYPE"
ManagePrintQueueProperty = PrintQueue.Datatype
Case "DEFAULTJOBPRIORITY"
ManagePrintQueueProperty = PrintQueue.DefaultJobPriority Case "DESCRIPTION"
ManagePrintQueueProperty = PrintQueue.Description
Case "LOCATION"
ManagePrintQueueProperty = PrintQueue.Location
Case "MODEL"
ManagePrintQueueProperty = PrintQueue.Model
Case "NAME"
ManagePrintQueueProperty = PrintQueue.Name
Case "PRINTDEVICES"
If IsArray(PrintQueue.PrintDevices) Then
For Each Item In PrintQueue.PrintDevices
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = PrintQueue.Name Next
ManagePrintQueueProperty = NewElement Else
ManagePrintQueueProperty = PrintQueue.PrintDevices End If'
Case "PRINTERPATH"
ManagePrintQueueProperty = PrintQueue.PrinterPath Case "PRINTPROCESSOR"
ManagePrintQueueProperty = PrintQueue.Printprocessor Case "PRIORITY"
ManagePrintQueueProperty = PrintQueue.Priority Case "STARTTIME"■
ManagePrintQueueProperty = PrintQueue.StartTime Case "UNTILTIME"
ManagePrintQueueProperty = PrintQueue.UntilTime End Select
Case "SET"■
If NewValue <> "" Then
Select Case UCase(QueuePropertyName)
Case "BANNERPAGE"
PrintQueue.BannerPage = NewValue
Case "DATATYPE"
PrintQueue.Datatype = NewValue
Case "DEFAULTJOBPRIORITY"
PrintQueue.DefaultJobPriority = NewValue
Case "DESCRIPTION"
PrintQueue.Description = NewValue Case "LOCATION"
PrintQueue.Location = NewValue
Case "MODEL"
PrintQueue.Model = NewValue Case "PRINTDEVICES"
If IsArray(NewValue) Then For Each Item In NewValue
i = UBound(NewElement) + 1•
ReDim Preserve NewElement(i) NewElement(i) = Item
Next
PrintQueue.PrintDevices = NewElement Else
PrintQueue.PrintDevices = NewValue End If
Case "PRINTPROCESSOR"
PrintQueue.PrintProcessor = NewValue
Case "PRIORITY"
PrintQueue.Priority = NewValue
Case "STARTTIME"
PrintQueue.StartTime = NewValue
Case "UNTILTIME"
PrintQueue.UntilTime = NewValue
End Select
End If
PrintQueue.S etInfо
If Err.Number = 0 Then ManagePrintQueueProperty = True End Select
End Function
Public Function ManagePrintQueueOperations(ByVai _
TargetComputerDomain As String, ByVai TargetComputerName As _ String, TargetPrintQueue As String, ByVai Action As String) _ As Variant
Dim PrintQueue As lADsPrintQueueOperations
Set PrintQueue = GetObject("WinNT://" 6 TargetComputerDomain _
"/" & TargetComputerName & "/" & TargetPrintQueue)
Select Case UCase(Action)
Case "STATUS"
Select Case PrintQueue.Status
ManagePrintQueueOperations = "Ready"
'
ManagePrintQueueOperations = "Paused"
ManagePrintQueueOperations = "Pending Deletion"
ManagePrintQueueOperations = "Error" Case 4
ManagePrintQueueOperations = "Paper Jam"
ManagePrintQueueOperations = "Paper Out"
ManagePrintQueueOperations = "Manual Feed"
ManagePrintQueueOperations = "Paper Problem"
Case 8
ManagePrintQueueOperations = "Offline"
Case 100
ManagePrintQueueOperations = "IO Active"
Case 200
ManagePrintQueueOperations = "Busy" Case 400
ManagePrintQueueOperations = "Printing"
Case 800
ManagePrintQueueOperations = "Output Bin Full"
Case 1000■
ManagePrintQueueOperations = "Not Available" Case 2000
ManagePrintQueueOperations = "Waiting" Case 4000
ManagePrintQueueOperations = "Processing" Case 8000
ManagePrintQueueOperations = "Initializing" Case 10000
ManagePrintQueueOperations = "Warming Up" Case 20000
ManagePrintQueueOperations = "Toner Low" Case 40000
■ ManagePrintQueueOperations = "No Toner" Case 80000
ManagePrintQueueOperations = "Page Punt" Case 100000
ManagePrintQueueOperations = "User Intervention"
Case 200000
ManagePrintQueueOperations = "Out of Memory"
Case 400000
ManagePrintQueueOperations = "Door Open" Case 800000
ManagePrintQueueOperations = "Server Unknown"
Case 1000000
. ManagePrintQueueOperations = "Power Save" End Select
Case "PAUSE"
PrintQueue.Pause
If Err.Number = 0 Then ManagePrintQueueOperations = True
Case "RESUME"
PrintQueue.Resume
If Err.Number = 0 Then ManagePrintQueueOperations = True Case "PURGE"
PrintQueue.Purge
If Err.Number = 0 Then ManagePrintQueueOperations = True End Select
End Function
Public Function EnumeratePrintJobs(ByVai TargetComputerDomain As _ String, ByVai TargetComputerName As String, TargetPrintQueue As _ String) As Variant
On Error Resume Next
Dim PrintQueue As lADsPrintQueueOperations
Dim Printjob As lADsPrintJob
Dim NewElement() As Variant
Dim i As Integer
Set PrintQueue = GetObject("WinNT://" & TargetComputerDomain _
"/" & TargetComputerName & "/" & TargetPrintQueue)
For Each PrintJob In PrintQueue.PrintJobs
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = PrintJob.Name & "" & PrintJob.Description _
"" & PrintJob.User & "" & PrintJob.TotalPages
Next
EnumeratePrintJobs = NewElement
End Function
Public Function ManagePrintJob(ByVai TargetComputerDomain As _ String, ByVai TargetComputerName As String, TargetPrintQueue _ As String, ByVai TargetPrintJob As String, ByVai Action As String, Optional ByVai PrintJobProperty As String, Optional _
ByVai NewValue As Variant) As Variant
Dim PrintQueue As lADsPrintQueueOperations
Dim Printjob As lADsPrintJob
Dim PrintJobOperation As lADsPrintJobOperations
Dim PJCollection As lADsCollection.
Set PrintQueue = GetObject("WinNT://" & TargetComputerDomain _
& "/" & TargetComputerName & "/" & TargetPrintQueue)
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(PrintJobProperty)
Case "DESCRIPTION" ,
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob Then ManagePrintJob = PrintJob.Description End If
Next
Case "HOSTPRINTQUEUE"
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob Then ManagePrintJob = PrintJob.HostPrintQueue
End If
Next
Case "NOTIFY"
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob Then ManagePrintJob = PrintJob.Not ifу
End If.
Next
Case "PRIORITY" .
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob ThenManagePrintJob = PrintJob.Priority
End If
Next
Case "SIZE"
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob Then ManagePrintJob = PrintJob.Size
End If
Next
Case "STARTTIME"
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob Then ManagePrintJob = PrintJob.StartTime End If
Next
Case "TIMESUBMITTED"
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob Then ManagePrintJob = PrintJob.TimeSubmitted
End If
Next
Case "TOTALPAGES"
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob Then ManagePrintJob = PrintJob.TotalPages End If
Next
Case "UNTILTIME"
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob Then ManagePrintJob = PrintJob.UntilTime
End If
Next
Case "USER"
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob Then ManagePrintJob = PrintJob.User
End If'
Next
Case "PAGESPRINTED"
For Each PrintJobOperation In PrintQueue.PrintJobs If PrintJobOperation.Name = TargetPrintJob Then ManagePrintJob = PrintJobOperation.PagesPrinted
End If
Next
Case "POSITION"
For Each PrintJobOperation In PrintQueue.PrintJobs If PrintJobOperation.Name = TargetPrintJob Then ManagePrintJob = PrintJobOperation.Position
End If
Next
Case "STATUS"
For Each PrintJobOperation In PrintQueue.PrintJobs If PrintJobOperation.Name = TargetPrintJob Then Select Case PrintJobOperation.Status
ManagePrintJob = "Paused"
,
ManagePrintJob = "Error"
Case 4 ManagePrintJob = "Deleting" Case 10
ManagePrintJob = "Printing" Case 20
ManagePrintJob = "Offline" Case 40 ManagePrintJob = "Paper Out" Case 80 ManagePrintJob = "Printed" Case 100 ManagePrintJob = "Deleted" End Select'
End If’
Next Case "TIMEELAPSED" For Each PrintJobOperation In PrintQueue.PrintJobs If PrintJobOperation.Name = TargetPrintJob Then
ManagePrintJob = PrintJobOperation.TimeElapsed End If
Next
End Select
Case "SET"■
Select Case UCase(PrintJobProperty)
Case "DESCRIPTION"
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob And NewValue <> "" Then PrintJob.Description = NewValue PrintJob.Setinfo
End If
Next
Case "NOTIFY"
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob And NewValue <> "" Then PrintJob.Notify = NewValue PrintJob.Setlnfo■
End If
Next
Case "PRIORITY"
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob And NewValue <> "" Then . PrintJob.Priority = NewValue .
PrintJob.Setlnfо
End If Next Case "STARTTIME" For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob And NewValue <> " " _ Then
PrintJob.StartTime = NewValue
PrintJob.Setlnfo'
End If Next Case "UNTILTIME" For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob And NewValue <> "" Then PrintJob.UntilTime = NewValue PrintJob.Setinfo
End If Next Case "POSITION"
For Each PrintJobOperation In PrintQueue.PrintJobs
.If PrintJobOperation.Name = TargetPrintJob And NewValue
<> "" Then
PrintJobOperation.Position = NewValue
PrintJobOperation.SetInfо End If
Next
End Select
If Err.Number = 0 Then ManagePrintJob = True
Case "REMOVE".
Set PJCollection = PrintQueue.PrintJobs
For Each PrintJob In PrintQueue.PrintJobs
If PrintJob.Name = TargetPrintJob Then PJCollection.Remove (CStr(PrintJob.Name))
End If
Next
If Err.Number = 0 Then ManagePrintJob = True
End Select
End Function
Скомпилируйте код в виде NTAdmin.DLL.
Сохраните и закройте проект NTAdmin.
Совет
Код проекта, а также скомпилированную его версию можно найти по адресу: http://www.williamspublishing.сот.
Использование функций модуля NTResourceManagement
После создания модуля класса NTResourceManagement можно использовать его функции практически из любого языка программирования, который поддерживает автоматизацию OLE, например Visual Basic, VBScript или JavaScript.
Совет
Создание экземпляра объекта и необходимый синтаксис приведены в главе 3. Не забудьте изменить имя класса на NTResourceManagement, где это необходимо.
В табл. 7.5 приведен синтаксис каждого метода интерфейса NTResourceManagement.
Таблица 7.5. Синтаксис методов интерфейса NTResourceManagement
Действие
Синтаксис
Перечисление совместно используемых ресурсов
For Each Share In EnumerateShares( "Computer_Domain", " Compute r_Name")
Debug.Print Share
Next
Просмотр текущего числа подключений к совместно используемому ресурсу
Просмотр комментариев к совместно используемому ресурсу
Debug.Print ManageShareProperty("Computer_Domain", "Computer_Name", "Share_Name", "Query", "CurrentUserCount")
Debug.Print ManageShareProperty("Computer_Domain", "Computer_Name", "Share_Name", "Query",
"Description")
Действие
Синтаксис
Просмотр имени компьютера, на котором находится совместно используемый ресурс
Просмотр максимального числа подключений к совместно используемому ресурсу
Просмотр местоположения совместно используемого ресурса
Установка нового комментария к совместно используемому ресурсу
Установка нового значения максимального количества подключений к совместно используемому ресурсу Создание нового совместно используемого ресурса
Debug.Print ManageShareProperty("Computer_Domain", "Computer_Name", "Share_Name", "Query", "Hostcomputer")
Debug.Print ManageShareProperty("Computer_Domain", "Computer_Name", "Share_Name", "Query", "MaxUserCount")
Debug.Print ManageShareProperty("Computer_Domain", "Computer_Name", "Share_Name", "Query", "Path")
Debug.Print ManageShareProperty("Computer_Domain", "Computer_Name", "Share_Name", "Set", "Description", "New_Description")
Debug.Print ManageShareProperty("Computer_Domain", "Computer_Name", "Share_Name", "Set", "MaxUserCount", -1)
Debug.Print ManageShares("Computer_Domain",
"Computer_Name", "Share_Name", "Create", "C:\Path", "New Share Comment")
Удаление совместно используемого файлового ресурса Перечисление сессий
Debug.Print ManageShares("Computer_Domain", "Computer_Name", "Share_Name", "Remove")
For Each Session In EnumerateSessions( "Computer_Domain", "Computer_Name")
Debug.Print.Session
Next
Отключение пользовательской сессии
Debug.Print DisconnectSession("Computer_Domain", "Computer_Name", "Session_Name")
Перечисление открытых ресурсов на выбранном компьютере
For Each OpenResource In EnumerateOpenResources( "Computer_Domain", "Computer_Name")
Debug.Print OpenResource
Next
Перечисление очереди печати на выбранном сервере
For Each PrintQueue In EnumeratePrintQueues( "Computer_Domain", "Computer_Name")
Debug.Print PrintQueue
Next
Просмотр свойств очереди печати
Debug. Pr .i nt ManagePr i nt Queue Hr ope rt у (
"Computer_Domain", "Computer_Name", "Printer_Name", "BannerPage", "Query")
Debug.Print ManagePrintQueueProperty(
"Computer_Domain", "Computer_Name",
"Printer_Name", "Datatype", "Query")
Debug.Print ManagePrintQueueProperty(
"Computer_Domain", "Computer_Name",
"Pr,inter_Name", "DefaultJobPriority", "Query")
Действие
Синтаксис■
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "Description", "Query"). .
Debug.Print ManagePrintQueueProperty(
"Computer_Domain", "Computer_Name", "Printer_Name", "Location", "Query")
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "Model", "Query")
Debug.Print ManagePrintQueueProperty(
"Computer_Domain", "Computer_Name", "Printer_Name", "Name", "Query")
If IsArray(ManagePrintQueueProperty(
"Computer_Domain", "Computer_Name", "Printer_Name", "PrintDevices", "Query")) Then
For Each Device In ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "PrintDevices", "Query")
Debug.Print Device
Next
Else
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "PrintDevices", "Query")
End If
Debug.Print ManagePrintQueueProperty(
"Computer_Domain", "Computer_Name", "Printer_Name", "PrinterPath", "Query")
Debug.Print ManagePrintQueueProperty(
"Computer_Domain", "Computer_Name", "Printer_Name", "PrintProcessor", "Query")
Debug.Print ManagePrintQueueProperty(
"Computer_Domain", "Computer_Name", "Printer_Name", "Priority", "Query")
Debug.Print ManagePrintQueueProperty(
"Computer_Domain", "Computer_Name", "Printer_Name", "StartTime", "Query")
Debug.Print ManagePrintQueueProperty(
"Computer_Domain", "Computer_Name", "Printer_Name", "UntilTime", "Query")
Установка свойств очереди печати
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "BannerPage", "Set", "pscript.sep")
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "Datatype", "Set", "RAW")
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "DefaultJobpriority", "Set", 50)
Действие
Синтаксис
Debug.Print ManagePrintQueueProperty( "Computer Domain", "Computer Name", "Printer Name",
"Description", "Set", "Queue_Description")
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "Location", "Set", "Printer_Location")
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "Model", "Set", "Driver Description")
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "PrintDevices", "Set", "Port")
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "PrintProcessor", "Set", "WinPrint")
Debug.Print ManagePrintQueueProperty( "Computer Domain", "Computer Name", "Printer Name",
"Priority", "Set", "Priority")
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "StartTime", "Set", #Start_Time#)
Debug.Print ManagePrintQueueProperty( "Computer_Domain", "Computer_Name", "Printer_Name", "UntilTime", "Set", #End_Time#)
Просмотр состояния очере-
Debug.Print ManagePrintQueueOperations(
ди печати
"Computer_Domain", "Computer_Name", "Printer_Name", "Status")
Приостановка очереди печати
Debug.Print ManagePrintQueueOperations( "Computer_Domain", "Computer_Name", "Printer_Name", "Pause")
Возобновление печати после
Debug.Print ManagePrintQueueOperations(
приостановки
"Computer_Domain", "Computer_Name", "Printer_Name", "Resume")
Удаление всех заданий из
Debug.Print ManagePrintQueueOperations(
очереди печати
"Computer_Domain", "Computer_Name", "Printer_Name", "Purge")
Просмотр свойств задания
Debug.Print ManagePrintJob("Computer_Domain",
печати
"Computer_Name", "Printer_Name", "Job_Number", "Query", "Description")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "HostPrintQueue")
Debug.Print MahagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "Notify")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "Priority")
Действие
Синтаксис
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "Size")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "StartTime")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "TimeSubmitted")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "TotalPages")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "UntilTime")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", " Job__Number", "Query", "User")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "PagesPrinted")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "Position")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "Status")
Debug.Pr int ManageprintJob ("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Query", "TimeElapsed")
Установка свойств задания печати
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Set", "Description", "New_Description")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Set", "Notify", "User_To_Notify")
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Set", "Priority", New_Job_Priority)
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "printer_Name", "Job_Number", "Set", "StartTime", #StartTime#)
Debug.Print ManagePrintJob("Computer_Domain", '"Computer_Name", "Printer_Name", "Job Number", "Set", "UntilTime", #EndTime#)
Debug.Print ManageprintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Set", "position", PositionlnQueue)
Удаление задания из очереди печати
Debug.Print ManagePrintJob("Computer_Domain", "Computer_Name", "Printer_Name", "Job_Number", "Remove")
Резюме
В этой главе речь шла о различных функциях ADSI, используемых для программного управления ресурсами.
С ПОМОЩЬЮ интерфейсов IADsFileServi.ce, lADsFileServiceOperations И TADsFileShare можно перечислять и управлять совместно используемыми файловыми ресурсами на любом компьютере в сети компании. А применяя интерфейсы lADsSession и lADsCollection, можно программно управлять пользовательскими сессиями.
Для программного управления принтерами применяются интерфейсы lADsPrin- tQueue, lADsPrintQueueOperations, lADsPrintJob И lADsPrintJobOperations.
Если вы освоите программное выполнение административных функций с помощью ADSI, то сможете закончить свою работу в качестве администратора до обеда.
Часть III
Исследование провайдеров ADSI: IIS
Программное управление метабазой IIS
Программное управление Web-узлом
Программное управление FTP-узлом
Программное управление ■метабазой IIS
Большинство административных функций Windows NT могут быть выполнены программно, но некоторые из них, например установка разрешений на совместно используемый ресурс, не обладают соответствующими программными функциями или сложны в реализации, например манипулирование временем регистрации в системе.
Однако провайдер ADSI Internet Information Server (IIS) 4.0 реализует модель объектов, с помощью которой можно манипулировать практически каждой функцией в модуле 1IS 4.0 Internet Service Manager средства Microsoft Management Console (ММС). Для конфигурирования Windows NT используется системный реестр, а для настройки IIS — метабаза IIS (IIS Metabase).
Запустите HTML Internet Service Manager и посмотрите примеры ASP в каталоге %SystemRoot%\System32\lnetSrv\iiSAdmin. Обратите внимание, что создание экземпляров объектов поразительно напоминает связывание строк ADsPath, которое использовалось для связи объектов в провайдере Windows NT. Это объясняется тем, что корпорация Microsoft выбрала ADSI в качестве основного интерфейса для программного манипулирования метабазой IIS. Подобно базе SAM Windows NT, связывание которой осуществляется с помощью идентификатора пространства имен Windows NT, можно манипулировать метабазой 11S, указывая провайдер IIS ADSI в строке связывания.
В этой главе описываются преимущества использования ADSI при выполнении сценариев административных задач 1IS. Поскольку в IIS реализована собственная модель объектов, в этой главе рассматриваются темы, относящиеся к серверу IIS в целом, в том числе следующие:
структура метабазы 1IS;
объект IlsComputer;
ведение журнала узла 1IS;
программное управление узлом;
программные операции узла.
В этой главе представлен материал по созданию первой части СОМ-сервера IISAdmin.DLL.
Структура метабазы IIS
Операционная система Windows NT использует системный реестр для хранения собственных конфигурационных данных, а сервер 1IS применяет для этого метабазу. Как и системный реестр, метабаза имеет двоичный формат файла с внутренней иерархической структурой, используемый для конфигурации сервера I1S.
Примечание
Для просмотра метабазы 11S можно использовать утилиту MetaEdit из комплекта IIS Resource Kit или же ADSI для рекурсивного перечисления структуры метабазы.
Просмотр структуры метабазы IIS с помощью Visual Basic
Понимание структуры метабазы IIS требует четкого представления о том, как создается строка связывания, необходимая для доступа к определенному контейнеру или объектам-листьям в пространстве имен. На рис. 8.1 ' показан верхний уровень структуры метабазы IIS.
Подобная диаграмма может описыватьПодобная диаграмма может описыватьпрограммное использование ADSI и
Подобная диаграмма может описывать
Подобная диаграмма может описывать
Visual Basic. Если необходимо просмотреть структуру одного уровня метабазы IIS, используйте следующий код Visual Basic для отображения каждого дочернего уровня в иерархии:
Dim Dim Dim DimDim Dim Dim DimParent As IADs Child As IADs Startingpoint As String RetVal As String
Dim Dim Dim Dim
Dim Dim Dim Dim
Startingpoint = " IIS_Server_Name"
Set Parent = GetObject("IIS://" & StartingPoint)
For Each Child In Parent■
RetVal = Child.Name
Debug.Print RetVal
Next
Например, для просмотра содержимого контейнера W3SVC нужно назначить переменной StartingPoint значение Server_Name/W3SVC. В этом случае на экране появится следующее:
Filters
1
Info
2
В вашей системе отображаемая информация может быть иной (в зависимости от количества поддерживаемых Web-узлов), но в большинстве случаев узел ассоциирован с целым значением — 1; это Default Web Site.
На основе представленной информации впоследствии можно выбрать новый уровень отображения. Измените значение переменной StartingPoint на Server_Name/W3SVC/l, и вы увидите приблизительно следующий результат:
ROOT
IIsCertMapper"
Внутри контейнера root можно получить доступ к большому количеству свойств, которые оказывают влияние на узел. Таким образом, “раскапывая” уровень за уровнем иерархии метабазы IIS, вы можете добраться до необходимого параметра.
Объект IlsComputer
Этот объект находится на вершине иерархии метабазы IIS. В модуле Internet Service Manager для ММС объект IlsComputer может быть представлен графически: щелкните правой кнопкой на имени сервера и из появившегося контекстного меню выберите команду Properties.
С помощью интерфейса IlsComputer можно программно управлять резервным копированием метабазы, шириной полосы пропускания всех Web- и FTP-узлов, а также записями по умолчанию типа MIME на уровне сервера.
Резервное копирование метабазы IIS с помощью Visual Basic
Перед началом программного администрирования сервера IIS обязательно выполните резервное копирование. В общем случае для выполнения резервного копирования метабазы 1IS используйте следующий синтаксис:
IlsComputerObj.Backup BackupLocation, Backupversion, BackupFlags
Параметр BackupLocation определяет имя файла, который располагается в каталоге %SystemRoot%\System32\Inetsrv\Metaback.
С помощью параметра Backupversion можно создать новый резервный файл или же заменить существующий в этом каталоге. Параметр Backupversion может принимать значение одного из следующих флагов.
ФлагОписание
md_backup_highest_verSion Старшая версия файла резервного копирования в каталоге, определенном параметром BackupLocation, заменяется новой
md_backup_next_version Создается следующая версия файла резервного копирования метабазы IIS
Параметр BackupFlags определяет способ выполнения резервного копирования и может принимать значение одного из следующих флагов. .
Флаг
Описание
MD_BACKUP_SAVE_FIRST
Перед резервным копирование выполняется операция Save Data
MD_BACKUP_FORCE_BACKUP
Резервное копирование осуществляется даже в том случае, если операция md_backup_save_first завершилась неудачно
MD_BACKUP_OVERWRITE
Если существующий файл резервного копирования имеет одинаковую версию с сохраняемым, то новая версия заменяет старую
Для начала резервного Visual Basic:
копирования метабазы IIS используйте следующий код
Dim IlsComputer As IADs
Dim Flags As Long
Dim Targetcomputer As String
Targetcomputer = " Target_Server_Name"■■
Flags = (MD_BACKUP_SAVE_FIRST Or MD_BACKUP_FORCE_BACKUP)
Set IlsComputer = GetObject("IIS://" & Targetcomputer)
IlsComputer.Backup "MyBackuplO", MD_BACKUP_NEXT_VERSION, Flags
Перечисление существующих резервных копий
Для проверки правильности выполнения резервного копирования можно перечислить все существующие файлы резервных копий, используя метод EnumBackups интерфейса IlsComputer следующим образом:
On Error Resume Next
Dim IlsComputer As IADs
Dim Targetcomputer As String
Dim Version, index, TermCond As Integer
Dim Location As Variant
Dim UTCDate As Variant
Targetcomputer = " Target_Server_Name?
Set IlsComputer = GetObject("IIS://" S Targetcomputer)
Do While TermCond о 1
IlsComputer.EnumBackups ", Index, Version; Location, UTCDate
If Err.Number <> 0 Then• ■
Exit Do
End If'
Debug.Print Location s " Version: " & Version & " " & UTCDate Index = Index + 1
Loop
Восстановление метабазы из резервной копии
После резервного копирования метабазы можно приступать к программным экспериментам. Если же они заканчиваются неудачно, то всегда можно вернуться к предыдущим параметрам, восстановив метабазу из резервной копии. Для этого можно использовать метод Restore интерфейса IlsComputer, передавая в качестве аргументов расположение и информацию о версии резервной копии.
Итак, для программного восстановление метабазы 1IS из резервной копии используйте следующий код Visual Basic:
Dim IlsComputer As IADs
Dim Targetcomputer As String
Dim BackupLocation As String
Targetcomputer = " Target_Server_Name”
BackupLocation = '’Backup_Location_On_Target_Server”
Set IlsComputer = GetObject("IIS://" & Targetcomputer)
IlsComputer.Restore BackupLocation, MD_BACKUP_HIGHEST_VERSION, 0
Совет
После восстановления метабазы для внесения изменений необходимо перезагрузить сервер IIS.
Удаленце существующей резервной копии метабазы
После тестирования программных методов создания резервной копии метабазы ее старые версии можно удалить. Для этого используется метод DaleteBackup интерфейса IlsComputer следующим образом:
Dim IlsComputer As IADs
Dim Targetcomputer Aa String
Dim BackupLocation As String
Targetcomputer = " Target_Server_Name"
BackupLocation = "Backup_Location”
Set IlsComputer = GetObject("IIS://" & Targetcomputer)
IlsComputer.DeleteBackup BackupLocation, MD_BACKUP_HIGHEST_VERSION
Совет
В приведенном фрагменте кода система удалит самую “свежую ” резервную копию метабазы. Применяя перечисление, можно программно удалить все существующие резервные копии.
Версию удаляемой резервной копии можно выбрать, установив соответствующий флаг MD_BACKUP_HIGHEST_VERSION.
Манипулирование максимальной шириной полосы пропускания сети сервера IIS
Сервер 1IS позволяет управлять шириной полосы пропускания, связанной со службами File Transfer Protocol (FTP) и Web (рис. 8.2). Аналогичную процедуру можно выполнять и программно — с помощью метода MaxBandwidth интерфейса IlsComputer.
Возможность настройки полосы пропускания особенно полезна при использовании одного сервера в нескольких ролях, например он может работать как файл-сервер и как почтовый сервер.
Примечание
Также имеет смысл ограничивать полосу пропускания в тестовой среде. Например, тестеры и разработчики могут получить приблизительную оценку эффективности работы приложений при их реальном функционировании в достаточно медленных глобальных сетях. Кроме того, этот параметр позволяет оценить скорость загрузки Web-узла, поскольку дизайнеры довольно часто забывают о пользователях, подключающихся в Internet с помощью медленных каналов связи.
Рис. 8.2. Общие параметры настройки сервера IIS
Просмотр значения свойства MaxBandwidth с помощью Visual Basic
Для просмотра текущего значения свойства MaxBandwidth используйте следующий код:'
Dim IlsComputer As IADs
Dim Targetcomputer As String
Dim RetVal As Long
Targetcomputer = ” Target_Server_Name"
Set IlsComputer = GetObject("IIS://" s Targetcomputer) RetVal = IlsComputer.MaxBandwidth Debug.Print RetVal
Если ограничение на полосу пропускания не установлено, свойство MaxBandwidth возвращает значение -1.•
Сонет
Значение свойства MaxBandwidth определяется в байтах. При преобразовании не забудьте выполнять необходимые действия, например для преобразования в килобайты необходимо разделить возвращаемое значение на 1 024.
Установка нового значения свойства MaxBandwidth с помощью Visual Basic
Для установки ограничения полосы пропускания сервера IIS воспользуйтесь кодом
Dim IlsComputer As IADs
Dim Targetcomputer As String
Dim NewValue As Long
Targetcomputer = " Target_Server_Name" ■
NewValue = New_Throttle_Value_In_Bytes
Set IlsComputer = GetObject("IIS://" s Targetcomputer)
IlsComputer .MaxBandwidth = NewValue
IlsComputer. Setinfo
Внимание
Для внесения изменений в метабазу необходимо перезапустить соответствующук. службу. Программный перезапуск службы описывается в главе 6, “Программное управление компьютером и службами ”.
Управление параметрами MIME
С помощью модуля Internet Service Manager ММС или программных методов можно модифицировать типы М1МЁ, передаваемые броузеру в заголовках HTTP. Сервер IIS допускает глобальное определение типов MIME для сервера и отдельных узлов.
Просмотр списка определенных на сервере типов MIME с помощью Visual Basic
Для перечисления типов MIME, определенных для всех Web-узлов сервера, можно использовать следующий код:
Dim IlsComputer As IADs
Dim Targetcomputer As String
Dim MimeMapping As Variant
Targetcomputer = "Target_Server_Name"
Set IlsComputer = GetObject("IIS://" & Targetcomputer & "/MimeMap")
Debug.Print "Registered File Types:"
For Each MimeMapping in IlsComputer.MimeMap
Debug.Print "Extension: " & MimeMapping.Extension _
& " MIME Content Type: " & MimeMapping.MimeType
Next
Добавление нового определенного на сервере типа MIME с помощью Visual Basic
Если необходимо реализовать новый тип документа и ассоциировать его с приложением для всех узлов выбранного сервера, необходимо добавить новый тип MIME на уровень сервера. Для этого используйте следующий код:'
Dim IlsComputer As IADs
Dim Targetcomputer As String
Dim MimeMapping As Variant
Dim NewMimeMapping As Variant
Dim MimeExtension As String
Dim MimeType As String
Dim i As Integer
Targetcomputer = " Target_Server_Name”
MimeExtension = ” New_MIME_Extension"
MimeType = " New_MIME_Type"
Set IlsComputer = GetObject("IIS://" S Targetcomputer & "/MimeMap") NewMimeMapping = IlsComputer.GetEx("MimeMap")
i = USound(NewMimeMapping) + 1.
ReDim Preserve NewMimeMapping(i)
Set NewM4meMapping(i) = CreateObject("MimeMap")
NewMimeMapping(i).MimeType = MimeType 'j
NewMimeMapping(i).Extension = MimeExtension*
IlsComputer.PutEx ADS_PROPERTY_UPDATE, "MimeMap", NewMimeMapping IlsComputer.Setinfo
Совет
Чтобы с помощью приведенного фрагмента кода создать новый тип MIME для всех файлов с расширением .ТЕЕ и ассоциировать их с приложением Microsoft Word, установите значение переменной MimeExtension, равное . TEE, a MimeType — application/msword.
Удаление определенного на сервере типа MIME с помощью Visual Basic
Поместить объекты в массив довольно просто, а вот для их удаления из массива необходимо использовать иную технику. Чтобы удалить тип MIME, следует создать новый массив, который содержит те же элементы, что и старый, за исключением удаляемого типа MIME, а затем поместить его вместо старого.
Внимание
Если вы в последнее время не создавали резервных копий метабазы, то обязательно выполните эту процедуру перед запуском приведенного ниже фрагмента кода (помните, что ее можно выполнять не только программным методом, но и с помощью средств операционной системы)..
В приведенном коде Visual Basic используются перечисление и создание нового типа MIME из двух предыдущих разделов.
Dim IlsComputer As IADs
Dim Targetcomputer As String
Dim MimeMapping As Variant
Dim MapToDelete As String
Dim NewMimeMapping As Variant
Dim i As Integer
MapToDelete = "Extension_To_Delete_From_MIME_Map"
Targetcomputer = "Target_Server_Name"
Set IlsComputer = GetObject("IIS://" & Targetcomputer S "/MimeMap") NewMimeMapping = IlsComputer.MimeMap For Each MimeMapping In IlsComputer.MimeMap
If MimeMapping.Extension <> MapToDelete Then
ReDim Preserve NewMimeMapping(i)
Set NewMimeMapping(i) = CreateObject("MimeMap")'
NewMimeMapping(i).MimeType = MimeMapping.MimeType
NewMimeMapping(i).Extension = MimeMapping.Extension i = i + 1
End.If
Next
Dim Mimeitem As Variant
For Each Mimeitem In NewMimeMapping
Debug.Print Mimeitem.MimeType
Next
IlsComputer. PutEx ADS_PROPERTY_UPDATE, "MimeMap", NewMimeMapping
IlsComputer.Setinfo
Примечание
Обратите внимание, что последняя строка в приведенном фрагменте кода закомментирована. Перед записью нового массива в пространство имен должна быть полная уверенность в том, что новый массив существует и заполнен всеми необходимыми данными (за исключением удаляемого типа). Вначале проверьте список расширений, отображаемый в окне отладки, перед сохранением его в пространстве имен.
После такой тщательной проверки кода удалите последний цикл For.. .Each раскомментируйте последнюю строку кода. Теперь все данные будут записаны метабазу IIS.
Внимание
Если в результате выполнения кода произойдет ошибка и в метабазу HS будет зат сан пустой массив, то вы потеряете все определенные типы MIME. Для восстанови ния утерянной информации воспользуйтесь предварительно сохраненной резервной Kt пией метабазы.
Запись журнала узла IIS
Сервер IIS позволяет вести журнал, в котором регистрируется различная информа ция, например доступ к узлу. Эти данные можно использовать для дальнейшего ана лиза с помошью специализированных инструментов, например WebTrends, или же дл устранения возникающих проблем.
Для ведения журнала в I1S 4.0 поддерживается четыре провайдера:
Microsoft IIS Log File Format;
NCSA Common Log File Format;
ODBC Logging;
W3C Extended Log File Format.
Провайдер ведения журнала в каждой службе IIS
Журнал активности пользователей можно вести для всех служб IIS. Однак каждая служба поддерживает собственный набор, определяемый провайдерам: ведения журнала.
В табл. 8.1 приведены форматы журнала в каждой службе IIS.
Таблица 8.1. Форматы журнала, поддерживаемые каждой службой JJS
Провайдер ведения журнала
Служба WWW
Служба FTP
Служба SMTP Служба NNTP
Microsoft IIS Log File Format
+
+
+
+
NCSA Common Log File Format
+
-
+
+
ODBC Logging
+
+
+
+
W3C Extended Log File Format
+
+
+
+
Активизация ведения журнала
Для регистрации событий узла необходимо активизировать ведение журнала, те установить в окне средства Internet Service Manager соответствующий флажок. Программная активизация ведения журнала осуществляется с помошью модификащц значения свойства LogType. '
Совет
В последующих примерах кода используется провайдер W3SVC. Вы можете выбрали какой-либо другой провайдер — MSFTPSVC, SmtpSvc или NNTPSVC.
Просмотр текущего состояния журнала с помощью Visual Basic
Чтобы проверить активность журнала на выбранном узле, используйте следующий код:
Dim Site As IADs'
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" S ServerName S "/W3SVC/" S Siteindex)
Debug.Print Site.LogType
Установка текущего состояния журнала с помощью Visual Basic
Для активизации журнала на выбранном узле установите значение свойства LogType равным 1 (при деактивизированном журнале значение этого свойства равно 0), используя код
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name”
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" S ServerName S "/W3SVC/" S Siteindex) Site.LogType = 1
Site. Setinfo
Формат активного журнала
С помощью свойства LogPiuginCLSiD объекта провайдера IIS можно просматривать и изменять формат активного журнала, используемого для регистрации запросов клиентов. Метабаза IIS ссылается на этот объект на основе идентификатора класса (CLSID), а не по имени. Таким образом, для просмотра или изменения формата активного журнала необходимо установить соответствие между именами и их CLSID."
Связывая объект регистрации ведения журнала Web-сервера, можно найти имена и идентификаторы всех установленных провайдеров. После этого, у вас появится достаточно данных для установки соответствия между CLSID и более “понятными” именами.
Просмотр формата активного журнала с помощью Visual Basic
Для определения формата активного журнала используйте следующий код:
Dim Site As IADs,
Dim Log As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = "IIS_Server_Name"■
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" S ServerName S "/W3SVC/" s Siteindex)
Set Log = GetObject("IIS://" S ServerName S "/logging")
For Each Item In Log
If Site.LogPiuginCLSiD = Item.LogModulelD Then
' Debug.Print Item.Name
End If
Next'
Установка формата активного журнала с помощью Visual Basic
Для программной установки формата журнала необходимо знать имя или CLSIE регистрируемого объекта. В приведенном ниже фрагменте кода Visual Basic в имею передается назначение нового провайдера ведения журнала.
Dim Site As IADs
Dim Log As IADs'
Dim ServerName As String
Dim Siteindex As Long
Dim NewLogFormatName As String
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
NewLogFormatName = "NCSA Common Log File Format"
'NewLogFormatName = "ODBC Logging"
'NewLogFormatName = "Microsoft IIS Log File Format"
'NewLogFormatName = "W3C Extended Log File Format"
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Set Log = GetObject("IIS://" & ServerName & "/logging")
For Each Item In Log
If Item.Name = NewLogFormatName Then
Site.LogPluginCLSID = Item.LogModulelD
Site.Setinfo
End If
Next
Совет
Для перечисления имен провайдеров ведения журнала на выбранном компьютере ис пользуйте следующий код Visual Basic:
Dim Log As IADs
Dim ServerName As String
ServerName = " IIS_Server_Name"
Set Log = GetObject("IIS://" & ServerName & "/logging")
For Each Item In Log
Debug.Print Item.Name
Next.’
Дополнительные свойства формата журнала
Каждый провайдер содержит дополнительные свойства, которые позволяют мани пулировать расширенной информацией, определяемой провайдером. При использова нии журнала на основе текстового файла ASCII эта дополнительная информация мо жет включать коллекцию периода и местоположение файла журнала. А при использо вании провайдера ведения журнала ODBC можно выбрать имя источника данны (Data Source Name — DSN), имя таблицы и права доступа пользователя.
Каждый провайдер поддерживает уникальную конфигурацию. В этом разделе реч пойдет о программном механизме манипулирования дополнительными свойствам каждого провайдера.
Настройка свойств конфигурации периода регистрации и местоположения файлов журналов на основе ASCII-файлов
Провайдеры Microsoft IIS Log File Format и NCSA Common Log File Format обес печивают создание текстового файла ASCII, содержащего различную не конфигурм руемую пользователем информацию. Эти провайдеры поддерживают настройку лиш двух параметров: периода регистрации и местоположения файлов журналов (рис. 8.3)
Рис. 8.3. Диалоговое окно Microsoft Logging Properties (аналогичная вкладка есть также в окнах NCSA Common Log File Format и W3C Extended Log File Format)
Для просмотра или установки периода регистрации журнала применяется свойство LogFilePeriod.
Просмотр временного периода регистрации журнала с помощью Visual Basic
Сервер IIS использует четыре целых значения, представляющих временной период регистрации файлов журнала.
ЗначениеВременной период
ОНеограничен
Ежедневно
Еженедельно
Ежемесячно
Для просмотра временного периода регистрации журнала просто извлеките текущее значение свойства LogFilePeriod, используя следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Debug. Print Site .LogFilePeriod
Установка нового временного периода регистрации журнала
: помощью Visual Basic
Для установки нового временного периода регистрации файла журнала восполь- >уйтесь кодом
)im Site As IADs
Jim ServerName As String
Dim Siteindex As Long
Dim NewLogFilePeriod As Integer
ServerName = " IIS_Server_Name"
Siteindex = Site_lndex_Value
NewLogFilePeriod = 1
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" 6 Siteindex)
Site.LogFilePeriod = NewLogFilePeriod
Site.Setinfo
Закрытие журнала на основе размера файла
Файлы журналов можно закрывать не только хронологически, но и по достиженю определенного размера. Для этого используйте значение свойства LogFileTruncate Size, которое определяет максимальный размер файла журнала.
После достижения файлом журнала определенного размера сервер открывает но вый файл. Впоследствии эти файлы удобно архивировать, например на съемные носи тели типа Zip.'
Просмотр максимального размера файла журнала с помощью Visual Basic
Для просмотра максимального размера файла журнала используйте следующий код:
Dim Site As IADs
Dim ServerName As String,
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Debug.Print Site.LogFileTruncateSize
Установка максимального размера файла журнала с помощью Visual Basic
Установить максимальный размер файла журнала можно с помощью кода
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim NewLogFileSize As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
NewLogFileSize = 1048576
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Site.LogFileTruncateSize = NewLogFileSize
Site.Setinfo
Примечание
При определении максимального размера файла журнала не забудьте установить значение свойства LogFilePeriod равным 0.
Дополнительные свойства файла журнала провайдера W3C
Из всех провайдеров наиболее детализирован W3C Extended Log File Format, имеющий самое большое число настраиваемых параметров (рис. 8.4). Кроме основных (путь файла журнала и период его регистрации), можно настроить около 20 различных параметров.
Рис. 8.4. Диалоговое окно W3C Extended Logging Properties
Примечание
Для описания состояния дополнительных параметров применяются значения типа Boolean. Кроме того, некоторые из дополнительных свойств поддерживаются не всеми провайдерами.
Просмотр дополнительных параметров ведения журнала с помощью Visual Basic
Для генерации таблицы дополнительных параметров в окне отладки интегрированной среды разработки Visual Basic используйте следующий код:
Dim Site As IADs''
Dim ServerName As String
Dim Siteindex As Long
ServerName = " llS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Debug.Print "Log Date: " & vbTab & vbTab & vbTab _
Site.LogExtFileDate .
Debug.Print "Log Time: " & vbTab & vbTab & vbTab _
Site.LogExtFileTime .
Debug.Print "Log Client IP Address: " & vbTab _
i Site.LogExtFileClientlp
Debug.Print "Log User Name: " & vbTab s vbTab _
Site.LogExtFileUserName
Debug.Print "Log Service Name: " & vbTab & vbTab _
S Site.LogExtFileSiteName
Debug.Print "Log Server Name: " & vbTab & vbTab _
S Site.LogExtFileComputerName
Debug.Print "Log Server IP: " & vbTab & vbTab _
Site.LogExtFileServerlp
Debug.Print "Log Server Port: " & vbTab & vbTab _
S Site.LogExtFileServerPort
Debug.Print "Log Method: " & vbTab & vbTab & vbTab _
Site.LogExtFileMethod
Debug.Print "Log URI Stem: " & vbTab & vbTab & vbTab
Site.LogExtFileUriStem
Debug.Print "Log URI Query: " & vbTab & vbTab _
Site.LogExtFileUriQuery
Debug.Print "Log Http Status: " & vbTab & vbTab _
Site.LogExtFileHttpStatus
Debug.Print "Log Win32 Status: " & vbTab & vbTab _
Site.LogExtFileWin32Status
Debug.Print "Log Bytes Sent: " & vbTab & vbTab _
Site.LogExtFiieBytesSent
Debug.Print "Log Bytes Received: " & vbTab _
Site.LogExtFileBytesRecv
Debug.Print "Log Time Taken: " & vbTab & vbTab _
Site.LogExtFileTimeTaken
Debug.Print "Log Protocol Version: " & vbTab _
Site.LogExtFileProtocolVersion
Debug.Print "Log User Agent: " & vbTab & vbTab _
Site.LogExtFileUserAgent
Debug.Print "Log Cookie: " & vbTab & vbTab & vbTab _
Site.LogExtFileCookie
Debug.Print "Log Referrer: " & vbTab & vbTab & vbTab
Site.LogExtFileReferer
Установка дополнительных параметров ведения журнала с помощью Visual Basic
Чтобы установить дополнительные параметры ведения журнала провайдера W3C Extended Log File Format, воспользуйтесь кодом
Dim Site As IADs
Dim ServerName As String
Dim SiteIndex As Long
ServerName = " IIS_Server_Name"
SiteIndex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Site.LogExtFileDate = True
Site.LogExtFileTime = True
Site.LogExtFileClientlp = True
Site.LogExtFileUserName = True
Site.LogExtFileSiteName = True
Site.LogExtFileComputerName = True
Site.LogExtFileServerlp = True
Site.LogExtFileServerPort = True
Site.LogExtFileMethod = True
Site.LogExtFileUriStem = True
Site.LogExtFileUriQuery = True
Site.LogExtFileHttpStatus = True
Site.LogExtFileWin32Status = True
Site.LogExtFiieBytesSent = True
Site.LogExtFileBytesRecv = True
Site.LogExtFileTimeTaken = True
Site.LogExtFileProtocolversion = True
Site.LogExtFileUserAgent = True
Site.LogExtFileCookie = True
Site.LogExtFileReferer = True
Site.Setinfo
Свойства провайдера ведения журнала ODBC
Если файл журнала необходимо просматривать с помощью ASP, можно уста- говить базу данных ODBC для сохранения в ней всей регистрируемой информа- 1ии (рис. 8.5).
Рис. 8.5. Диалоговое окно ODBC Logging Properties
Следует отметить, что доступ к журналу ODBC из Web осуществляется довольно просто (например, с помощью ADO), а производительность “хромает”. Регистрация журнала ODBC имеет худшую производительность по сравнению с остальными провайдерами ведения журнала. Используйте этот провайдер только при реализации ин- лрументов мониторинга на основе Web.
Чтобы активизировать регистрацию журнала ODBC, сначала необходимо исполь- ювать ODBC-совместимую платформу баз данных (например, Access, SQL Server, Oracle или Sybase) для создания таблицы с полями, описанными в табл. 8.2.
Таблица 8.2. Поля таблиц для регистрации журнала ODBC
Имя поля
Тип данных
ClientHost
varchar(255)
Username
varchar(255)
LogTime
Service
Datetime varchar(255)
Machine
varchar(255)
ServerlP
varchar(50)
ProcessingTime BytesReceived BytesSent ServiceStatus
Int’
Int.
Int"
I nt
Win32Status
Int
Имя поляТип данных
Operationvarchar(255)
Targetvarchar(255)
Parametersvarchar(255)
После этого необходимо создать и настроить системный источник данных. Теперь можно приступать к настройке сервера I1S для использования базы данных ODBC в качестве журнала.
Примечание
Для настройки регистрации журнала ODBC нужно установить только четыре свойства: используемый системный источник данных (LogOdbcDataSource), имя таблицы (LogOdbcTableName), имя пользователя для доступа к таблице (LogOdbcUsername) и пароль (LogOdbcPassword).
Просмотр параметров журнала ODBC с помощью Visual Basic
Для просмотра конфигурационных параметров журнала ODBC используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = '4IS_Server_Namen
Siteindex = Site_Index_Value
Set Site = GetObjectfllS://" & ServerName & "/W3SVC/" & Siteindex)
Debug.Print Site.LogOdbcDataSource
Debug.Print Site.LogOdbcPassword
Debug.Print Site.LogOdbcTableName
Debug.Print Site.LogOdbcUserName
Установка параметров журнала ODBC с помощью Visual Basic
Для модификации существующей конфигурации журнала ODBC воспользуйтесь кодом
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long.
Dim ODBC_DSN As String
Dim DBPassword As String
Dim TableName As String
Dim UserName As String
ODBC_DSN = "Name_of_Data_Source_to_Use_With_ODBC_Logging'’
DBPassword = ” DB_Access_Credent lai"
TableName = " Logging_Table_in_DB"
UserName = " DB_Access_Credential"
ServerName = " IIS_Server_Name"
Siteindex = Site_lndex_Value
Set Site = GetObjectfllS://" & ServerName & "/W3SVC/" & Siteindex)
Site.LogOdbcDataSource = ODBC_DSN
Site.LogOdbcPassword = DBPassword
Site.LogOdbcTableName = TableName
Site.LogOdbcUserName = UserName
Site.Setinfo
Программное управление узлом
Одно из самых замечательных свойств ADSI IIS — это возможность программного создания, удаления и управления узлами WWW, FTP, Simple Mail Transport Protocol (SMTP) и Network News Transfer Protocol (NNTP)..'
Многие компании для обмена внутрикорпоративной информацией создают дружественный Web-интерфейс, который знаком практически всем пользователям ПК. При отсутствии программных методов администрирования подобных систем, управляющий персонал практически все время будет уделять управлению такой средой.
В следующих разделах рассматривается перечисление, создание и манипулирование узлами сервера IIS для служб WWW и FTP.
Перечисление виртуальных узлов WWW на сервере ITS с помощью Visual Basic
Прежде чем манипулировать узлом, необходимо иметь представление обо всех узлах, созданных на выбранном сервере. Для этого применяется уже знакомая функция перечисления с модифицированной строкой связывания:
Dim Parent As IADs
Dim Child As IADs"
Dim ServerName As String
Dim RetVal As String
ServerName = " IIS_Server_Name"
Set Parent = GetObject("IIS://" & ServerName & "/W3SVC")
For Each Child In Parent
If IsNumeric(Child.Name) Then
. RetVal = Child.Name
Debug.Print RetVal
End If•
Next
После запуска приведенного фрагмента кода появится список имен узлов, но не в таком виде, как в окне Internet'Service Manager. Вы увидите следующее: Filters, Info, а затем ряд чисел. Этот ряд представляет собой программный идентификатор узла на выбранном сервере. Эти имена понятны серверу, но совсем непонятны пользователю.
Для просмотра результатов перечисления “в нормальном виде” используйте свойство ServerCoirment интерфейса IlsWebServer следующим образом:■
Dim Parent As IADs
Dim Child As IADs
Dim ServerName As String
ServerName = " IIS_Server_Name"
Set Parent = GetObject("IIS://" & ServerName & "/W3SVC")
For Each Child In Parent.
If IsNumeric(Child.Name) Then
Debug.Print "ProgrammaticlD: " & Child.Name & vbTab _
& "Friendly Name: " & Child.Servercomment End If
Next
Примечание
“Дружественное ” имя нельзя использовать для программной идентификации объекта, поскольку можно создать два идентичных узла с одинаковыми “дружественными” именами.
Перечисление виртуальных узлов FTP на сервере IIS с помощью Visual Basic
Для отображения целых значений, а также значений, ассоциированных с каждым значением свойства servercomment всех определенных в метабазе узлов FTP, используйте следующий код:
Dim Parent As IADs Dim Child As IADs Dim ServerName As String■
ServerName = " IIS_Server_Name"
Set Parent = GetObject("IIS://" & ServerName & "/MSFTPSVC") For Each Child In Parent
If IsNumeric(Child.Name) Then Debug.Print Child.Name & vbTab & " - " & vbTab _ & Child.ServerComment
End If Next
Совет
Обратите внимание, что код перечисления улов WWW и FTP практически идентичен, за исключением имени контейнера, определяемого в строке связывания. Данный код можно использовать для каждой службы сервера IIS, необходимо лишь изменить соответствующее имя контейнера (WJ^VC, MSFTPSVC, NNTPSVC или SmtpSvc).
Поиск числового индекса для узлов на основе свойства ServerComment с помощью Visual Basic
Узлы в основном идентифицируются по имени, а не по числовому индексу, что, естественно, ставит в тупик пользователя, манипулирующего узлом. Чтобы упростить это, используйте следующий код Visual Basic для возврата значений индекса узлов, у которых установлено значение свойства ServerComment:
Dim Sites As IADs'
Dim Site As IADs
Dim SearchTerm As String
Dim Counter As Integer
Dim Indexvalue As Long
Dim ServerName As String
SearchTerm = " Site_Description_String"
ServerName = " IIS_Server_Name"
Counter = 0
Set Sites = GetObject("IIS:\\" i ServerName & "\W3SVC") For Each Site In Sites
If IsNumeric(Site.Name) Then
If LCase(Site.ServerComment) = LCase(SearchTerm) Then Counter = Counter + 1 Indexvalue = Site.Name
End If
End If
Next
Select Case Counter
Case 0
Debug.Print "The referenced site could not be found. , Please enter a new search term."
Case 1
Debug.Print "The index value for site 1" & SearchTerm & "' _ is " & Indexvaltre
Case Is > 1
Debug.Print "More than one site uses the value '" & SearchTerm & "' or the 6" ; "Servercomments property. Assure all values _ are unique before continuing."
End Select■
Создание нового Web-узла с помощью Visual Basic
Используя программное администрирование 11S, разработчик может написать сценарий инсталляции узла, который бы позволял быстро и просто создавать узел, устанавливать необходимые параметры безопасности и конфигурации и даже автоматически запускать этот вновь созданный узел. Такой способ создания узла особенно удобен при кластерной организации Web-сервера.
В предыдущем разделе упоминалось, что узлы идентифицируются не с помощью “дружественного” имени (как в Internet Service Manager), а с помощью числового индекса.
В приведенном фрагменте кода Visual Basic создается новый узел (виртуальный Web-сервер) на сервере 11S.
On Error Resume Next
Dim Parent As lADsContainer
Dim Child As IADs
Dim NewSite As IADs
Dim NewRoot As IADs .
Dim ServerName As String
Dim Index As Long
Dim SiteName As String
Dim SitePath As String
SiteName = " Friendly_Site_Name"
ServerName = " TTS_Server_№me"
SitePath = " Site_Path”
Set Parent = GetObject("IIS://" & ServerName & "/W3SVC")
For Each Child In Parent
If IsNumeric(Child.Name) Then
If Index < Child.Name Then
Index = Child.Name
End If
End If
Next
Index = Index + 1
Set NewSite = Parent.Create("IlsWebServer", Index)
NewSite.Servercomment = SiteName
NewSite. Setlnf о
.Set NewRoot = NewSite .Create ( "IIsWebVirtualDir", "Root")■
NewRoot.Path = SitePath•
NewRoot.Setinfo
С помощью приведенного кода создается узел и корневой виртуальный каталог.
Совет
Приведенный код превосходно работает для базовой конфигурации, но довольно часто на один адрес IP устанавливается несколько узлов. Лучше всего это выполнять с помощью заголовков или выбора альтернативного порта TCP, используя свойство ServerBindings.
Манипуляция свойствами служб WWW и FTP сервера IIS более подробно рассматривается в главах 9, “Программное управление Web-узлом ”, и 10, “Программное управление FTP-узлом ”.
Создание нового FTP-узла с помощью Visual Basic
В следующем фрагменте кода Visual Basic можно определить альтернативный адрес IP и порт TCP, удалив символ примечания (апостроф) и введя соответствующие значения этих параметров. Чтобы связать узел с любым неиспользуемым адресом IP, установите значение этого параметра равным пустой строке.
Dim Parent As ZADsContainer Dim Child As IADs Dim NewSite As IADs Dim NewRoot As IADs Dim ServerName As String Dim Index As Long Dim SiteName As String Dim SitePath As String Dim SitelPAddress As String Dim SiteTCPPort As Long
SiteName = " Friendly_Site_Name"
ServerName = " IIS_Server_Name"
SitePath = " Site_Path” SitelPAddress = " SiteTCPPort = "21" 'SitelPAddress = "xxx.xxx.xxx.xxx" 1SiteTCPPort = "TCP_Port_for_Server" Set Parent = GetObject("IIS://" & ServerName & "/MSFTPSVC") For Each Child In Parent
If IsNumeric(Child.Name) Then
If Index < Child.Name Then■
Index = Child.Name End If End If Next Index = Index + 1 Set NewSite = Parent.Create("IIsFTPServer", Index) NewSite. ServerConiment = SiteName
NewSite.ServerBindings = Array(SitelPAddress & ":" _
& SiteTCPPort & ":")■
NewSite.Setinfo Set NewRoot = NewSite.Create("IIsFTPVirtualDir", "Root")■
NewRoot.Path = SitePath NewRoot.SetInfo■
Удаление узла на основе свойства Servercomment с помощью Visual Basic
При удалении узла важно точно знать, что действительно удаляется. Одна из основных сложностей программного администрирования IIS — это использование числового индекса вместо более понятного имени узла. Можно создать несколько узлов с одинаковыми именами, но их индексы всегда будут различаться. Для идентификации узла можно использовать значение свойства ServerComment.
В приведенном фрагменте кода Visual Basic используется “дружественное" имя узла, обнаруживается соответствующее ему индексное значение, а затем узел удаляется из метабазы.
Dim Sites As IADs
Dim Site As IADs
Dim SearchTerm As String
Dim Counter As Integer
Dim IndexValue As Long
Dim ServerName As String
SearchTerm = " Site_Description_String"
ServerName = " IIS_Server_Name"
Counter = 0
Set Sites = GetObject ("IIS:\\" & ServerName & "\W3SVC") For Each Site In Sites
If IsNumeric(Site.Name) Then
If Lease(Site.Servercomment) = Lease(SearchTerm) Then
' Counter = Counter + 1
, IndexValue = Site.Name
End If
End If
Next.
Select Case Counter
Case 0
Debug.Print "The referenced site could not be found. _
Please enter a new search term."
Case 1
Call Sites.Delete("IlsWebServer", IndexValue)
Set Sites = Nothing
Debug.Print "Site '" & SearchTerm & "' was deleted successfully."
Case Is > 1
Debug.Print "More than one site uses the value "' & SearchTerm _
’” or the " ; "Servercomments property. Assure all values _ are unique before continuing."
End Select
В этом коде проверяется уникальность значения свойства Servercomment перед операцией удаления.
Внимание
Если вы выбрали значение поля servercomment в качестве идентификатора ума, проверьте, содержат ли все узлы сервера уникальные значения этого поля.
Удаление FTP-узла с помощью Visual Basic
Изменив параметры строки связывания, можно программно удалить FTP-узел. Для этого используйте следующий код: Dim Sites As IADs Dim Site As IADs Dim SearchTerm As String Dim Counter As Integer Dim IndexValue As Long Dim ServerName As String
SearchTerm = " Site_Description_String" ServerName = " IIS_Server_Name” Counter = 0
Set Sites = GetObject("IIS:\\" & ServerName & "\MSFTPSVC") For Each Site In Sites
If IsNumeric(Site.Name) Then
If Lease (Site. ServerCornment) = Lease (SearchTerm) Then Counter = Counter + 1 IndexValue = Site.Name End If End If Next Select Case Counter
Case 0
Debug.Print "The referenced site could not be found. _
Please enter a new search term."
Case 1
Call Sites.Delete("IlsWebServer", IndexValue)
Set Sites = Nothing
Debug.Print "Site '" & SearchTerm & "' was deleted successfully." Case Is > 1
Debug.Print "More than one site uses the value '" & SearchTerm _
"' or the " ; "Servercomments property. Assure all values _
are unique before continuing."
End Select
Создание нового виртуального каталога с помощью Visual Basic
При создании нового узла необходимо организовать корневой виртуальный каталог, установив значение свойства Path. Если эту операцию проигнорировать, узлом нельзя будет управлять с помощью ММС или программными методами. Кроме корневого виртуального каталога, можно создать виртуальные каталоги клиентов, например http://siten.ame/virtual_directory. Эти каталоги могут располагаться в любом месте файловой системы. В отличие от виртуальных узлов, виртуальные каталоги используют для программной идентификации “понятное” имя.
Для создания нового виртуального каталога на Web-узле по умолчанию используйте следующий код Visual Basic:
Dim Parent as IADs
Dim NewVDir As IADs
Dim ServerName As String
Dim VDirPath As String
Dim VDirName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
VDirPath = " Path_for_New_Virtual_Directory"
VDirName = " Name_For_Virtual_Directory"
Index = Site_Index_Integer
Set Parent = GetObject("IIS://" & ServerName & "/W3SVC/" & Index _
& "/ROOT")
Set NewVDir = Parent.Create("IIsWebVirtualDir", VDirName)■
NewVDir.SetInfo
NewVDir.Path = VDirPath.
NewVDir.Setinfo
Создание нового виртуального каталога FTP с помощью Visual Basic
Для создания нового виртуального каталога на FTP-узле воспользуйтесь кодом
Dim Parent as IADs
Dim NewVDir As IADs
Dim ServerName As String
Dim VDirPath As String
Dim VDirName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
VDirPath = " Path_for_New Virtual_Directory"
VDirName = "Name_For_Virtual_Directory" Index = Site_Index_Integer
Set Parent = GetObject("IIS://" & ServerName & "/MSFTPSVC/" 4 Index & "/ROOT")
Set NewVDir = Parent.Create("IIsFTPVirtualDir", VDirName) NewVDir.Set Info
NewVDir. Path = VDirPath'
NewVDir. Setinfo'
Удаление существующего виртуального каталога с помощью Visual Basic
В некоторых случаях необходимо удалить существующий виртуальный каталог. Для этого используйте метод Delete интерфейса lADsContainer. При этом из метабазы удаляется запись о виртуальном каталоге.
Для удаления существующего виртуального каталога используйте следующий код:
Dim Parent As lADsContainer
Dim ServerName As String
Dim VDirName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
VDirName = "Name_For_Virtual_Directory”
Index = Site_Index_Value
Set Parent = GetObject("IIS://" & ServerName & "/W3SVC/" _
Index & "/ROOT") .
Call Parent.Delete("IIsWebVirtualDir", VDirName),
Удаление существующего виртуального каталога FTP с помощью Visual Basic
Для удаления существующего виртуального каталога РТР используйте код
Dim Parent As lADsContainer
Dim ServerName As String
Dim VDirName As String’
Dim Index As Long
ServerName = ’’11 S_Server_Name"
VDirName = ”Name_For_Virtual_Directory"
Index = Site_Index_Value
Set Parent = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _ 4 index & "/ROOT")
Call Parent.Delete("IIsFTPVirtualDir", VDirName)
Управление каталогами и файлами Web с помощью Visual Basic
В отличие от записей виртуального каталога, папки и файлы в файловой системе с метабазой автоматически не синхронизируются. Для связывания каталога, который существует в файловой системе ниже виртуального каталога Web-узла, вначале необходимо создать запись в метабазе. Это действие на первый взгляд может показаться странным, но помните, что иерархия метабазы IIS поддерживает наследственность, которая позволяет определять набор свойств для высшего уровня (например, виртуальный каталог или каталог файловой системы), а затем передавать свойство всем дочерним (нижним) узлам дерева. Следовательно, необходимо определить запись в метабазе только для каждой “отправной точки”, из которой наследуются значения свойства.
Создавая запись в метабазе для каждого каталога или файла, которому необходимы уникальные разрешения или установка значения свойства, можно связать ресурс и управлять его свойствами.
Чтобы просмотреть реально хранимые данные в метабазе, используйте следующий код Visual Basic для перечисления записей виртуального каталога:
Dim VirtualDirectory As IADs,
Dim ServerName As String
Dim Index As Long
ServerName = " ITS_Server_Wame"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" _
Index & "/ROOT")
For Each Item In VirtualDirectory
Debug.Print Item.Name
Next
Примечание
Приведенный код отображает все записи в корневом виртуальном каталоге Web-узла. Если сравнить результат Internet Service Manager и этот код, то можно найти несоответствия. Если вы попытаетесь связать файл default.asp, а он не имеет записи в метабазе, операция завершится неудачно. Чтобы устранить эту ошибку, необходимо поместить записи в метабазу для объектов файловой системы, которые должны поддерживать различные дочерние свойства из родительского объекта.
Добавление записи в метабазу для каталога файловой системы
Перечисляя содержимое родительского контейнера, можно заместить, что он содержит запись для определенного каталога файловой системы.
Для внесения изменений в дочерние свойства каталога Web используйте следующий код Visual Basic:
Dim VirtualDirectory As IADs
Dim WebDir As IADs
Dim ServerName As String
Dim FileName As String
Dim Index As Long
Dim VirtualDirectoryName As String
ServerName = " IIS_Server_Name"
DirName = "Directory_Name_To_Enter”
Index = Site_Index
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" _
Index & "/ROOT")
Set WebDir = VirtualDirectory.Create("IIsWebDirectory", DirName) WebDir.Setinfo
Добавление записи в метабазу для файла файловой системы
Кроме определения уникальных свойств для записи виртуального каталога или каталога Web, можно также установить набор уникальных свойств на уровне файла.
Чтобы добавить новую запись в метабазу для индивидуального файла Web в файловой системе, используйте следующий код Visual Basic:
Dim VirtualDirectory As IADs
Dim WebFile As IADs
Dim ServerName As String
Dim FileName As String
Dim Index As Long
Dim VirtualDirectoryName As String
ServerName = ’’ IIS_Server_Name’'
FileName = " File_Name_To_Enter"
Index = Site_Index
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" i Index i "/ROOT")
Set WebFile = VirtualDirectory.Create("IIsWebFile", FileName)
WebFile. Setinfo
Примечание
При перечислении содержимого виртуального каталога после внесения изменений для индивидуального каталогов или файлов можно заметить, что запись создается для только что указанного файла. Это позволяет связать файл и манипулировать им, как и другим объектом в пространстве имен.
Программное оперирование узлом
Используя ADSI, можно просмотреть состояние узла, чтобы проверить необходимость его запуска. Эта возможность чрезвычайно удобна в случае, если вы хотите использовать службу или приложение для мониторинга узла или если необходимо перезапустить узел после внесения изменений в метабазу.
Просмотр состояния узла с помощью Visual Basic
Чтобы просмотреть состояние узла, узнайте значение свойства Serverstate. Возвращаемое целое значение описывает состояние узла.
Возвращаемый код
1
Состояние
Starting
2
Started
3
Stopping
4
Stopped
5
6
Pausing
Paused
7
Continuing
Для просмотра состояния узла IIS используйте следующий код:
Dim Site As IADs .'
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name"■
Index = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index) Select Case Site. Serverstate
Case 1
Debug.Print "Starting"
Case 2
Debug.Print "Started"
Case 3
Debug.Print "Stopping"
Case 4
Debug.Print "Stopped" Case 5
Debug.Print "Pausing"
Case 6
Debug.Print "Paused"
Case 7
Debug.Print "Continuing" End Select
Примечание
Тем пользователям, кто знаком с Windows Load Balancing Service (WLBS), известно, что один из основных недостатков этого продукта — невозможность отслеживания запущенных служб Windows NT Server 4.0. При запуске Windows NT Server 4.0 служба WLBS будет заново собирать кластер после ошибки, но не сможет определить состояние службы или узла. Используя приведенный выше код, можно отслеживать целостность W3SVC и узла, а затем заново собирать кластер, если отслеживаемый узел находится в любом состоянии, кроме starting или started.
Запуск узла с помощью Visual Basic
После создания нового узла IIS и настройки всех необходимых свойств можно попробовать программно запустить его. Эта операция выполняется с помошью вызова метода start соответствующего объекта узла, как показано в приведенном ниже фрагменте кода.
Dim Site As IADs.
Dim ServerName As String
Dim Index As Long
ServerName = "IIS Server_Name"
Index = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index)'
If Site.Serverstate = 4 Or Site.ServerState = 3 Then
Site.Start
Debug.Print "Request? to start site " & Site.Servercomment _
& " was issued."
End If
Совет
Для запуска узла FTP, SMTP или NNTP измените имя службы IIS в строке связывания.
Остановка узла с помощью Visual Basic
Для остановки узла используйте метод stop, как показано в приведенном ниже фрагменте кода.
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
ServerName = "IIS_Server_Name"'
Index = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index)
If Site.Serverstate = 2 Or Site.Serverstate = 1 Then
Site.Stop
Debug.Print "Request to stop site " & Site.Servercomment _
& " was issued."
End If
Приостановка узла с помощью Visual Basic
Для временной приостановки работы узла используйте метод Pause, как показано в следующем фрагменте кода Visual Basic. Обратите внимание, что после выполнения этого кода сервер не будет создавать новых соединений, а существующие останутся без изменений.
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" 4 Index)
If Site.Serverstate = 1 Or Site.Serverstate = 2 Then
Site.Pause
Debug.Print "Request to pause site " & Site.Servercomment _
4 " was issued."
End If
Возобновление работы узла с помощью Visual Basic
Для возобновления работы приостановленного узла используйте метод Continue, как показано в приведенном ниже фрагменте кода.
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
ServerName - " IIS_Server_Name"
Index = Site_Index_Value
Set Site = GetObject("IIS ://" & ServerName & "/W3SVC/" & Index)
If Site. ServerState - 6 Or Si te . Serverstate = 5' Then Site.Pause
Debug.Print "Request to continue paused site " _
& Site.Servercomment & " was issued."
End If
Создание модуля класса
IIsSiteManagement•
В этом разделе вам предлагается начать создание приложения COM-сервера 11s- Admin.DLL, которое будет продолжено в остальных главах части 111, “Исследование провайдеров ADS1: 11S”.
Совет
Код этого проекта, а также скомпилированную его версию можно найти по адресу: http: //wwvi. wiiliamspublishing. com.
Упражнение 8Л. Создание iisAdmin.DLL: функции управления узлом
Откройте новый проект Visual Basic ActiveX DLL.
Установите ссылку на библиотеку Active DS Type Library, используя диалоговое окно References, доступ к которому осуществляется с помощью команды Projects References.
Переименуйте новый проект в IIsAdmin
Переименуйте модуль класса в IIsSiteManagement.
Введите приведенный код в раздел общих объявлений модуля класса.
Public Function Backupoperations(ByVai Targetcomputer As String, _ ByVai Action As String, Optional ByVai BackupName As String) _ As Variant On Error Resume Next Dim IlsComputer As IADs Set IlsComputer = GetObject("IIS://" & Targetcomputer) Select Case UCase(Action)
Case "BACKUP"
Dim Flags As Long
Flags = (MD_BACKUP_SAVE_FIRST Or MD_BACKUP_FORCE_BACKUP) IlsComputer.Backup BackupName, MD_BACKUP_NEXT_VERSION, Flags If Err.Number = 0 Then Backupoperations = True
Case "ENUMERATE"
Dim Version, Index, TermCond As Integer
Dim Location As Variant
Dim UTCDate As Variant
Dim NewElement () As Variant
Dim i As Long
Do While TermCond о 1
IlsComputer.EnumBackups ",Index,Version,Location,UTCDate" If Err.Number <> 0 Then
Exit Do
End If■
i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Location & vbTab & Version & vbTab & UTCDate •Index = Index + 1 Err.Number = 0
Loop
Backupoperations = NewElement
Case "RESTORE"
Call IlsComputer.Restore(BackupName, _ MD_BACKUP_HIGHEST_VERSION, 0) If Err.Number = 0 Then Backupoperations = True Case "DELETE"
Call IlsComputer.DeleteBackup(BackupName, _ MD_BA<*KUP_HIGHEST_VERSION) If Err.Number = 0 Then Backupoperations = True End Select End Function
Public Function MaxBandwidth(ByVai Targetcomputer As String, _
ByVai Action As String, Optional ByVai NewThrottleValue _
As Long) As Variant
Dim IlsComputer As IADs
Set IlsComputer = GetObject("IIS://" & Targetcomputer)
Select Case UCase(Action)
Case "QUERY"
MaxBandwidth = IlsComputer.MaxBandwidth
Case "SET"
IlsComputer.MaxBandwidth = NewThrottleValue
IlsComputer.Setinfo
If Err.Number = 0 Then MaxBandwidth = True
End Select
End Function
Public Function MIMETypeManagement(ByVai Targetcomputer As _ String, ByVai Action As String, Optional ByVai MIMEExtension _ As String, Optional ByVai MIMEType As String) As Variant On Error Resume Next Dim IlsComputer As IADs Set IlsComputer = GetObject("IIS://" & Targetcomputer & "/MimeMap") Select Case UCase(Action)
. Case "ENUMERATE"
Dim MimeMapping As Variant
Dim NewElement() As Variant
Dim i As Long
For Each MimeMapping In IlsComputer.MimeMap i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = MimeMapping.Extension & vbTab _ & MimeMapping.MIMEType
Next
MIMETypeManagement = NewElement
Case "ADD"
If MIMEType <> " And MIMEExtension <>" Then Dim NewMimeMapping As Variant NewMimeMapping = IlsComputer.GetEx("MimeMap") i = UBound(NewMimeMapping) + 1 ReDim Preserve NewMimeMapping(i) Set NewMimeMapping(i) = CreateObject("MimeMap") NewMimeMapping(i).MIMEType = MIMEType NewMimeMapping(i).Extension = MIMEExtension IlsComputer.PutEx ADS_PROPERTY_UPDATE, "MimeMap", _ NewMimeMapping Err.Number = 0 IlsComputer.SetInfо If Err.Number = 0 Then MIMETypeManagement = True
Else
MIMETypeManagement = False End If
Case "REMOVE"
If MIMEExtension <> "" Then Dim MapToDelete As String Dim Mimeitem As Variant NewMimeMapping = IlsComputer.MimeMap For Each MimeMapping In IlsComputer.MimeMap If MimeMapping.Extension <> MIMEExtension Then ReDim Preserve NewMimeMapping(i) Set NewMimeMapping(i) = CreateObject("MimeMap") NewMimeMapping(i).MIMEType = MimeMapping.MIMEType NewMimeMapping(i).Extension = MimeMapping.Extension i = i + 1
End If Next IlsComputer.PutEx ADS_PROPERTY_UPDATE, "MimeMap", _ NewMimeMapping Err.Number = 0 IlsComputer.SetInfo
If Err.Number = 0 Then MIMETypeManagement = True Else
MIMETypeManagement = False End If
End Select End Function
Public Function SiteLogging(Byval Targetcomputer As String, _
Optional ByVai NewValue) As Variant.
Dim Site As IADs'
Dim Item As Variant
Select Case UCase(IlsService)
Case "WWW"
Set Site = GetObject("IIS://" & Targetcomputer 4 "/W3SVC/" _
4 Siteindex)
Case "FTP"
Set Site = GetObject("IIS://" & Targetcomputer 4 "/MSFTPSVC/
4 Siteindex)
Case "SMTP"
Set Site = GetObject("IIS://" 4 Targetcomputer 4 "/SMTPSVC/"
4 Siteindex)
Case "NNTP"
Set Site = GetObject("IIS://" 4 Targetcomputer 4 "/NNTPSVC/"
ByVai IlsService As String, ByVai Siteindex As Integer,
ByVai Action As String, ByVai Loggingproperty As String,
& Siteindex)
End Select
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Loggingproperty) Case "LOGGINGENABLED"
SiteLogging = Site.LogType Case "LOGTYPE"
Dim Log As IADs
Set Log = GetObject("IIS://" & Targetcomputer 4 "/logging") For Each Item In Log
If Site.LogPluginCLSID = Item.LogModulelD Then SiteLogging = Item.Name
End If Next Case "LOGFILEPERIOD" SiteLogging = Site.LogFilePeriod Case "TRUNCATESIZE"
SiteLogging = Site.LogFileTruncateSize End Select Case "SET"
Select Case UCase(Loggingproperty) Case "LOGGINGENABLED"
Site.LogType = NewValue Site.Setinfo Case "LOGTYPE"
Set Log = GetObject("IIS://" & Targetcomputer 4 "/logging") Dim NewLogFormatName As String Select Case UCase(NewValue)
Case "NCSA"
NewValue = "NCSA Common Log File Format" Case "ODBC"
NewValue = "ODBC Logging"
Case "IIS"
NewValue = "Microsoft IIS Log File Format" Case "W3C"
NewValue = "W3C Extended Log File Format" End Select For Each Item In Log If Item.Name = NewValue Then
Site.LogPluginCLSID = Item.LogModulelD Site.Setlnfо End If Next
Case "LOGFILEPERIOD"
Site.LogFilePeriod = NewValue
Site.Set Infо
Case "TRUNCATESIZE"
Site.LogFilePeriod = 0
Site.LogFileTruncateSize = NewValue
Site.Setinfo
End Select
If Err.Number = 0 Then SiteLogging = True End Select
End Function
Public Function ExtendedLogProperty(ByVai Targetcomputer As _ String, ByVai IlsService As String, ByVai Siteindex As Integer, ByVai Action As String, ByVai Loggingproperty As String, _ Optional SyVal NewValue) As Variant
Dim Site As IADs
Select Case UCase(IlsService)
Case "WWW"
Set Site = GetObject("IIS://" & Targetcomputer & "/W3SVC/"
Siteindex)
Case "FTP"
Set Site = GetObject("IIS://" & Targetcomputer & "/MSFTPSVC/" & Siteindex)
Case "SMTP"
Set Site = GetObject("IIS://" & Targetcomputer & "/SMTPSVC/"
Siteindex)
Case "NNTP"
Set Site = GetObject("IIS://" & Targetcomputer & "/NNTPSVC/" & Siteindex)
End Select
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(LoggingProperty)
Case "DATE"
ExtendedLogProperty = Site.LogExtFileDate
Case "TIME"
ExtendedLogProperty = Site.LogExtFileTime
Case "CLIENTIP"
ExtendedLogProperty = Site.LogExtFileClientlp
Case "USERNAME"
ExtendedLogProperty - Site.LogExtFileUserName
Case "SERVICENAME"
ExtendedLogProperty = Site.LogExtFileSiteName
Case "SERVERNAME"
ExtendedLogProperty = Site.LogExtFileComputerName
Case "SERVERIP"
ExtendedLogProperty = Site.LogExtFileServerlp
Case "SERVERPORT"
ExtendedLogProperty = Site.LogExtFileServerPort
Case "METHOD"
ExtendedLogPropertySite.LogExtFileMethod
Case "URISTEM"
ExtendedLogProperty = Site.LogExtFileUriStem
Case "URIQUERY"
ExtendedLogProperty = Site.LogExtFileUriQuery
Case "HTTPSTATUS"
ExtendedLogProperty = Site.LogExtFileHttpStatus
Case "WIN32STATUS"
ExtendedLogProperty = Site.LogExtFileWin32Status Case "BYTESSENT"
ExtendedLogProperty = Site.LogExtFileBytesSent
Case "BYTESRECEIVED"
ExtendedLogProperty = Site.LogExtFileBytesRecv
Case "TIMETAKEN"
ExtendedLogProperty = Site.LogExtFileTimeTaken
Case "PROTOCOLVERSION"
ExtendedLogProperty = Site.LogExtFileProtocolVersion
Case "USERAGENT"
ExtendedLogProperty = Site.LogExtFileUserAgent
Case "COOKIE"
ExtendedLogProperty = Site.LogExtFileCookie
Case "REFERRER"
ExtendedLogProperty = Site.LogExtFileReferer
End Select
Case "SET"
Select Case UCase(Loggingproperty)
Case "DATE"
Site.LogExtFileDate = NewValue
Site.Setinfo
Case "TIME"■
Site.LogExtFileTime = NewValue
Site.Setinfo
Case "CLIENTIP"
Site.LogExtFileClientlp = NewValue
Site.Setinfo
Case "USERNAME"
Site.LogExtFileUserName = NewValue
Site.Setlnfo
Case "SERVICENAME"
Site.LogExtFileSiteName = NewValue
Site.Setlnfo
Case "SERVERNAME"
Site.LogExtFileComputerName = NewValue
Site.Setlnfo
Case "SERVERIP"
Site.LogExtFileServerlp = NewValue
Site.Setlnfo
Case "SERVERPORT"
Site.LogExtFileServerPort = NewValue
Site.Setlnfo
Case "METHOD"
Site.LogExtFileMethod = NewValue
Site.Setlnfo
Case "URISTEM"
Site.LogExtFileUriStem = NewValue
Site.Setlnfo
Case "URIQUERY"
Site.LogExtFileUriQuery = NewValue
Site.Setlnfo
Case "HTTPSTATUS"
Site.LogExtFileHttpStatus = NewValue
Site.Setlnfo
Case "WIN32STATUS"
Site.LogExtFileWin32Status = NewValue
Site.Setlnfo
Case "BYTESSENT"
Site.LogExtFileBytesSent = NewValue
Site.Setlnfo
case "BYTESRECEIVED"
Site.LogExtFileBytesRecv = NewValue
Site.Setlnfo
Case "TIMETAKEN"
Site.LogExtFileTimeTaken = NewValue
Site.Setinfo
Case "PROTOCOLVERSION"
Site.LogExtFileProtocolVersion = NewValue Site.Setinfo
Case "USERAGENT"
Site.LogExtFileUserAgent = NewValue Site.Setinfo
Case "COOKIE"
Site.LogExtFileCookie = NewValue Site.Setinfo
Case "REFERRER"
Site.LogExtFileReferer = NewValue Site.Setinfo
End Select
If Err.Number = 0 Then ExtendedLogProperty = True End Select
End Function
Public Function ODBCLogging(ByVai Targetcomputer As String, _
ByVai IlsService As String, ByVai Siteindex As Integer, ByVai _ Action As String, ByVai Loggingproperty As String, Optional _ ByVai NewValue) As Variant
Dim Site As IADs
Select Case UCase(IlsService)
Case "WWW"
Set Site = GetObject("IIS://" & Targetcomputer & "/W3SVC/" _
Siteindex)
Case "FTP"
Set Site = GetObject("IIS://" & Targetcomputer & "/MSFTPSVC/" s Siteindex)
Case "SMTP"
Set Site = GetObject("IIS://" & Targetcomputer & "/SMTPSVC/" s Siteindex)
Case "NNTP"
Set Site = GetObject("IIS://" & Targetcomputer & "/NNTPSVC/" & Siteindex)
End Select
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Loggingproperty)
Case "DSN"
ODBCLogging = Site.LogOdbcDataSource
Case "PASSWORD"
ODBCLogging = Site.LogOdbcPassword
Case "USERNAME"
ODBCLogging = Site.LogOdbcTableName
Case "TABLENAME"
ODBCLogging = Site.LogOdbcUserName
End Select
Case "SET"
Select Case UCase(Loggingproperty)
Case "DSN"
Site.LogOdbcDataSource = NewValue Site.Setinfo
Case "PASSWORD"
Site.LogOdbcPassword = NewValue Site.Setinfo
Case "USERNAME"
Site.LogOdbcTableName = NewValue
Site.Setinfo
Case "TABLENAME"
Site.LogOdbcUserName = NewValue
Site.Setinfo
End Select
If Err.Number = 0 Then ODBCLogging = True End Select
End Function
Public Function EnumerateSites(ByVai Targetcomputer As String, _ ByVai IlsService As String) As Variant
On Error Resume Next
Dim Parent As IADs
Dim Child As IADs
Dim NewElement() As Variant
Dim i As Long
Select Case UCase(IlsService)
Case "WWW"
Set Parent = GetObject("IIS://" & Targetcomputer & "/W3SVC") Case "FTP"
Set Parent = GetObject("IIS://" & Targetcomputer & "/MSFTPSVC") Case "SMTP"
Set Parent = GetObject("IIS://" & Targetcomputer & "/SMTPSVC") Case "NNTP"
Set Parent = GetObject("IIS://" & Targetcomputer & "/NNTPSVC") End Select For Each Child In Parent
If IsNumeric(Child.Name) Then i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Child.Name & vbTab & Child.Servercomment End If
Next
EnumerateSites = NewElement
End Function
Public Function CreateSite(ByVai Targetcomputer As String, _
ByVai IlsService As String, ByVai SiteName As String, _
ByVai SitePath As String) As Boolean
Dim Parent As IADs .'
Dim Child As Variant
Dim NewSite As IADs Dim NewRoot As IADs Dim Index As Integer Select Case UCase(IlsService)
Case "WWW"
Set Parent = GetObject("IIS://" & Targetcomputer & "/W3SVC") Case "FTP"
Set Parent = GetObject("IIS://" & Targetcomputer & "/MSFTPSVC") Case "SMTP"
Set Parent = GetObject("IIS://" & Targetcomputer & "/SMTPSVC") Case "NNTP"
Set Parent = GetObject("IIS://" & Targetcomputer & "/NNTPSVC") End Select For Each Child In Parent
If IsNumeric(Child.Name) Then If Index < Child.Name Then Index = ChiId.Name End If
End If Next
Index = Index + 1 Select Case UCase(IIsService) Case "WWW"
Set NewSite = Parent.Create("IlsWebServer", Index) NewSite.Servercomment = SiteName NewSite.SetInfo Set NewRoot = NewSite.Create("IIsWebVirtualDir", "Root") NewRoot.Path = SitePath Err.Number = 0 NewRoot.Setinfo Case "FTP"
Set NewSite = Parent.Create("IIsFTPServer", Index) NewSite.Servercomment = SiteName NewSite.SetInfо Set NewRoot = NewSite.Create("IIsFTPVirtualDir", "Root") NewRoot.Path = SitePath Err.Number = 0 NewRoot.Set Info End Select If Err.Number = 0 Then CreateSite = True End Function
Public Function DeleteSite(ByVai Targetcomputer As String, _ ByVai IlsService As String, ByVai SiteName As String) As Boolean Dim Parent As IADs Dim Child As Variant Dim NewSite As IADs Dim Counter As Integer Dim Indexvalue As Long Select Case UCase(IlsService) Case "WWW"
Set Parent = GetObject("IIS://" & Targetcomputer & "/W3SVC") Case "FTP"
Set Parent = GetObject("IIS://" & Targetcomputer & "/MSFTPSVC") End Select Counter = 0 For Each Child In Parent ■ If IsNumeric(Child.Name) Then
If LCase(Child.Servercomment) = LCase(SiteName) Then Counter = Counter + 1 Indexvalue = Child.Name End If End If Next If Counter = 1 Then Select Case UCase(IlsService) Case "WWW" Call Parent.Delete("IlsWebServer", Indexvalue) Case "FTP"
Call Parent.Delete("IIsFTPServer", Indexvalue) End Select Set Parent = Nothing End If If Err.Number = 0 Then DeleteSite = True End Function
Public Function EnumerateDirectory(ByVai Targetcomputer As String, _ ByVai IlsService As String, ByVai Siteindex As Integer, _ ByVai RelativePath As String) As Variant On Error Resume Next Dim Parent As IADs
Dim Child As Variant
Dim NewElement() As Variant
Dim i As Long
Select Case UCase(IlsService)
Case "WWW"
Set Parent = GetObject("IIS://" 4 Targetcomputer 4 "/W3SVC/"
4 Siteindex 4 "/ROOT" 4 RelativePath)
Case "FTP"
Set Parent = GetObject("IIS://" 4 Targetcomputer _
4 "/MSFTPSVC/" 4 Siteindex 4 "/ROOT" 4 RelativePath) Case "SMTP"
Set Parent = GetObject("IIS://" 4 Targetcomputer _
4 "/SMTPSVC/" 4 Siteindex 4 "/ROOT" 4 RelativePath) Case "NNTP"
Set Parent = GetObjectC'IIS://" 4 Targetcomputer _
4 "/NNTPSVC/" 4 Siteindex 4 "/ROOT" 4 RelativePath) End Select For Each Child In Parent
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = Child.Name
Next
EnumerateDirectory = NewElement
End Function
Public Function CreateVirDir(ByVai Targetcomputer As String, _ ByVai IlsService As String, ByVai Siteindex As Integer, _ ByVai VDirName As String, ByVai VDirPath As String) As Boolean Dim Parent As IADs Dim NewVDir As IADs
Select Case UCase(IlsService)
Case "WWW"
Set Parent = GetObject("IIS://" 4 Targetcomputer _
4 "/W3SVC/" 4 Siteindex 4 "/Root")
Set NewVDir = Parent.Create("IIsWebVirtualDir", VDirName) Case "FTP"
Set Parent = GetObjectC'IIS://" 4 Targetcomputer _
4 "/MSFTPSVC/" 4 Siteindex 4 "/Root")
Set NewVDir = Parent.Create("IIsFTPVirtualDir", VDirName) Case "NNTP"
Set Parent = GetObject("IIS://" 4 Targetcomputer _
4 "/NNTPSVC/" 4 Siteindex 4 "/Root")
Set NewVDir = Parent.Create("HsNNTPVirtualDir", VDirName) End Select NewVDir.Setinfo NewVDir.Path = VDirPath Err.Number = 0 NewVDir.Setinfo If Err.Number = 0 Then CreateVirDir = True End Function
Public Function DeletevirDir(ByVai Targetcomputer As String, _ ByVai IlsService As String, ByVai Siteindex As Integer, ByVai _ VDirName As String) As Boolean Dim Parent As IADs
Select Case UCase(IlsService)
Case "WWW"
Set Parent = GetObjectC'IIS://" 4 Targetcomputer 4 "/W3SVC/" 4 Siteindex 4 "/Root")
Call Parent.Delete("IIsWebVirtualDir", VDirName) Case "FTP"
Set Parent = GetObject("IIS://" s Targetcomputer _
& "/MSFTPSVC/" & Siteindex & "/Root")
Call Parent. Delete ("HsFTPVirtualDir", VDirName)
Case "NNTP"
Set Parent = GetObject("IIS://" & Targetcomputer _
& "/NNTPSVC/" & Siteindex & "/Root")
Call Parent.Delete ("HsNntpVirtualDir", VDirName)
End Select
Set Parent = Nothing
If Err.Number = 0 Then DeleteVirDir = True End Function
Public Function CreateWebDirEntry(ByVai Targetcomputer As String, _ ByVai Siteindex As Integer, Byval RelativePath As String, _
ByVai NewEntry As String) As Boolean
Dim VirtualDirectory As IADs
Dim WebDir As IADs
Set virtualDirectory = GetObject("IIS://" & Targetcomputer _
"/W3SVC/" & Siteindex & "/ROOT" & RelativePath)
Set WebDir = VirtualDirectory.Create("IIsWebDirectory", NewEntry) WebDir.Setinfo
If Err.Number = 0 Then CreateWebDirEntry = True End Function
Public Function DeleteWebDirEntry(ByVai Targetcomputer As String, _ ByVai Siteindex As Integer, ByVai RelativePath As String, _
ByVai EntryToDelete As String) As Boolean
Dim VirtualDirectory As lADsContainer
Set VirtualDirectory = GetObject("IIS://" & Targetcomputer _
"/W3SVC/" & Siteindex & "/ROOT" & RelativePath)
Call VirtualDirectory.Delete("IIsWebDirectory", EntryToDelete)
If Err.Number = 0 Then DeleteWebDirEntry = True End Function
Public Function CreateWebFileEntry(ByVai Targetcomputer As String, ByVai Siteindex As Integer, ByVai RelativePath As String, _
ByVai NewEntry As String) As Boolean
Dim VirtualDirectory As IADs
Dim WebFile As IADs
Set VirtualDirectory = GetObject("IIS://" & Targetcomputer _
"/W3SVC/" & Siteindex & "/ROOT" & RelativePath)
Set WebFile = VirtualDirectory.Create("IIsWebFile", NewEntry) WebFile.SetInfо
If Err.Number = 0 Then CreateWebFileEntry = True End Function
Public Function DeleteWebFileEntry(ByVai Targetcomputer As String, ByVai Siteindex As Integer, Byval RelativePath As String, _
ByVai EntryToDelete As String) As Boolean
Dim VirtualDirectory As IADs
Set VirtualDirectory = GetObject("IIS://" & Targetcomputer _
"/W3SVC/" & Siteindex & "/ROOT" & RelativePath)
Call VirtualDirectory.Delete("IIsWebFile", EntryToDelete)
If Err.Number = 0 Then DeleteWebFileEntry = True End Function
Public Function Siteoperations(ByVai Targetcomputer As String, Byval IlsService As String, ByVai Siteindex As Integer, _ ByVai Operation As String) As Variant
Dim Site As IADs
Dim Sitestatus As Integer
Select Case UCase(IlsService) Case "WWW"
Set Site = GetObject("IIS://" & Targetcomputer 4 "/W3SVC/" & Siteindex)
Case "FTP"
Set Site = GetObject("IIS://" & Targetcomputer
& "/MSFTPSVC/" & Siteindex) Case "SMTP"
Set Site = GetObject("IIS://" & Targetcomputer
& "/SmtpSvc/" & Siteindex) Case "NKTP"
Set Site = GetObject("IIS://" & Targetcomputer
& "/NNTPSVC/" & Siteindex) End Select SiteStatus = Site.Status Select Case UCase(Operation) Case "START"
If SiteStatus = 4 Or SiteStatus = 3 Then Site. Start
If Err.Number = 0 Then Siteoperations = True End If
Case "STOP"
If SiteStatus = 2 Or SiteStatus = 1 Then Site.Stop
If Err.Number = 0 Then Siteoperations = True End If
Case "CONTINUE"
If SiteStatus = 6 Or SiteStatus = 5 Then Site.Continue
If Err.Number = 0 Then Siteoperations = True End If
Case "PAUSE"
If SiteStatus = 1 Or SiteStatus = 2 Then Site.Pause
If Err.Number = 0 Then Siteoperations = True End If
Case "QUERY"
Select Case SiteStatus
Case 1 Siteoperations = "Starting"
Case 2 Siteoperations = "Started" Case 3
SiteOperations = "Stopping" Case 4
Siteoperations = "Stopped" Case 5
Siteoperations = "Pausing" Case 6
Siteoperations = "Paused" Case 7
SiteOperations = "Continuing" End Select
End Select
End Function
Скомпилируйте код в виде HsAdmin.DLL.
Сохраните и закройте проект IIsAdmin.
Использование функций модуля IIsSiteManagement
После создания модуля класса IIsSiteManagement можно использовать его функции практически из любого языка программирования, который поддерживает автоматизацию OLE, например Visual Basic, VBScript или JavaScript.
Совет
Создание экземпляра объекта и необходимый синтаксис приведены в главе 3, “Методы перечисления контейнера и программное управление политикой учетных записей домена". Не забудьте изменить имя DLL на IIsAdmin и имя класса на IIsSiteManagement, где это необходимо.
В табл. 8.3 приведен синтаксис каждого метода интерфейса IIsSiteManagement.
Таблица 8.3. Синтаксис методов интерфейса IIsSiteManagement
Действие
Синтаксис
Перечисление резервных
For Each Item In Obj.Backupoperations(
копий метабазы
"IIS_Server_Name", "Enumerate") Debug.Print Item
Next
Создание резервной копии
Call Obj.Backupoperations("IIS Server Name",
.метабазы
"Backup", "Metabase_BackupName")
Восстановление метабазы из
Call Obj.Backupoperations("IIS Server Name",
резервной копии
"Restore", "Metabase_BackupName")
Удаление резервной копии
Call Obj.Backupoperations("IIS Server Name",
.метабазы
"Delete", "Metabase_BackupName")
Просмотр максимальной по-
Debug.Print Obj.MaxBandwidth("IIS_Server_Name",
лосы пропускания сервера
"Query")
Установка максимальной
Call Obj.MaxBandwidth("IIS Server Name", "Set",
полосы пропускания сервера
1024000)
Перечисление глобальных
For Each Item In
типов MIME
Obj.MIMETypeManagement("IIS_Server_Name", "Enumerate")
Debug.Print Item
Next
Добавление нового глобаль-
Call Obj.MIMETypeManagement("IIS Server Name",
ного типа MIME
"Add", ".Extension", "Application/Type")
Удаление глобального типа
Call Obj.MIMETypeManagement("IIS Server Name",
MIME
"Remove", ".Extension")
Просмотр активности веде-
Debug.Print Obj.SiteLogging("IIS Server Name",
ния журнала
"WWW", 1, "Query", "LoggingEnabled")
Debug.Print Obj.SiteLogging("IIS_Server_Name", "FTP", 1, "Query", "LoggingEnabled")
Debug.Print Obj.SiteLogging("IIS_Server_Name”, "SMTP", 1, "Query", "LoggingEnabled")
Debug.Print Obj.SiteLogging("IIS_Server_Name", "NNTP", 1, "Query", "LoggingEnabled")
Установка активности веде-
Call Obj.SiteLogging("IIS Server Name", "WWW", 1,
ния журнала
"Set", "LoggingEnabled", 1)
Действие
Синтаксис
Просмотр активности веде-
Call Obj.SiteLogging("IIS_Server_Name", "FTP", 1, "Set", "LoggingEnabled", 1)
Call Obj.SiteLogging("IIS_Server_Name", "SMTP", 1, "Set", "LoggingEnabled", 1)
Call Obj.SiteLogging("IIS_Server_Name", "NNTP", 1, "Set", "LoggingEnabled", 1)
Debug.Print Obj.SiteLogging("IIS_Server_Name",
ния журнала провайдера
"WWW", 1, "Query", "LogType")
Установка активности веде-
Debug.Print Obj.SiteLogging("IIS_Server_Name", "FTP", 1, "Query", "LogType")
Debug.Print Obj.SiteLogging("IIS_Server_Name", "SMTP", 1, "Query", "LogType")
Debug.Print Obj.SiteLogging("IIS_Server_Name", "NNTP", 1, "Query", "LogType")
Call Obj.SiteLogging("IIS Server_Name", "WWW", 1,
ния журнала провайдера
"Set", "LogType", "ODBC")
Просмотр периода обновле-
Call Obj.SiteLogging("IIS_Server_Name", "FTP", 1, "Set", "LogType", "IIS")
Call Obj.SiteLogging("IIS_Server_Name", "SMTP", 1, "Set", "LogType", "NCSA")
Call Obj.SiteLogging("IIS_Server_Name", "NNTP", 1, "Set", "LogType", "W3C")
Debug.Print Obj.SiteLogging("IIS_Server_Name",
ния файла журнала
"WWW", 1, "Query", "LogFilePeriod")
Debug.Print Obj.SiteLogging("IIS_Server_Name", "FTP", 1, "Query", "LogFilePeriod")
Debug.Print Obj.SiteLogging("IIS Server Name",
Установка периода обнов-
"SMTP", 1, "Query", "LogFilePeriod")
Debug.Print Obj.SiteLogging("IIS_Server_Name", "NNTP", 1, "Query", "LogFilePeriod")
Call Obj.SiteLogging("IIS Server_Name", "WWW", 1,
ления файла журнала
"Set", "LogFilePeriod", 0)
Просмотр ограничений на
Call Obj.SiteLogging("IIS_Server_Name", "FTP", 1, "Set", "LogFilePeriod", 1)
Call Obj.SiteLogging("IIS_Server_Name", "SMTP", 1, "Set", "LogFilePeriod", 2)
Call Obj.SiteLogging("IIS_Server_Name", "NNTP", 1, "Set", "LogFilePeriod", 3)
Debug.Print Obj.SiteLogging("IIS_Server_Name",
размер файла журнала
"WWW", 1, "Query", "TruncateSize")
Debug.Print Obj.SiteLogging("IIS_Server_Name", "FTP", 1, "Query", "TruncateSize")
Debug.Print Obj.SiteLogging("IIS_Server_Name", "SMTP", 1, "Query", "TruncateSize")
Debug.Print Obj.SiteLogging("IIS_Server_Name", "NNTP", 1, "Query", "TruncateSize")
ДействиеСинтаксис
Установка ограничений на Call Obj . SiteLogging ("IIS_Server_Name", "WWW", 1, размер файла журнала"Set", "TruncateSize", 1048576)
Call Obj.SiteLogging("IIS_Server_Name", "FTP", 1, "Set", "TruncateSize", 1048576)
Call Obj.SiteLogging("IIS_Server_Name", "SMTP", 1, "Set", "TruncateSize", 1048576)
Call Obj.SiteLogging("IIS_Server_Name", "NNTP", 1, "Set", "TruncateSize", 1048576)
Просмотр дополнительных Debug.Print Obj.ExtendedLogProperty(
свойств W3C (подставьте, "HS_Server_Name", "WWW", 1, "Query", "Date")
где необходимо, FTP, SMTP
или NNTP)
Debug.Print Obj.ExtendedLogProperty( "IIS_Server_Name", "WWW", 1, "Query", "Time")
Debug.Print Obj.ExtendedLogProperty(,
"IIS_Server_Name", "WWW", 1, "Query", "ClientIP")
Debug.Print Obj.ExtendedLogProperty( "IIS_Server_Name", "WWW", 1, "Query", "Username")
Debug.Print Obj.ExtendedLogProperty( "IIS_Server_Name", "WWW", 1, "Query", "ServiceName")
Debug.Print Obj.ExtendedLogPropert у ( "IIS_Server_Name", "WWW", 1, "Query", "ServerName")
Debug.Print Obj.ExtendedLogProperty( "IIS_Server_Name", "WWW", 1, "Query", "ServerIP")
Debug.Print Obj.ExtendedLogProperty(
"IIS_Server_Name", "WWW", 1, "Query", "ServerPort")
Debug.Print Obj.ExtendedLogProperty(
"IIS_Server_Name", "WWW", 1, "Query", "Method")
Debug.Print Obj.ExtendedLogProperty( "IIS_Server_Name", "WWW", 1, "Query", "URIStem")
Debug.Print Obj.ExtendedLogProperty( "IIS_Server_Name", "WWW", 1, "Query", "URIQuery")
■Debug.Print Obj.ExtendedLogProperty(
"IIS_Server_Name", "WWW", 1, "Query", "HttpStatus")
Debug.Print Obj .ExtendedLogProperty( "IIS_Server_Name", "WWW", 1, "Query", "Win32Status")
Debug.Print Obj.ExtendedLogProperty( "IIS_Server_Name", "WWW", 1, "Query", "BytesSent")
Debug.Print Obj.ExtendedLogProperty( "IIS_Server_Name", "WWW", 1, "Query", "BytesReceived")
'Debug. Print Obj .ExtendedLogProperty ( "IIS_Server_Name", "WWW", 1, "Query", "TimeTaken")
Debug.Print Obj.ExtendedLogProperty( "IIS_Server_Name", "WWW", 1, "Query", "Protocolversion")
Действие
Синтаксис
Установка дополнительных
Debug. Print Obj . ExtendedLogProperty (
"IIS_Server_Name", "WWW", 1, "Query", "UserAgent")
Debug.Print Obj.ExtendedLogProperty( "IIS_Server_Name", "WWW", 1, "Query", "Cookie")
Debug.Print Obj.ExtendedLogProperty(
"IIS_Server_Name", "WWW", 1', "Query", "Referrer")
Call Obj.ExtendedLogProperty(
свойств W3C (подставьте,
"IIS_Server_Name","WWW", 1, "Set", "Date", False)
где необходимо, FTP, SMTP или NNTP)
Call Obj.ExtendedLogProperty("IIS_Server_Name", "WWW", 1, "Set", "Time", False)
Call Obj.ExtendedLogProperty("IIS_Server_Name", "WWW", 1, "Set", "ClientlP", False)
Call Obj.ExtendedLogProperty("IIS_Server_Name", "WWW", 1, "Set", "Username", False)
Call Obj.ExtendedLogProperty("IIS_Server_Name", "WWW", 1, "Set", "ServiceName", False)
Call Obj.ExtendedLogProperty("IIS_Server_Name", "WWW", 1, "Set", "ServerName", False)
Call Obj.ExtendedLogProperty("IIS_Server_Name", "WWW", 1, "Set", "ServerIP", False)
Call Obj.ExtendedLogProperty("IIS_Server_Name", "WWW", 1, "Set", "Serverport", False)
Call Obj.ExtendedLogProperty("IIS_Server_Name", "WWW", 1, "Set", "Method", False)
Call Obj.ExtendedLogProperty("HS_Server_Name", "WWW", 1, "Set", "URlStem", False)
Call Obj.ExtendedLogProperty("ILS_Server_Name", "WWW", 1, "Set", "URISet", False)
Call Obj.ExtendedLogProperty("IlS_Server_Name", "WWW", 1, "Set", "HttpStatus", False)
Call Obj .ExtendedLogProperty ("IIS_Server_K’ame", "WWW", 1, "Set", "Win32Status", False)
Call Obj.ExtendedLogProperty("IIS_Server_Name", "WWW", 1, "Set", "BytesSent", False)
Call Obj.ExtendedLogProperty("IIS_Server_Name", "WWW", 1, "Set", "BytesReceived", False)
Call Obj.ExtendedLogProperty("IIS_Server_Name", "WWW", 1, "Set", "TimeTaken", False)
Call Obj.ExtendedLogProperty("HS_Server_Name", "WWW", 1, "Set", "Protocolversion", False)
Call Obj.ExtendedLogProperty(" US_Server_Name", "WWW", 1, "Set", "UserAgent", False)
Call Obj.ExtendedLogProperty("IIS_Server Name", "WWW", 1, "Set", "Cookie", False)
Действие
Синтаксис
Просмотр свойств журнала ODBC
Call Obj .ExtendedLogProperty ("IIS__Server_Name", "WWW", 1, "Set", "Referrer", False)
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "WWW", 1, "Query", "DSN")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "WWW", 1, "Query", "UserName")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "WWW", 1, "Query", "Password")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "WWW", 1, "Query", "TableName")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "FTP", 1, "Query", "DSN")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "FTP", 1, "Query", "UserName")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "FTP", 1, "Query", "Password")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "FTP", 1, "Query", "TableName")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "SMTP", 1, "Query", "DSN")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "SMTP", 1, "Query", "UserName")
.Debug.Print Obj.ODBCLogging("IIS_Server_Name", "SMTP", -1, "Query", "Password")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "SMTP", 1, "Query", "TableName")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "NNTP", 1, "Query", "DSN")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "NNTP", 1, "Query", "UserName")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "NNTP", 1, "Query", "Password")
Debug.Print Obj.ODBCLogging("IIS_Server_Name", "NNTP", 1, "Query", "TableName")
Установка свойств журнала ODBC
Call Obj.ODBCLogging("IIS_Server_Name", "WWW", 1, "Set", "DSN", "IIS_Log")
Call Obj.ODBCLogging("IIS_Server_Name", "WWW", 1, "Set", "UserName", "IIsAdmin")
Call Obj.ODBCLogging("IIS_Server_Name", "WWW", 1, "Set", "Password", "Superman2000")
Call Obj.ODBCLogging("IIS_Server_Name", "WWW", 1, "Set", "TableName", "WWW_Log")
Call Obj.ODBCLogging("IIS_Server_Name", "FTP", 1, "Set", "DSN", "IIS_Log")
Call Obj.ODBCLogging("IIS_Server_Name", "FTP", 1, "Set", "UserName", "IIsAdmin")
Действие
Синтаксис
Call Obj.ODBCLogging("IIS_Server_Name", "FTP", 1, "Set", "Password", "Superman2000")
Call Obj.ODBCLogging("IIS_Server_Name", "FTP", 1, "Set", "TableName", "FTP_Log")
Call Obj.ODBCLogging("IIS_Server_Name", "SMTP", 1, "Set", "DSN", "IIS_Log")
Call Obj.ODBCLogging("IIS_Server_Name", "SMTP", 1, "Set", "UserName", "IIsAdmin")
Call Obj.ODBCLogging("IIS_Server_Name", "SMTP", 1, "Set", "Password", "Superman2000")
Call Obj ..ODBCLogging ("IIS_Server_Name", "SMTP", 1, "Set", "TableName", "SMTP_Log")
Call Obj.ODBCLogging("IIS_Server_Name", "NNTP", 1, "Set", "DSN", "IIS_Log")
Call Obj.ODBCLogging("IIS_Server_Name", "NNTP", 1, "Set", "UserName", "IIsAdmin")
Call Obj.ODBCLogging("IIS_Server_Name", "NNTP", 1, "Set", "Password", "Superman2000")
Call Obj.ODBCLogging("IIS_Server_Name", "NNTP", 1, "Set", "TableName", "NNTP_Log")
Перечисление узлов
For Each Item In Obj.EnumerateSites( "IIS_Server_Name", "WWW")
Debug.Print Item
Next
For Each Item In Obj.EnumerateSites( "IIS_Server_Name", "FTP")
Debug.Print Item
Next
For Each Item In Obj.EnumerateSites( "IIS_Server_Name", "SMTP")
Debug.Print Item
Next
For Each Item In Obj.EnumerateSites(
"IIS_Server_Name", "NNTP")
Debug.Print Item
Next
Создание узлов
Call Obj.CreateSite("IIS_Server_Name", "WWW", "NewSiteName", "File_System_Path")
Call Obj.CreateSite("IIS_Server_Name", "FTP", "NewSiteName", "File_System_Path")
Перечисление содержимого каталога
For Each Item In Obj.EnumerateDirectory( "IIS_Server_Name", "WWW", 1, "/RelativePath")
Debug.Print Item
Next
For Each Item In Obj.EnumerateDirectory( "IIS_Server_Name", "FTP", 1, "/RelativePath")
Debug.Print Item
Next
Действие
Синтаксис
For Each Item In Obj.EnumerateDirectory( "IIS_Server_Name", "SMTP", 1, "/RelativePath")
Debug.Print Item
Next
For Each Item In Obj.EnumerateDirectory( "IIS_Server_Name", "NNTP", 1, "/RelativePath")
Debug.Print Item
Next
Создание виртуального каталога
Call Obj.CreateVirDir("IIS_Server_Name", e"WWW", 1, "Directory_Name", e"File_System_Path")
Call Obj.CreateVirDir("IIS_Server_Name", "FTP", 1, "Directory_Name", "File_System_Path")
Call Obj.CreateVirDir("IIS_Server_Name", "NNTP", 1, "Directory_Name", "internal.adsi.discussion")
Удаление виртуального каталога
Call Obj.DeleteVirDir("IIS_Server_Name", "WWW", 1, "Directory_Name")
Call Obj.DeleteVirDir("IIS_Server_Name", "FTP", 1, "Directory_Name")
Call Obj.DeleteVirDir("IIS_Server_Name", "NNTP", 1, "Directory_Name")
Создание записи каталога
Web в метабазе
Call Obj.CreateWebDirEntry("IIS_Server_Name", 1, "/RelativePath", "Directory_In_File_System")
Удаление записи каталога
Web в метабазе
Call Obj.CreateWebDirEntry("IIS_Server_Name", 1, "/RelativePath", "Directоry_In_File_System")
Создание записи файла Web в метабазе
Call Obj.DeleteWebDirEntry("IIS_Server_Name", 1, "/RelativePath", "File_To_Add")
Удаление записи файла Web в метабазе
Call Obj.CreateWebFileEntry("IIS_Server_Name", 1, "/RelativePath", "File_To_Remove")
Запуск узла
Call Obj.Siteoperations("IIS_Server_Name", "WWW", 1, "Start")
Call Obj.Siteoperations("IIS_Server_Name", "FTP", 1, "Start")
Call Obj.Siteoperations("IIS_Server_Name", "SMTP", 1, "Start")
Call Obj.Siteoperations("IIS_Server_Name", "NNTP", 1, "Start")
Остановка узла
Call Obj.Siteoperations("IIS_Server_Name", "WWW", 1, "Stop")
Call Obj.Siteoperations("IIS_Server_Name", "FTP", 1, "Stop")
Call Obj.Siteoperations("IIS_Server_Name", "SMTP", 1, "Stop")
Call Obj.Siteoperations("IIS_Server_Name", "NNTP", 1, "Stop")
Приостановка узла
Call Obj.Siteoperations("IIS_Server_Name", "WWW", 1, "Pause")
Действие
Синтаксис
Call Obj.Siteoperations("IIS 1, "Pause")
_Server
_Name",
"FTP”
Call Obj.SiteOperations("IIS 1, "Pause")
_Server
_Name",
"SMTP",
Call Obj.SiteOperations("IIS, 1, "Pause")
Server
Name",
"NNTP",
Возобновление работы узла
Call Obj.Siteoperations("IIS 1, "Continue")
Server
Name",
"WWW",
Call Obj.Siteoperations("IIS 1, "Continue")
Server_
Name",
"FTp„,
Call Obj.SiteOperations("IIS_ 1, "Continue")
_Server
_Name ",
"SMTP",
Call Obj . SiteOperations ("IIS_ 1, "Continue")
_Server
Name",
"NNTP",
1
Резюме
Используя код Visual Basic из этой главы, можно программно администрировать сервер IIS. С помощью функции перечисления можно просмотреть пространство имен I IS от корня до самого нижнего узла в иерархии.
Объект IlsComputer позволяет программно управлять полосой пропускания служб WWW и FTP, а также типами MIME, используемыми всеми узлами сервера.
Для всех служб IIS можно активизировать журнал регистрации, используя принятые стандарты форматов файлов журнала. ADSI позволяет программно управлять конфигурацией файлов журналов.
Используя интерфейс ilsContainer, можно программно создавать и удалять узлы WWW, FTP, SMTP и NNTP. Кроме того, с помощью программных методов, описанных в этой главе, можно создавать виртуальные каталоги. Если необходимо изменить наследуемые свойства виртуального каталога, а также каталога или файла Web, можно создать запись в метабазе, которая блокирует или устанавливает новый набор свойств. Программное управление подобными записями осуществляется с помощью ADSL
Для управления функционированием узла можно воспользоваться методами Start, Stop, Pause И Continue.
Используя фрагменты кода, приведенные в этой главе, можно создать полнофункциональное приложение администрирования сервера IIS вашей компании.
Программное управление Web-узлом
Взрывной характер распространения Web-технологии требует незамедлительного решения вопросов эффективного управления Web-средой. Более 100 свойств ADSI предназначены для управления метабазой IIS, т.е. в вашем распоряжении появляется настоящий набор интерфейсов для автоматизации функций администрирования в Web-среде.
В этой главе речь пойдет об управлении Web-службой сервера IIS, включая создание виртуального узла и каталога, а также вопросы наследования свойств. Кроме этого, здесь обсуждается управление параметрами, расположенными на следующих вкладках:
Web Site, Web Operators и Performance;
Home Directory и Documents;
Directory Security и HTTP Headers.
В этой главе также продолжается описание процесса создания приложения СОМ- сервера iisAdmin.DLL, начатое в главе 8, “Программное управление метабазой IIS”.
Примечание
Несмотря на то что в основном материал этой главы фокусируется на IIS 4.0, структура метабазы П8 5.0 практически идентична. Таким образом, все фрагменты кода из этой главы успешно работают и с IIS 5.0.
Связывание виртуального узла
. Для того чтобы управлять свойствами узла, виртуальным каталогом или ресурсом в файловой системе, вначале требуется создать экземпляр соответствующего интерфейса, необходимый для связывания ресурса.
Примечание
Во всех примерах этой главы используется Web-узел, устанавливаемый по умолчанию при инсталляции П8 и имеющий индексное число 1. Если вы желаете манипулировать параметрами другого узла, необходимо знать его индекс. Более подробно понятие индекса и манипуляции с ним описаны в главе 8, “Программное управление метабазой JJS ”.
Для связывания Web-узла по умолчанию в метабазе IIS используйте следующий код Visual Basic:
Dim Site As IADs,
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & index)
Совет
Для связывание альтернативных узлов измените значение переменной Index, которая используется в строке связывания.
После связывания узла можно управлять его отдельными свойствами.
Связывание виртуального каталога
В иерархии метабазы виртуальный каталог расположен на один уровень ниже узла. Чтобы осуществить связывание виртуального каталога для любого узла, установите необходимый индекс узла, а затем примените имя виртуального каталога.
В следующем фрагменте кода Visual Basic демонстрируется связывание виртуального каталога узла:
Dim VirtualDirectory as IADs
Dim ServerName As String
Dim Index As Long
Dim VirtualDirectoryName as String
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
VirtualDirectoryName = " Virtual_Directory_Name"
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Index & "/ROOT" & VirtualDirectoryName)
Наследование свойств
Свойства, используемые на каждом уровне метабазы I1S, приведены в табл. 9.1.
Таблица 9.1. Наследование свойств метабазы HS
Свойство
IlsWebServer
I IsWebVirtualDirectory
IIsWebDirectory
IIsWebFile
AccessExecute
+
+
4-
+
AccessFlags
+
+
4
+
AccessNoRemoteExecute
+
+
4-
+'
AccessNoRemoteRead
+
+
+
+
AccessNoRemoteScript
+
+
4
+
AccessNoRemoteWrite
4
+
4
+
AccessRead
+
4
4
4
AccessScript
+
4
+
4
AccessSSL
+
+
+
+
Свойство
IlsWebServer
IIsWebVirtualDirectory
IIsWebDirectory
IIsWebFUe
AccessSSL128
+
4-
+
+
AccessSSLFlags
+
4-
+
+
AccessSSLMapCert
4-
+
+
4-
AccessSSLNegotiateCert
+
+
+
+
AccessSSLRequireCert
+
+
+
+
AccessWrite
+
+
+
+
AdminACL
+
—
—
—
Al 1owKeepAlive
-4-
—
—
—
AllowPathlnfoForScript- Mappings
+
—
AnonymousPasswordSync
+
+
4-
+
AnonymousUserName
+
4-
+
+
AnonymousUserPass
+
+
+
+
AppAllowCllentDebug
+
4-
—
—
AppAllowDebugging
+
+
—
—
AppFriendlyName
+
+
+
—
Applsclated
+
+
+
—
AppOopRecoverLimit
+
+
+
—
AppPackageID
+
+
—
AppPackageName
+
+
+
—
AppRoot
+
+
+
—
AppWamClsid
+
4-
+■
—
AspAllowOutOfProc- Components
+
+
+
—
AspAllowSessionState
+
+
4-
—
AspBufferingOn
+
+
+
—
AspCodepage
+
+
4
—
AspEnableParentPaths
+
4-
+
—
AspExceptionCatchEnable
4-
4-
+
—
AspLogErrorRequests
+
+
+
—
AspMemFreeFactor
-4-
+
4-
—
AspQueueTimeout
+
+
+
—
AspScriptEngineCacheMax
4-
+
+
—
AspScriptErrorMessage
+
+
+
—
AspScriptErrorSentTo- Browser
+
+
+
—
AspScr iptFileCacheSize
+
+
+
—
AspScriptLanguage
+
+
+■
—
AspScriptTimeout
+
+
+
—
AspSessionTimeout
+
+
+
—
Глава 9. Программное управление Web-узлом
231
Свойство
IlsWebServer IIsWebVirtualDirectory IIsWebDirectory IIsWebFile
AuthAnonymous
+++■+
AuthBasic
++++
AuthFlags
++++
AuthNTLM
++++
AuthPersistence
++++
CacheControlCustom
++++
CacheControlMaxAge
++++
CacheControlNoCache
++++
CachelSAPI
+---
CGITimeout
+---
ConnectionTimeout
+---
ContentIndexed
—+-H—
CreateCGIWithNewConsole
++++
CreateProcessAsUser
++++
DefaultDoc
-r++-
DefaultDocFooter
++++
DefaultLogonDomain
++++
DirBrowseFlags
+++-
DirBrowseShowDate
+++-
DirBrowseShowExtension
+++-
DirBrowseShowLongDate
+++-
DirBrowseShowSize
+++-
DirBrowseShowT ime
+++-
DontLog
++++
EnableDefaultDoc
++J--
EnableDirBrowsing
+++-
EnableDocFooter
++++
EnableReverseDns
++++
FrontPageWeb
+---
HttpCustomHeaders
++++
HttpErrors
++++
HttpExpires
++++
HttpPics
++++
HttpRedirect
++++
IPSecurity
++++
LogExtFileBytesRecv
+---
LogExtFileBytesSent
+---
LogExtFileClientlp
+---
232
Часть III. Исследование провайдеров ADSI: IIS
Свойство
IlsWebServer IlsWebVirtualDirectory HsWebDirectory IIsWebFile
LogExtFileComputerName
LogExtFileCookie
LogExtFileDate
LogExt FileFlags
LogExtFileHttpStatus
LogExtFileMethod
LogExtFileProtoco1- Version
+ - - - + - - - + - - - + - - - + - - - + - - - + - - -
LogExtFileReferer
+---
LogExtFileServerlp LogExtFileserverPort LogExt FilesiteName LogExtFileTime LogExtFileTimeTaken LogExt FileUri Query LogExt Fi 1 eUri S tem LogExt FileUserAgent LogExtFileUserName
LogExtFileWin32Status LogFileDirectorу LogFilePeriod LogFileTruncateSize LogModuleList LogOdbcDataSource
+ - - - + — - - + — — — + - - - + - - - + - - - + - - - + - - - + - - - + - - - + - - - + - - - + - - -
+ - _ -
LogOdbcPassword
LogOdbcTab1eName
+---
+---
Logodbt User Name LogonMethod Log Plug i nCl si d
+—-
+4-++
+---
LogType
MaxBandwidth
+---
MaxBandwidthB]ocked
+---
MaxConnect 1 oris
+---
MaxEndpointConnections
+-_-
MimeMap
NetLogonWorkstation
++++
+---
NTAuthentication- Providers
+~--
PasswordCacheTTL
+---
Свойство
IlsWebServer IIsWebVirtualDirectory IIsWebDirectory IIsWebFile
PasswordChangeFlags
PasswordExpirePrenotify-
Days
Path
+—__
+———
-4-_—
PoolIDCTimeout
4-4-4-4-
ProcessNTCRIfLoggedOn
PutReadSize
4-———
+++4-
Realm
++++
RedirectHeaders
4-4-4-~*~
ScriptMaps
SecureBindings
ServerAutoStart
4-4-4~4
4-——•—
4-———
ServerBindings
Servercomment
+--—
ServerListenBacklog
ServerListenTimeout
+—-—
ServerSize
r———
Serverstate
+—-—
SSIExecDisable
4-4-4-4-
UNCAuthentication- Passthrough
UNCPassword
++++
UNCUserName
-4-——
UploadReadAheadSize
UseHostName
4-4-4-4
+—--
Примечание
Во всех примерах этой главы используется Web-узел по умолчанию и корневой виртуальный каталог. На основе данных приведенной таблицы можно определить, можно ли использовать данное свойство для манипулирования соответствующим уровнем метабазы.
Программное управление параметрами вкладки Properties
Во вкладке Properties (рис. 9.1) можно модифицировать следующие параметры:
описание узла;
адрес IP;
порт TCP;
имя заголовка;
число допустимых подключений;
регистрации.
Всеми параметрами вкладки Properties можно программно управлять с помощью ADSL
234
Часть III. Исследование провайдеров ADSI: IIS
Рис. 9.1. Вкладка Web Site диалогового окна Default Web Site Properties
Идентификация Web-узла
В группе Web Site Identification собраны свойства, которые оказывают влияние на то, как узел описывается для клиентов или инструментов администрирования. В этой группе можно манипулировать:
свойством ServerComment или описанием узла;
адресом (или адресами) IP для узла;
портом ( или портами) TCP, используемыми для доступа к узлу;
любой заголовочной информацией, которая уникально идентифицирует этот узел.
. Кроме этого, можно определить адрес IP и порт TCP для безопасных соединений (Secure Socket Layer — SSL). Модификация значений этих параметров — существенный шаг по установке нескольких узлов на одном сервере IIS.
Управление описанием узла
Изменяя значение поля ServerComment, можно просматривать и модифицировать описание Web-узла. Как отмечалось в предыдущей главе, это поле описания никогда не используется для программной идентификации; оно создано лишь для удобства пользователей.
Просмотр значения свойства ServerComment с помощью Visual Basic
Для просмотра значения свойства ServerComment Web-узла используйте следующий код:'
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name”
Index = Site_Index_Integer
Set Site = GetObject("IIS://" s ServerName s "/W3SVC/" s Index)
Debug.Print Site.Servercomment
Установка нового значения свойства ServerComment
с помощью Visual Basic
Для изменения описания узла, измените значение свойства ServerComment, как показано в приведенном ниже фрагменте кода.
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
Dim NewServerComment As String
ServerName = "IIS_Server_Name"
Index = Site_Index_Integer
NewServerComment = "New_Server_Conunent_String"
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index) Site.ServerComment = NewServerComment
Site.Setinfo
Управление адресом IP, портом TCP и заголовком
Как показано на рис. 9.2, сервер IIS позволяет создать несколько Web-узлов, имеющих один адрес IP. Для использования нескольких Web-узлов на одном компьютере необходимо выполнить какое-либо из следующих действий:
использовать один адрес IP на узел;
использовать уникальный порт TCP для каждого узла с одинаковым адресом IP;
использовать заголовки для разделения узлов с одинаковым адресом IP.
Рис. 9.2. Диалоговое окно Advanced Multiple Web Site Configuration
С помощью ADSI можно использовать свойство ServerBindings для управления приведенными параметрами. Поле ServerBindings представляет собой массив строк, каждая из которых имеет формат IP_Address:TCP_Port:Hostname.
Просмотр значения свойства ServerBindings
с помощью Visual Basic
Чтобы просмотреть порт TCP или соответствующую запись DNS выбранного Web- узла, используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
For Each Binding In Site.ServerBindings•
Debug.Print Binding
Next
Установка нового значения свойства ServerBindings с помощью Visual Basic
После создания строки в формате IP_Address:TCP_Port:Hostname можно создать массив для изменения способа ответа узла на запрос HTTP. Для программной установки альтернативного порта TCP или заголовка связанного узла воспользуйтесь следующим кодом:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long'
Dim NewBindingArray As Variant
Dim ServerBindingStringl As String
Dim ServerBindingString2 As String
Dim ServerBindingString3 As String
ServerName = " I IS_Server_Name"
Siteindex = Site_Index_Value
ServerBindingStringl = " IP_Address: TCP_Port: Hostname"
ServerBindingString2 = " IP_Address: TCP_Port .-Hostname"
ServerbindingString3 = " TP_Address: TCP_Port: Hostname"
NewBindrngAr)ay - Ai iay(Ser vol BindingString 1, _
Server Bindings! ring)., ServerBindingSt ring3)
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Site.ServerBindings = NewBindingArray
Site.Setinfo
Параметры безопасного соединения
Для установки адреса 1Р и порта TCP при использовании безопасного соединения (Secure Sockets Layer — SSL) можно обратиться к свойству secureBindings. Это свойство практически идентично ServerBindings. Однако здесь нельзя ассоциировать заголовок с узлом. В соединении SSL заголовок помещается в зашифрованный запрос, что делает невозможным его декодирование. Поэтому в соединениях SSL используется только адрес IP и порт TCP.
Если необходимо создать несколько защищенных SSL-узлов, то придется манипулировать только портами TCP, а не заголовками.
Примечание
Более подробную информацию о заголовках и SSL можно найти в статье Microsoft Knowledge Base под номером QI87504.
Просмотр значения свойства SecureBindings с помощью Visual Basic
Для просмотра текущей конфигурации защищенного SSL-узла используйте код
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value■
Set Site = GetObject("IIS://" S ServerName & "/W3SVC/" S Siteindex)
For Each Binding In Site.SecureBindings
Debug.Print Binding
Next
Установка нового значения свойства SecureBindings с помощью Visual Basic
После создания строки в формате IP_Address:TCP_Port: можно создать массив для изменения свойства SecureBindings, используя следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim NewBindingArray As Variant
Dim ServerBindingStringl As String
Dim ServerBindingString2 As String
Dim ServerBindingString3 As String
ServerName = " IIS_Server_Name”
Siteindex = Site_Index_value
ServerBindingStringl = "IP_ Address:TCP_Port:"
ServerBindingString2 = "IP_Address:TCP_Port:"
ServerbindingString3 = "IP_Address:TCP_Port:"
NewBindingArray = Array(ServerBindingStringl, _
ServerBindingString2, ServerBindingString3)
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" s Siteindex)
Site.SecureBindings = NewBindingArray
Site.Setinfo
Соединения
Во вкладке Web Site диалогового окна свойств узла есть группа Connections. С помощью параметров этой группы можно определить максимальное число соединений с узлом, а также время ожидания для всех соединений. Эти параметры лучше всего устанавливать после применения инструментов планирования нагрузки.
Максимальное число соединений
С помощью свойства MaxConnections объекта IisWebServer можно просмотреть или определить число пользователей, одновременно подключенных к серверу.
Примечание
Windows NT Workstations допускает только 10 соединений. Если вы используете ADS1 вместе с Personal Web Server, то максимальное число соединений равно 10.
Просмотр значения свойства MaxConnections
с помощью Visual Basic
Для просмотра максимального числа соединений Web-узла используйте код
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
Dim RetVal As Long
ServerName = " IIS_ Serve r_Name"
Index = Site_Index
Set Site = GetObject("IIS://" & ServerName s "/W3SVC/" & Index)
RetVal = Site.MaxConnections
Debug.Print RetVal
Примечание
В отличие от других свойств ADSI, значение свойства MaxConnections, равное 2 000 000 000, указывает на неограниченной число подключений.
Установка нового значения свойства MaxConnections с помощью
Visual Basic
Чтобы установить новое число подключений, используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
Dim NewMaxConnections As Long
ServerName = " IIS_Server_Name"
Index = Site_Index
NewMaxConnections = Maximum_Number_of_Connections
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index)
Site.MaxConnections = NewMaxConnections
Site. Setinfo
Время ожидания соединения
С помощью значения свойства ConnectionTimeout можно определить время (в секундах), по истечении которого пользовательское HTTP-соединение закроется.
Просмотр значения свойства ConnectionTimeout
с помощью Visual Basic
Для просмотра времени, по истечении которого HTTP-соединение закроется, воспользуйтесь следующим кодом:
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
Dim RetVal As Long
ServerName = ” IIS_Server_Name"
Index = Site_Index.
Set Site = GetObjectCIIS://" & ServerName & "/W3SVC/" & Index)■
RetVal = Site.ConnectionTimeout
Debug.Print RetVal
Установка нового значения свойства ConnectionTimeout
с помощью Visual Basic
Чтобы установить новый временной интервал ожидания, используйте код
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
Dim ConnectionTimeout As Long
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
NewConnectionTimeout = Connection_Timeout_in_Seconds
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index)
Site.ConnectionTimeout = NewConnectionTimeout
Site.Setinfo
Регистрация журнала IIS
Сервер IIS может вести журнал для служб WWW, FTP, SMTP и NNTP. Более подробное описание настройки журнала можно найти в главе 8, “Программное управление метабазой IIS”.
Программное управление параметрами вкладки Operations
Как показано на рис. 9.3, сервер I IS позволяет определить список контроля доступа (Access Control List — ACL) к узлу. По умолчанию только локальная группа администраторов сервера имеет доступ к конфигурированию Web-узла.
Рис. 9.3. Вкладка Operators диалогового окна
Default Web Site Properties
Чаше всего модель безопасности строится по следующему принципу: максимально ограничив права пользователя, оставить ему возможность выполнения необходимых
действий. Чтобы применить подобную модель в IIS, необходимо создать одну группу для каждого типа администраторов. Это позволит разделить обладающих правами администратора сотрудников компании в соответствии с узлами, организационными единицами, географическим положением или любым другим принципом.
После создания групп можно использовать свойство AdminACL объекта IiswebServer для установки дискреционного списка контроля доступа (Discretionary Access Control List — DACL) к специфическим ветвям узла в метабазе. Таким образом, можно разрешать или запрещать доступ/модификацию параметров на основе принадлежности пользователя к определенной группе.
Просмотр операторов Web-узла с помощью Visual Basic
Для просмотра текущих операторов Web-узла используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS:/7" 4 ServerName 4 "/W3SVC/" 4 Siteindex)
Set SecurityDescriptor = Site.AdminAcl
Set DiscretionaryAcl = SecurityDescriptor.DiscretionaryAcl
For Each Item Ir . . cretionaryAcl
If Item.AccessMask = 11 Or Item.AccessMask = 262315 Then
'Debug. Print Item. Trustee
End If
Next■
Добавление нового оператора Web-узла с помощью Visual Basic
Для добавления нового оператора Web-узла используйте код
Dim Site As IADs Dim ACE As Variant Dim DiscretionaryACL As Variant Dim ServerName As String Dim Siteindex As Long Dim NewOperator As String ServerName = " I IS_ Serve r_ Name" Siteindex = Site_Index_Value NewOperator = "New_Cperator_in_Format_Domain\Username"
Set Site = GetObject("IIS://" 4 ServerName 4 "/W3SVC/" 4 Siteindex) Set SecurityDescriptor = Site.AdminACL Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL Set ACE = CreateObject("AccessControlEntry") ACE.Trustee = NewOperator ACE.AccessMask = 11
DiscretionaryACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DiscretionaryACL .
Site.AdminACL = SecurityDescriptor
Site.Setinfo
Примечание
Используемая в АСЕ учетная запись должна существовать; эта учетная запись активизируется только после ее верификации.
Удаление оператора Web-узла с помощью Visual Basic
Чтобы удалить определенный оператор из списка операторов узла, воспользуйтесь следующим кодом:
Dim Site As IADs
Dim ACE As Variant
Dim DiscretionaryACL As Variant
Dim ServerName As String
Dim Siteindex As Long
Dim OperatorToRemove As String
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
OperatorToRemove = "User_Name_to_Remove"
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Set SecurityDescriptor = Site.AdminACL
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject("AccessControlEntry")
ACE.Trustee = OperatorToRemove
ACE.AccessMask =11
DiscretionaryACL.RemoveAce ACE
SecurityDescriptor.DiscretionaryACL = DiscretionaryACL
Site.AdminACL = SecurityDescriptor
Site.Setlnfo
Программное управление параметрами вкладки Performance
Для настройки распределения памяти, использования полосы пропускания и параметров соединения в IIS существует вкладка Performance (рис. 9.4).
В этом разделе речь пойдет о программном управлении параметрами данной вкладки.
Рис. 9.4. Вкладка Performance диалогового окна Default Web Site Properties
Настройка производительности
С помощью бегунка Performance Tuning можно управлять объемом памяти, выделяемой для функционирования определенного узла. Неверный выбор положения бегунка может привести к нехватке памяти и, следовательно, снижению производительности клиента. Важно выбрать оптимальный объем памяти, выделяемый для узла, который обеспечит его нормальное функционирование. Для этого необходимо проанализировать журнал работающего узла, а затем установить соответствующий параметр.
Дтя программного управления выделяемого объема памяти используйте свойство ServerSize объекта HsWebServer. Это свойство может принимать целые значения, приведенные в табл. 9.2.
Таблица 9.2. Значения свойства ServerSize '
Значение
Параметр
Описание
С
Небольшой узел
Менее 10 000 обработанных узлом запросов в день
1
Средний узел
От 10 000 до 100 000 обработанных узлом запросов в день
2
Большой узел
Более 100 000 обработанных узлом запросов в день
Просмотр значения свойства ServerSize с помощью Visual Basic
Для просмотра текущего значения свойства Serversize воспользуйтесь кодом
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_ Serve r_Name".
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName S "/W3SVC/" & Siteindex)
Debug.Print Site.ServerSize
Установка нового значения свойства ServerSize
с помощью Visual Basic
Чтобы установить новое значение свойства ServerSize, используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim NewServerSize As Integer
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
NewServerSize = 0
Set Site = GetObject("IIS://" S ServerName S "/W3SVC/" S Siteindex)
Site.ServerSize = NewServerSize
Site. Set Inf о
Установка ограничений полосы пропускания
Из предыдущей главы вы узнали, как управлять максимальной полосой пропускания сервера. Практически так же выполняется управление полосой пропускания отдельного узла — с помощью просмотра/модификации свойства MaxBandwidth.
Иногда необходимо выделить большую полосу пропускания определенному узлу, например для тестирования его производительности. И здесь вам поможет свойство MaxBandwidth.
Просмотр максимальной полосы пропускания определенного узла с помощью Visual Basic
Для просмотра текущего значения свойства MaxBandwidth используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = "IIS_Server_Name”
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Debug.Print Site.MaxBandwidth
Установка максимальной полосы пропускания определенного узла с помощью Visual Basic
Чтобы установить новое значение свойства MaxBandwidth, определяющее максимальную полосу пропускания, воспользуйтесь кодом
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim NewMaxBandwidth As Long
ServerName = " IIS_Seiver_Name"
Siteindex = Site_Index_Value
NewMaxBandwidth = Value_in_Bytes
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Site.MaxBandwidth = NewMaxBandwidth
Site.Setinfo
Конфигурация соединения
По умолчанию сервер IIS сохраняет соединение HTTP для того, чтобы минимизировать передачу данных, выполняемую при создании и удалении сессии HTTP при каждом запросе. Этот параметр программно настраивается с помощью значения свойства AllowKeepAlive объекта HsWebServer для определенного узла. Снижая число установок и удаления соединений каждого запроса, использование сохранения соединения HTTP довольно часто приводит к повышению производительности узла.
Просмотр состояния сохранения соединения HTTP с помощью Visual Basic
Для просмотра текущего состояния сохранения соединения HTTP используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " I IS__Server_Name”
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Debug.Print Site.AllowKeepAlive
Установка нового состояния сохранения соединения HTTP с помощью Visual Basic
Чтобы активизировать или деактивизировать процесс сохранения соединения HTTP, воспользуйтесь кодом
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim AllowKeepAlive As Boolean
ServerName = " IIS_Server_Name’’
Siteindex = Site_Index_Value
AllowKeepAlive = True
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Site.AllowKeepAlive = AllowKeepAlive
Site.Setinfo
Программное управление параметрами вкладки Ноте Directory
Настройка пути к личному каталогу осуществляется во вкладке Home Directory (рис. 9.5).
Рис. 9.5. Вкладка Ноте Directory диалогового окна Default Web Site Properties
Используя параметры этой вкладки, можно определить источник содержимого, разрешение и поведение файлов и каталогов в корневом виртуальном каталоге, а также выбрать приложение для конфигурации параметров.
В первую очередь необходимо выбрать месторасположение содержимого. В HS 4.0 для этого существуют три параметра:
каталог расположен на этом компьютере;
совместно используемый каталог расположен на другом компьютере;
перенаправление по адресу URL.
Локальный личный каталог
Доступ к содержимому, хранящемуся на локальном компьютере, определяется свойством Path корневого виртуального каталога: свяжите корневой виртуальный каталог узла и установите новое значение свойству Path.
Просмотр локального пути корневого виртуального каталога с помощью Visual Basic
Для просмотра текущего пути, назначенного связанному Web-узлу, используйте следующий код:
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
Dim RetVal As String
ServerName = n IIS_Server_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Index & "/ROOT")
RetVal = VirtualDirectory.Path
Debug.Print RetVal
Модификация локального пути корневого виртуального каталога с помощью Visual Basic
Чтобы модифицировать локальный путь корневого виртуального каталога Web-узла по умолчанию, воспользуйтесь кодом
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
Dim NewVirtualDirPath As String
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
NewVirtualDirPath = "New_Path_for_Site"
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Index & "/ROOT")
VirtualDirectory.Path = NewVirtualDirPath
VirtualDirectory.Setinfo
Удаленный личный каталог
Сервер IIS позволяет установить соединение с удаленным каталогом (рис. 9.6).
Для доступа к содержимому, расположенному на удаленном компьютере, установите значение свойства Path пути к удаленному каталогу. Помните, что для этого необходимо использовать универсальное соглашение об именах (Universal Naming Convention - UNC), т.е. определять удаленный совместно используемый ресурс в виде \\сервер\ресурс. Кроме этого, для создания подключения к совместно используемому ресурсу необходимо с помощью свойств UNCUserName и UNCPassword определить имя и пароль.
Default Web Site PropertiesHB|
•Documents | Directory Security : ’ | HTTPHeeders |Custom Errors M
Web Sie | Operators | Performartoe | iSARFkers Herne Diectcxy" When connecting to this resoace, the content should come fiom: \. A" .-
^ A jirectofy located on this conputer .:. .-
6* A share located on another computer''• ■..
.•Г A redirection to a yRLA'
. j Network Directory [^егуёгКПьагеГ^——Qy,,^^^ | ■
. .^ Aircess Permissions Content ControlContent ControlJ
; P fieadП Log accessP {ndex this directory,
J Г" Write .. Г" Directory bowsing slowed P ErontPageWeb ;
• Application Settings • •-.■■ ■ ■- •• - ;
; I N^e: •;|j 4
> : SlartnsPoint. <tM«tW.bSte> . ._ ConlauHtioa.. I ;
{ i F Run in separate memory space (isolated process) •...,..—.„—, J ;
Peorttticns.■'vr^4?| t I
' 3 = <• Лопе '■. ■.A
•Ap^. Script .,i Г
✓у'; Г EjrecuteSncbdaigsapi) .; :
: . ■ . ■OK | ■ ■ !Caned| й^Ь1 | He|p
Puc. 9.6. Вкладка Home Directory диалогового окна Default Web Site Properties (удаленный каталог)
Просмотр удаленного пути корневого виртуального каталога и информации о соединении с помощью Visual Basic
Используя свойства Path, UNCUserName и UNCPassword, можно узнать параметры конфигурации удаленного личного каталога. Для этого существует следующий код:
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
Dim RetVal As String
ServerName = " IIS_Server:_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Index & "/ROOT")
Debug. Print VirtualDirectory. Path
Debug. Print VirtualDirectory. UNCUserName
Debug.Print VirtualDirectory.UNCPassword
Внимание
Все пароли, хранящиеся в метабазе IIS, с помощью ADSI могут быть просмотрены в виде простого текста. При разработке Web-узла помните, что любой пользователь, обюдаю- щий необходимыми знаниями и владеющий соответствующим инструментарием, может узнать этот пароль. А это уже явно выраженная брешь в безопасности вашей системы.
Модификация удаленного пути корневого виртуального каталога и информации о соединении с помощью Visual Basic
Для создания нового удаленного корневого каталога узла воспользуйтесь кодом
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
Dim NewVirtualDirPath As String
Dim NewVirtualDirUser As String
Dim NewVirtualDirPassword As String
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
NewVirtualDirPath = "New_Path_for_Site"
NewVirtualDirUser = "UNC_Credentials_Used_To_Establish_Connection"
NewVirtualDirPassword = _
"UNC_Credentials_Used_To_Establish_Connection”
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/"
& Index & "/ROOT")
VirtualDirectory.Path = NewVirtualDirPath
VirtualDirectory.UNCUsername = NewVirtualDirUser
VirtualDirectory.UNCPassword = NewVirtualDirPassword
VirtualDirectory.SetInfo
Разрешения доступа и управление содержимым локальных и удаленных личных каталогов
Для локальных и удаленных личных каталогов можно установить разрешения доступа, а также активизировать/дсактивизировать ведение журнала, просмотр каталога, индексирование каталога и доступ пользователей программы FrontPage.
Чтобы выполнить описанные действия, свяжите корневой виртуальный каталог и установите соответствующее значение Boolean для каждого из перечисленных ниже свойств.
Свойство
Поведение
AccessRead
Активизирует или деактивизирует возможность чтения файлов в каталоге
AccessWrite
Активизирует или деактивизирует возможность записи файлов в каталоге
AontLog
Активизирует или деактивизирует ведение журнала связанного каталога
EnableDirBrowsing
Активизирует или деактивизирует возможность просмотра клиентом виртуального каталога
Content Indexed
Активизирует или деактивизирует индексацию связанного каталога
FrontPageWeb
Активизирует диспетчер FrontPage для создания необходимых файлов FrontPage. Если этот параметр дсактивизирован, поддержка файлов FrontPage Web удаляется
Настройка разрешений доступа и управления содержимым локальных и удаленных личных каталогов с помощью Visual Basic
Для управления параметрами Access Permissions и Content Control в IIS 4.0 используйте следующий код:
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Indo: As Long
ServerName = " IIS_Server_Name”
Index = Site_Index Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Index & "/ROOT")
Debug.Print "Read:" & vbTab & vbTab & vbTab _
£ VirtualDirectory.AccessRead
Debug.Print "Write:" & vbTab & vbTab & vbTab _
S VirtualDirectory.AccessWrite
Debug.Print "Logging Disabled: " & vbTab & VirtualDirectory.DontLog
Debug. Print "Dir Browsing: " & vbTab & vbTab _
S VirtualDirectory.EnableDirBrowsing
Debug.Print "Index Content: " & vbTab _
S VirtualDirectory.ContentIndexed
Set VirtualDirectory = GetObject("IIS://" & ServerName _
i "/W3SVC/" & Index)
Debug. Print "Frontpage Web: " & vbTab & vbTab _
S VirtualDirectory.FrontPageWeb
Внимание
Свойство FrontPage Web определяется на уровне узла. При попытке определить его на любом другом уровне иерархии метабазы появится ошибка.
Настройка Web-приложений
Установив связь между файлом global.asa и определенным набором сценариев, можно сконфигурировать виртуальный каталог для запуска Web-приложений. Помимо использования глобальных функций и переменных для всех сценариев в контексте приложения, существует возможность выполнения сценариев в отдельной от IIS области памяти.
Такое разделение процессов будет особенно полезно в том случае, если разработчики пишут “непредсказуемый" код, а вы не желаете регулярно перезагружать сервер. Многие администраторы борются с такими некорректными приложениями довольно простым способом: запуская их вне процесса IIS. Именно такой способ обеспечивает стабильности работы сервера.
После связывания виртуального каталога можно определить имя приложения, конфигурацию изолированного процесса, разрешения для приложения, параметры состояния сессии, серверную буферизацию, общий язык сценариев для всех ASP и значение времени задержки для сценариев ASP. На серверах разработки и тестирования можно активизировать клиентскую и серверные отладки сценариев, а также обработку сообщений об ошибках.
Управление основным приложением
Большинство приложений могут быть настроены с помощью свойств
AppFriendlyName, AppRoot, Applsolated, AccessExecute и AccessRead.
Просмотр конфигурации приложения с помощью Visual Basic
Для программного просмотра конфигурации существующего приложения используйте следующий код:
Dim Application as IADs
•Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name”
Index = Site_Index_Value
Set Application = GetObject("IIS://" & ServerName & "/W3SVC/" _
Index & "/ROOT")
Debug.Print "Friendly Name:" & vbTab & vbTab & vbTab _
S Application.AppFriendlyName
Debug.Print "Application Root:" & vbTab & vbTab & Application.AppRoot
Debug.Print "Isolated Process:" & vbTab & vbTab _
Application.Applsolated
Debug.Print "Read:" & vbTab & vbTab & vbTab & vbTab _
Application.AccessRead
Debug.Print "Execute:" & vbTab & vbTab & vbTab & vbTab _
Application.AccessExecute
Установка конфигурации приложения с помощью Visual Basic
Свойства нового приложения можно сконфигурировать с помощью кода
Dim Application As IADs
Dim ServerName As String
Dim Index As Long
Dim ApplicationName As String
Dim Isolated As Boolean
Dim Read As Boolean
Dim Execute As Boolean
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
ApplicationName = "Application_Name" Isolated = True
Read = True
Execute = True
Set Application = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Index & "/ROOT")
Application.AppRoot = Replace(Application.ADsPath, "IIS://" _
& ServerName, "/LM")
Application.AppFriendlyName = ApplicationName
Application.Applsolated = Isolated
Application.AccessRead = Read
Application.AccessExecute = Execute
Application.Setlnfо
Дополнительное управление приложением
Кроме выбора приложения, можно также сконфигурировать поведение по умолчанию сервера приложения. Как показано на рис. 9.7, можно настроить значения времени ожидания сессии, буферизацию, родительские пути, язык сценариев по умолчанию и значение времени ожидания для исполнения сценария ASP.
Настройка параметров приложения с помощью Visual Basic
Для просмотра конфигурации каждого из описанных выше свойств используйте следующий код:
Dim Application As IADs
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
Set Application = GetObject("IIS://" & ServerName & "/W3SVC/" _
Index & "/ROOT")
Debug.Print "Session Timeout:" & vbTab _
Application.AspSessionTimeout
Debug.Print "Buffering:" & vbTab & vbTab _
Application.AspBufferingOn.
Debug.Print "Parent Paths:" & vbTab & vbTab _
Application.AspEnableParentPaths
Debug.Print "Script Language:" & vbTab _ s Application.AspScriptLanguage
Debug.Print "Script Timeout:" & vbTab & Application.AspScriptTimeout
Управление параметрами процесса
С помощью ADSI можно сконфигурировать поведение службы IIS записи событий, обработки ошибок, кэширования ASP и значений времени ожидания CGI (рис. 9.8).
Puc. 9.7. Вкладка Арр Options диалогового окна Application ConfigurationPuc. 9.7. Вкладка Арр Options диалогового окна Application Configuration[Application Configuration
Puc. 9.7. Вкладка Арр Options диалогового окна Application Configuration
Puc. 9.7. Вкладка Арр Options диалогового окна Application Configuration
Арр Mapprigs) Арр Options Process Options j Арр Debugging |
-- Process Configuration' 4
; P Enabfe debug exception caU^ng*.-<-
: i ^umbwof saipt engines cached" |32
•т-Script Re Cache-“
; <* Do iV cache ASP Set
! Г Cache al requested ASP Set
■’^ Max ASF {les cached [lOOO :
r CGI Configurators ~ —-—™ -— —~ - —
i CfiljianWneout ^900 ' seconds^
Рис. 9.8. Вкладка Process Options диалогового окна Application Configuration
Используя следующий код Visual Basic, можно программно управлять описанными свойствами:
Dim Application as IADs
Dim ServerName As String
Dim Index As Long
ServerName = " I IS_Server_Name"’
Index = Site_Index_Value
Set Application = GetObject("IIS://" & ServerName & "/W3SVC/" _ i Index & "/ROOT")
Debug.Print "NT Event Logging:" & vbTab & vbTab & vbTab _ £ vbTab & vbTab & Application.AspLogErrorRequests
Debug.Print "Debug Exceptions:" & vbTab & vbTab & vbTab _
S vbTab & vbTab & Application.AspExceptior.CatchEnable Debug.Print "Script Engines Cached:" & vbTab & vbTab _ S vbTab & vbTab & Application.AspScriptEngineCacheMax Debug.Print "Script File Cache:" & vbTab & vbTab & vbTab _ S vbTab & vbTab & Application.AspScriptFileCacheSize
Set Application = GetObject ("IIS://" & ServerName & "/W3SVC/" _ S Index)
Debug.Print "CGI Script Timeout:". & vbTab & vbTab & vbTab _
S vbTab & vbTab & Application.CGITimeout
Для установки переключателей группы Script File Cache используйте значения, приведенные в табл. 9.3.
Таблица 9.3. Значения переключателей группы Script File Cache
Значекп"
Описание
0
Нс кэшировать файлы ASP
-1
Кэшировать все запрашиваемые файлы ASP
Г1
Максимальное число кэшированных файлов ASP
Управление параметрами отладки ASP
При разработке сценариев ASP полезно активизировать их отладку. Как показано на рис. 9.9, можно отлаживать сценарии ASP как на стороне сервера, так и на стороне клиента, а также можно выбрать формат сообщения об ошибке, отправляемого клиенту.
Рис. 9.9. Вкладка Арр Debugging диалогового окна Application Configuration
Управление параметрами отладки ASP с помощью Visual Basic
Для управления поведением отладки приложения используйте следующий код:
Dim Application As IADs
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
Set Application = GetObject("IIS://" & ServerName & "/W3SVC/" _
Index & "/ROOT")
Debug.Print "ASP Server-Side Debugging:" & vbTab & vbTab _
vbTab & Application.AppAllowDebugging
Debug.Print "ASP Client-Side Debugging:" & vbTab & vbTab _
vbTab & Application.AppAllowClientDebug
Debug.Print "Detailed Client Error Messages:" & vbTab _
vbTab & Application.AspScriptErrorSentToBrowser
If Application.AspScriptErrorSentToBrowser = False Then
Debug.Print "Error Message Text:" & vbTab & vbTab & vbTab S vbTab & vbTab & Application.AspScriptErrorMessage End If
Перенаправление HTTP URL
Сервер IIS может перенаправлять запросы пользователей на новый узел (рис. 9.10). Это удобно при перемещении содержимого в другое место или при переводе сервера в резервное состояние.
Рис. 9.10. Вкладка Ноте Directory диалогового окна Default Web Site Properties (перенаправление URL)
С помощью этого параметра можно перенаправлять все запросы на альтернативный адрес URL. Для программного управления этим параметром можно использовать флаги свойства HttpRedirect.
Довольно часто требуется перенаправлять пользователя на новый узел, объединяя некоторую часть оригинального URL с новым узлом и при этом оставляя неизменными оригинальные параметры. Эту операцию можно выполнить с помощью переменных перенаправления, список которых приведен в табл. 9.4.
Таблица 9.4. Переменные перенаправления и их описание
Переменная Описание
5?Передает оригинальные параметры на новый URL. Для перенаправления
www.sitе1.com?search—exact на www.site2.com?search=exact используйте www.site2.com?$P
?QПередает оригинальные параметры на новый URL. В данном случае пере
даются все параметры, включая символ ?. Для перенаправления www.site1.com?search—exact на www.site2.com?search=exact используйте www.site2.com$Q
Переменная Описание
$SПередает совпадающий суффикс на новый URL. Для перенаправления за
проса /BetaSearchZFind.EXE на /Search/Find.Exe, необходимо использовать следующее перенаправление URL: /Search$S
$VПередает все запрашиваемые URL без имени сервера. Для перенаправления
всех запросов в http://www.isp.net/employment/hot_jobs.asp на http: //www. consulting.com/employment/hot_jobs.asp можно использовать следующее перенаправление URL: http://www.consulting.com$V
1Перенаправление не выполняется (эта переменная предназначена для пре
дотвращения перенаправления каталога или файла)
Совет
Перенаправление URL также поддерживает символы подстановки. За более подробной информацией об их использовании обратитесь к документации по IIS.
Для конфигурации поведения перенаправления URL используются три параметра.
The Exact URL Entered Above. Отправляет заголовок перенаправления HTTP на определенный URL. Все переменные и символы подстановки можно использовать.
A Directory Below This One. Позволяет переназначить родительский каталог дочернему узлу.
Permanent Redirection for This Resource. Изменяет заголовок HTTP с 301 Temporary Redirect на 302 Permanent Redirect. В некоторых случаях может использоваться для обновления URL, ассоциированного с закладкой.
Теперь, обладая всей необходимой информацией, можно программно выполнять перенаправление URL. Для этого воспользуйтесь свойством HttpRedirect. Оно записывается в одну строку и ожидает получения данных в одном из следующих форматов:
Destination, Flag, (например, http: //www.microsoft.com, EXACT_DESTINATION,);
Destination, Flagl, Flag2, (например, http://www.microsoft.com, EXACT_ DESTINATION, PERMANENT,).
При использовании второго формата можно применять несколько флагов для одного назначения:
exact_destination;
CHILD_ONLY;‘
PERMANENT.
Эти флаги напрямую связаны с тремя параметрами перенаправления URL, описанными выше.
Просмотр текущего состояния перенаправления
с помощью Visual Basic
Для определения того, перенаправляется ли узел, используйте следующий код:
Dim Resource As IADs
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
Index = Site Index Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" S Index & "/ROOT")
Debug.Print Resource.HttpRedirect
Установка нового ресурса перенаправления с помощью Visual Basic
Чтобы создать новый ресурс перенаправления, воспользуйтесь кодом
Dim Resource As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim HttpRedirectString As String
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
■HttpRedirectString = "http: //wm. sitename. com, FLAG,"
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/"
S Siteindex & "/ROOT")
Resource. HttpRedirect = HttpRedirectString
Resource. Setinfo
Программное управление параметрами вкладки Documents
Если имя документа не определено в адресе URL, то сервер IIS может автоматически предоставить необходимый документ. Это выполняется с помощью параметров вкладки Documents (рис. 9.11).
Рис. 9.11. Вкладка Documents диалогового окна Default Web Site Properties
Кроме этого, можно настроить IIS таким образом, чтобы ко всем передаваемым с сервера на броузеры клиентов документам добавлялся колонтитул. Это может быть навигационная панель, информация об авторском праве и др.
Активизация документа по умолчанию
Чтобы пользователь не вспоминал имя основного документа, можно определить его имя, которое автоматически отображается при запросе пользователя.
Для программной конфигурации основного документа необходимо использовать два свойства: EnableDefaultDoc и DefaultDoc. Первое свойство может принимать значения Boolean (соответствует флажку активизации во вкладке Documents). Значение свойства DefaultDoc представляет собой разделенный запятыми список строк, в котором перечислены имена документов, отображаемых в том случае, если клиент не ввел определенное имя в строке URL. Совместное использование этих двух свойств позволяет установить отображаемый документ по умолчанию, что упростит для клиента ввод адреса URL.
Просмотр значения свойства EnableDefaultDoc с помощью Visual Basic
Для просмотра того, активизирован ли документ, отображаемый по умолчанию, используйте следующий код:
Dim Resource As IADs
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Index & "/ROOT")
Debug.Print Resource.EnableDefaultDoc
Установка значения свойства EnableDefaultDoc
с помощью Visual Basic
Чтобы активизировать документ, отображаемый по умолчанию, воспользуйтесь кодом
Dim Resource As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim EnableDefaultDocument As Boolean
ServerName - "IIS Server Name"
Silelndcx - Sitf IndexVd1ue
EnableDefaultDocument = True
Set Resource - GetObject("IIS://" & ServerName & "/W3SVC/" _ & SiteTndex & "/ROOT")
Resource.EnableDefaultDoc = EnableDefaullDocumenl
Resource.SetInfо
Просмотр значения свойства DefaultDoc с помощью Visual Basic
Для просмотра документов, отображаемых по умолчанию, используйте следующий код:
Dim Resource As IADs
Dim ServerName As String
Dim Index As Long
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Index & "/ROOT")'
Debug.Print Resource.DefaultDoc
Установка значения свойства DefaultDoc с помощью Visual Basic
Чтобы установить новый список документов, отображаемых по умолчанию, используйте приведенный ниже код Visual Basic. Помните, что можно указывать несколько документов, разделяя их запятыми.
Dim Resource As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim DefaultDocument As String
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
DefaultDocument = "default.asp,default.htm,index.html"
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/"
S Siteindex & "/ROOT")
Resource.DefaultDoc = DefaultDocument"
Resource.Setlnfо
Активизация колонтитула документа
Администратор может добавить колонтитул документа в виде файла HTML ко всем просматриваемым HTML-файлам. Это может быть навигационная панель, информация об авторском праве, контактная информация и др. В отличие от свойства DefaultDoc, значение свойства DefaultDocFooter определяет полный путь к файлу.
Выбранный с помощью свойства DefaultDocFooter документ необходимо активизировать, установив свойство EnableDocFooter в True.
Просмотр значения свойства DefaultDocFooter с помощью Visual Basic
Для просмотра имени файла, присоединяемого ко всем запрашиваемым HTML- страницам, используйте следующий кол;
Dim Resource As IADs
Dim ServerName As String
Dim Index As Long
ServerName - "II:: Server Name" index - Site J ndex_ Vai Ue
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _ S Index t. "/ROOT")
Debug.Pri nt Resource.DelaultDocFooler
Установка значения свойства DefaultDocFooter
с помощью Visual Basic
Чтобы установить имя файла колонтитула, присоединяемого ко всем запрашиваемым HTMI.-cграницам, воспользуйтесь колом
Dim Resource As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim DefaultDocumentFooter As String
ServerName - " IIS_Servcr_Name"
SiteTndex - Site Index Value
Det ault Document Fooler " " c: \lcga l_loot ersXcopyi jght .hl in"
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Siteindex & "/ROOT")
Resource.DefaultDocFooter = DefaultDocumentFooter
Resource.SetInfo
Просмотр значения свойства EnableDocFooter с помощью Visual Basic
Активность колонтитула документа можно узнать с помощью кода
Dim Resource As IADs
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name”
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _ & Index & "/ROOT")
Debug.Print Resource.EnableDocFooter
Установка значения свойства EnableDocFooter
с помощью Visual Basic
Если необходимо активизировать присоединение файла колонтитула ко всем запрашиваемым документам HTML, используйте следующий код:
Dim Resource As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim EnableDocumentFooter As Boolean
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
EnableDocumentFooter = True
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Siteindex & "/ROOT")
Resource.EnableDocFooter = EnableDocumentFooter
Resource.Set Infо
Программное управление параметрами вкладки Directory Security
Во вкладке Directory Security диалогового окна свойств IIS (рис. 9.12) можно выбрать метод аутентификации для каждого узла, параметры использования SSL и даже ограничить адреса IP и домены, которые будут иметь доступ к файлам узла.
Скорее всего, администраторы согласятся с утверждением, что устанавливать соответствующие разрешения файлов и каталогов довольно утомительный процесс. После установки разрешений управление доступом осуществляется на основе членства пользователя в группах безопасности Windows NT.
В больших распределенных системах процесс установки необходимых разрешений существенно усложняется. Такие системы требуют детального планирования, тестирования в лабораторной среде и, естественно, превосходной документации. Вместо лабораторных испытаний можно создать сценарий, который после завершения отправляет всю информацию о выполнении определенному пользователю.
Рис. 9.12. Вкладка Directory Security диалогового окна Default Web Site Properties
Методы аутентификации
При установке сервера IIS следует различать разрешения NTFS и метод аутентификации IIS, используемый для проверки прав пользователя. Разработчики, желающие получить безупречное Web-приложение, должны создать пакет распространения IIS. Комбинируя сценарий CALC со средствами управления аутентификацией в ADSI, можно существенно упростить процесс создания нового Web-приложения.
Сервер I1S обеспечивает графический интерфейс для управления методами аутентификации (рис. 9.13). Используя свойства AuthAnonymous, AuthBasic, AuthNTLM и AuthFlags, можно программно управлять конфигурацией выбранного метода аутентификации.
С помощью этих свойств можно программно управлять методами аутентификации выбранного ресурса. При активизированном анонимном доступе IIS будет пы-
Authentication Methods
■ • Select one a mote Auhenhcation Methods let the resource • • •.
! : P SfowAncrym^•■ • ' v: e
(• No User Name^Password requited to access thh resource
[ ‘ : Account used fa Anonymous Access:£dU ■
■ Г* fia« Authorisation (Password« sent in dear Text) i , User Nome end Password required where,
Г;> 'AlowAronymoustscfeabled •
; 'Access is restricted using NTFS Access Control Lists
> Defai* domain la base Authentication1:
( . P WindowsNTChalengeyfiesponse•
.-..• User Name and Password required where .^:?
(■.'Alow Anonymous в rfcabied•?<,.•.•-• = •
;■' *Acx^$isre$tiictedu$ingNTFS Aceet$ConbolUst$\ ".
Puc. 9.13. Диалоговое окно Authentication
Methods
таться использовать учетную запись анонимного пользователя при доступе к ресурсу. Если для какого-то ресурса запрещен анонимный доступ, то появится окно, в котором пользователю будет предложено ввести необходимую идентификационную информацию.
При активизации метода NTLM и соответствующей настройке программы Internet Explorer (автоматическое предоставление идентификационной информации) необходимые права доступа к ресурсу будут проверяться автоматически. В противном случае пользователю нужно будет вручную вводить идентификационную информацию при доступе к ресурсу.
Примечание
В среде, использующей броузеры Internet Explorer или Netscape Navigator (или другой броузер), необходимо активизировать основную (базовую) аутентификацию и аутентификацию NTLM. Такой выбор параметров обеспечивает совместимость практически со всеми существующими типами броузеров. По умолчанию Internet Explorer будет пытаться выполнить запрос, используя аутентификацию NTLM, прежде чем предложит пользователю ввести информацию для базового метода аутентификации.
Просмотр методов аутентификации выбранного ресурса с помощью Visual Basic
Для просмотра метода аутентификации, применяемого для выбранного ресурса, используйте следующий код:
Dim Resource As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = "IIS_Servec_Name"
Siteindex = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _
Siteindex & "/ROOT")
Debug.Print "Authentication Methods for " & Resource.ADsPath & ":"
Debug.Print ""
Debug.Print "Anonymous Access:" & vbTab & vbTab _
Resource.AuthAnonymous
If Resource.AuthAnonymous = True Then
Debug.Print vbTab & "Anonymous User Account Name:" & vbTab _
vbTab & vbTab & vbTab & Resource.AnonymousUsername
Debug.Print vbTab & "Anonymous User Account Password:" _
vbTab & vbTab & vbTab & Resource.AnonymousUserPass
Debug.Print vbTab & "Anonymous User Password Synchronization:"
vbTab & Resource.AnonymousPasswordSync
End If
Debug.Print "Basic Authentication:" & vbTab & Resource.AuthBasic
If Resource.AuthBasic = True Then
Debug.Print vbTab & "Default Authentication Domain:" & vbTab _
vbTab & vbTab & vbTab & Resource.DefaultLogonDomain
End 1 f
Debug.Print "NTLM Authentication:" & vbTab & Resource.AuthNTLM
Анонимный доступ
Для использования анонимного доступа к каталогу необходимо также назначить имя пользователя и пароль, который будет применяться для доступа к каталогу. Для этого можно модифицировать свойства AnonymousUserName, AnonymousUserPass И AnonymousPasswordSync, как показано на рис. 9.14.
Рис. 9.14. Диалоговое окно настройки параметров анонимного доступа
Активизация анонимного доступа с помощью Visual Basic
Для того чтобы активизировать анонимный доступ к выбранному ресурсу, используйте следующий код:
Dim Resource As IADs
Dim ServerName As String
Dim Site Index As Long
Dim EnableAnonymousAccess As Boolean
Dim AnonUserName As String
Dim AnonUserPassword As String
Dim AnonPasswordSync As Boolean
ServerName = " IIS_Server Name"
Siteindex = Site_Index_Value
EnableAnonymousAccess = True
AnonUserName = "Username_for_Anonymous_Access”
AnonUserPassword = " Password_for_Anonymous_A.ccess_Accoun t"
AnonPasswordSync = True
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _
S Siteindex & "/ROOT")
Resource.AuthAnonymous = EnableAnonymousAccess
Resource.AnonymousUsername = AnonUserName
Resource.AnonymousUserPass = AnonUserPassword
Resource.AnonymousPasswordSync = AnonPasswordSync
Resource. Set Info
Базовая аутентификация
Если необходимо разрешить доступ к узлу с помощью броузеров сторонних разработчиков, то используйте базовую аутентификацию. При таком методе пароль передается в сеть в виде простого текста, что, естественно, не обеспечивает необходимой безопасности, как при выборе других методов аутентификации. Базовый метод лучше использовать вместе с безопасным соединением типа SSL.
Для этого метода аутентификации можно выбрать домен по умолчанию, используемый в том случае, если не определен домен, ассоциированный с учетной записью пользователя (рис. 9.15).
Активизация базового метода аутентификации с помощью Visual Basic
Для активизации базового метода аутентификации используйте следующий код:
Dim Resource As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim EnableBasicAuth As Boolean
Dim DefaultLogonDomain As String
ServerName = "IIS Server Name"
Siteindex = Site_Index_Value
EnableBasicAuth = True
DefaultLogonDomain = "Domain Used_for_Authentication"
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex & "/ROOT")
Resource.AuthBasic= EnableBasicAuth
Resource.DefaultLogonDomain = DefaultLogonDomain
Resource.Setinfo
Puc. 9.15. Диалоговое окно Basic Authentication Domain
Аутентификация NTLM
Если в организации повсеместно используется броузер Internet Explorer, можно реализовать метод аутентификации NTLM для всех intranet-узлов. Кроме ограничения на передачу в сети пароля в виде простого текста, аутентификация NTLM также позволяет передавать необходимую достоверную информацию без участия пользователя.
Активизация аутентификации NTLM с помощью Visual Basic
Для активизации аутентификации NTLM воспользуйтесь следующим кодом:
Dim Resource As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim EnableNTLMAuth As Boolean
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
EnableNTLMAuth = True
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _ & Siteindex & "/ROOT")
Resource.AuthNTLM = EnableNTLMAuth
Resource.Setlnfо
Безопасные соединения
После установки сертификата SSL с помощью средства Key Manager можно назначить ключ различным ресурсам и определить аутентификацию клиента, используя программные методы (рис. 9.16).
С помощью параметров этого диалогового окна можно указать узел, который принимает запросы только по безопасному каналу. Кроме этого, можно установить, что все запросы к ресурсу защищены 128-разрядным шифрованием.
Если клиенты имеют сертификаты Х.509, IIS может связать имена пользователей NT с сертификатом клиента для гарантированной идентификации пользователя. Это выполняется с помощью средств Microsoft Management Console (ММС). Несмотря на то что с помощью ADSI нельзя связать учетные записи пользователей с сертификатами
Х.5О9, можно определить поведение по умолчанию (принят, отвергнут, запрошен) сертификатов клиентов для выбранного ресурса (рис. 9.17).
Рис. 9.16. Вкладка Directory Structure диалогового окна Default Web Site Properties (сертификация SSL установлена)
Рис. 9.17. Диалоговое окно Secure Communications
Просмотр конфигурации безопасного подключения с помощью Visual Basic
Каждое свойство SSL выбранного ресурса можно просмотреть с помощью следующего кода:
Dim Resource As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Resource = GetObject ("IIS://" & ServerName & "/W3SVC/" _ & Siteindex & "/ROOT")
Debug.Print "Require SSL:" & vbTab & vbTab & vbTab & vbTab _
vbTab & vbTab & vbTab & Resource.AccessSSL
Debug.Print "Require 128-bit SSL:" & vbTab & vbTab & vbTab _
vbTab & vbTab & Resource.AccessSSLL28
Debug.Print "Map Client Certificates to NT UserIDs:" & vbTab
vbTab & Resource.AccessSSLMapCert
Debug.Print "Negotiate Client Certificates:" & vbTab & vbTab
vbTab & Resource.AccessSSLNegotiateCert
Debug.Print "Require Client Certificates:" & vbTab & vbTab _
vbTab & vbTab & Resource.AccessSSLRequireCert
Установка новой конфигурации безопасного подключения с помощью Visual Basic
Для манипулирования доступными свойствами SSL используйте код
Dim Resource As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Resource = GetObgect("IIS://" & ServerName & "/W3SVC/" _
& Siteindex & "/ROOT")
Resource.AccessSSL = True
Resource.AccessSSL128 = True
Resource.AccessSSLMapCert = True
Resource.AccessSSLNegotiateCert = True
Resource.AccessSSLRequireCert = True
Resource.Set Info
Для управления параметрами диалогового окна ISM используйте данные из табл. 9.5.
Таблица 9.5. Параметры ISM и установка значений свойств
Параметры ISM
Значения свойства
Для доступа к ресурсу необходим безопасный канал
AccessSSL - Тим-
Необходимо 128-разрядное шифрование
AccessSSL128 = True
Не использовать сертификаты клиентов
AccessSSLNegotiateCert = False
Использовать сертификаты клиентов
AccessSSLNegotiateCert = True
Необходимы сертификаты клиентов
AccessSSL = True
AccessSSLNegotiateCert = True
AccessSSLRequireCert = True
Активизировать связь с сертификатом клиента
AccessSSLMapCert = True
Ограничение доступа на основе адресов IP
Используя ограничение адресов IP, можно гарантировать, что определенные клиенты не получат доступ к выбранному ресурсу. Для этого необходимо настроить сервер IIS на отклонение запросов клиентов, представляющих определенный адрес IP в заголовке запроса HTTP, если он совпадает с диапазонами адресов, указанных свойством IPSecurity (рис. 9.18).
Рис. 9.18. Диалоговое окно IP Address and
Domain Name Restrictions
Мо'Жно сконфигурировать сервер IIS для ограничения доступа на основе доменов DNS. Но Microsoft не рекомендует использовать этот метод, поскольку для каждого запроса необходимо выполнять обратное преобразование, что сказывается на производительности.
Безопасность IP необходимо создавать в виде массива адресов IP, которые впоследствии назначаются одному из свойств объекта IPSecurity, перечисленных в табл. 9.6.
Таблица 9.6. Описание свойств объекта IPSecurity
Свойство Описание
IPGrant
Массив разрешенных адресов IP; сохраняется в массиве строк Variant формата IPAddress, Subnet Mask
IPDeny
Массив запрещенных адресов IP; сохраняется в массиве строк variant формата IPAddress, Subnet Mask
DomainGrant
Массив строк, представляющих домены DNS, которым разрешен доступ к ресурсам
DomainDeny
Массив строк, представляющих домены DNS, которым запрещен доступ к ресурсам
Просмотр адресов IP, которым запрещен доступ к ресурсам, с помощью Visual Basic
Для просмотра адреса 1Р и домена DNS, которым запрещен доступ к выбранному узлу, используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim IPSecurity As Variant
ServerName = " I IS_Server_Name”
Siteindex = Site Index Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Siteindex & "/ROOT")
Set IPSecurity = Site.IPSecurity
If IPSecurity.GrantByDefault Then
Debug.Print "All addresses will be allowed, except as follows:"
For Each Entry In IPSecurity.IPDeny
If InStr(l, Entry, ''255.255.255.255") Then
Debug.Print vbTab & "Denied IP: " & vbTab & vbTab _
& Replace(Entry, ", 255.255.255.255", "")
Else,
Debug.Print vbTab & "Denied Subnet: " 4 vbTab & Entry
End If
Next
For Each Entry In IPSecurity.DomainDeny
Debug.Print vbTab & "Denied Domain: " 4 vbTab & Entry
Next■
Else
Debug.Print "All addresses will be blocked, except as follows:"
For Each Entry In IPSecurity.IPGrant
If InStr(l, Entry, "255.255.255.255") Then
Debug.Print vbTab & "Allowed IP: " & vbTab & vbTab _
& Replace(Entry, ", 255.255.255.255", "")
Else
Debug.Print vbTab & "Allowed Subnet: " 4 vbTab & Entry
End If
Next
For Each Entry In IPSecurity.DomainGrant
Debug.Print vbTab & "Allowed Domain: " 4 vbTab 4 Entry
Next
End If
Установка новых адресов IP, которым запрещен доступ к ресурсам, с помощью Visual Basic
Для программного создания новых записей об адресах IP или доменах DNS, которым запрещен доступ к узлу, воспользуйтесь кодом
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim IPSecurity As Variant
Dim IPAddress As String
Dim IPSubnet As String
Dim Domain As String
Dim ActionType As String
ServerName " IIS_Server_Naine"
Siteindex = Site_Index_Value
IPAddress = ’’xxx. xxx. xxx. xxx"
IPSubnet = "xxx.xxx.xxx.xxx"
Domain = "DNS_Domajn.Name"
ActionType “ "GRANTIP"
'ActionType = "GRANTSUBNET"
'ActionType = "GRANTDOMAIN"
'ActionType = "DENYIP"
'ActionType = "DENYSUBNET"
'ActionType = "DENYDOMAIN"
Set Site = GetObject("IIS://" & ServerName 4 "/W3SVC/"
& Siteindex & "/ROOT")
Select Case ActionType
Case "GRANTIP"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False Site.IPSecurity = IPSecurity
Site.Setinfo
IPSecurity.IPGrant = Array(IPAddress & ”, 255.255.255.255") Site.IPSecurity = IPSecurity
Site.Setinfo
Case "GRANTSUBNET"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False IPSecurity.IPGrant = Array(IPAddress & ", " & IPSubnet) Site.IPSecurity = IPSecurity
Site.Setinfo
Case "GRANTDOMAIN"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False IPSecurity.DomainGrant = Array(Domain) Site.IPSecurity = IPSecurity
Site.Setinfo
Case "DENYIP"
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = True
IPSecurity.IPDeny = Array(IPAddress & ", 255.255.255.255") Site.IPSecurity = IPSecurity
Site.Setinfo
Case "DENYSUBNET"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = True IPSecurity.IPDeny = Array(IPAddress & ", " & IPSubnet) Site.IPSecurity = IPSecurity Site.Set Info
Case "DENYDOMAIN"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = True IPSecurity.DomainDeny = Array(Domain) Site.IPSecurity = IPSecurity Site.Setinfo
End Select
Примечание
Для установки нового ограничения адреса IP раскомментируйте необходимое присвоение значения переменной ActionType.
Программное управление параметрами вкладки HTTP Headers
Сервер IIS позволяет настраивать содержимое заголовков HTTP в диалоговом окне, показанном на рис. 9.19. Для программного управления информацией, возвращаемой броузеру в заголовке каждой HTML-страницы, используются свойства HttpExpires, HttpCustomHeaders, HttpPics И MimeMap.
Эти свойства полезны для определения даты истечения срока действия содержимого HTML, а также любой другой заголовочной информации, отсылаемой со всеми HTML-документами. Кроме этого, можно установить уровни RSAC для содержимого отдельного ресурса. И наконец, можно определить список типов MIME, которые должны обновить типы MIME сервера.
Default Web Site PropertiesEE3[|
Web Site | Openers | Perfamance 1 ISAM Filets | Home Dsectcxy Documents " | Directory Se«Ny< : HTTP Headers ,| Custom Errors
-P £n^eContentExpsatron ——™--„^.„.-.„-l™^:,
• portent shoiJd'"'•;Г
Ък ~ I Carx:et | ^йЛ< | H*
Рис. 9.19. Вкладка HTTP Headers диалогового окна Default Web Site Properties
Дата истечения срока действия содержимого
Если вы поддерживаете узел, который постоянно предоставляет клиентам свежую информацию на определенных страницах, то можно установить дату истечения срока действия каталога или группы ресурсов. Благодаря такой настройке, можно предотвратить передачу устаревших данных на броузер клиента или кэшируемый прокси-сервер. Эта возможность особенно полезна при использовании сценариев ASP, получающих доступ к базе данных (предположим, что разработчики еще не установили Response.Expires = 0) для гарантированного динамического обновления содержимого при каждом запросе.
По умолчанию на сервере ITS не устанавливается дата истечения действия содержимого HTTP. Для активизации этого параметра необходимо установить свойство HttpExpires, равное строке одного из форматов, приведенных в табл. 9.7.
Таблица 9.7. Возможные значения свойства Hi tpF.y.pir^s
Строка
Описание
Null
Дата истечения срока действия содержимого не установлена
0, Нех (1время_в_секундах')
Динамическая настройка. Определяется время (в секундах) до окончания срока действия. Чтобы не устанавливать срок действия содержимого, используйте значение о, sHEFEffeff. Для немедленного обновления (рекомендуется в запросах ASP) используйте значение 0, 0
S, UTCString
Определяет дату (в формате UTC) окончания срока действия. Например, можно использовать следующий формат: S, Eri, 10 Sep 1999 00:15:56 GMT
Просмотр текущего значения даты истечения срока действия содержимого с помощью Visual Basic
Для просмотра текущего значения даты истечения срока действия содержимого связанного ресурса используйте следующий код:
Dim Resource As IADs
Dim ServerName As String
Dim Index As Long■
ServerName ~ " IIS_Server_Name"
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _
4 Index & "/ROOT")
Debug.Print Resource.HttpEx.plres
Активизация даты истечения срока действия содержимого с помощью Visual Basic
Чтобы активизировать этот срок, воспользуйтесь кодом
Dim Resource As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim ContentExpiration As String
ServerName = " IIS_Server_Name"
Siteindex = Site_lndex_Value
ContentExpiration = "D, 0"
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/"
4 Siteindex & "/ROOT")
Resource.HttpExpires = ContentExpiration
Resource.Setinfо
Пользовательские заголовки HTTP
Для настройки заголовочной информации, передаваемой клиенту с каждым запросом HTTP, можно создать собственный заголовок HTTP. Для этого используется свойство HttpCustomHeaders, значение которого имеет формат Key: Value.
Просмотр конфигурации пользовательского заголовка HTTP с помощью Visual Basic
Для просмотра значений текущей конфигурации заголовка HTTP используйте следующий код:
Dim Resource As IADs
Dim ServerName As String
Dim Index As Long
ServerName = "IIS Server_Name"
Index =- S i t e_ I t,d<-x Value
Set Resource - i .et (>bject ( " 11S ://" & SeiveiName & "/W3SVC/" _
4 Index & "/ROOT";
For Each HeaderEntry In Resource.HttpCustomHeaders
Debug.Print HeaderEntry
Next
Создание пользовательского заголовка HTTP с помощью Visual Basic
Стандартную заголовочную информацию HTTP можно дополнить собственной. Для этого воспользуйтесь кодом
Dim Resource As IADs
Dim ServerName As String
Dim Index As Long
Dim NewHeaderArray As Variant
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
.NewHeaderArray = Array("HeaderName: Headervalue")
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT")
Resource.HttpCustomHeaders = NewHeaderArray
Resource.Setlnfо
Примечание
Обратите внимание на формат заголовков HTTP: он должен иметь вид Имя: Значение.
Уровни оценок содержимого
В отличие от других средств массовой информации, в World Wide Web можно найти все — от семейных фотографий до способов изготовления взрывчатых веществ. Доступ некоторых групп пользователей (в частности, детей) к вредной для них информации желательно ограничивать. Один из наиболее часто используемых методов фильтрации — это уровень оценки содержимого, или уровень PICS (Platform for Internet Content Selection).
Параметры оценок можно устанавливать как с помощью средств управления сервером 1IS (рис. 9.20), так и с помощью ADSL
Рис. 9.20. Диалоговое окно Content Ratings
Уровни содержимого службы RSACi приведены в табл. 9.8.
Таблица 9.8. Уровни содержимого службы RSACi
Критерий
Уровень
Описание
Насилие
0
Полное отсутствие сиен насилия, несчастных случаев и сиен насилия в дикой природе
Насилие
1
Нанесение увечий или убийства живых существ, нанесение ущерба окружающим объектам
Насилие
2
Нанесение увечий или убийства людей и живых существ; поощрение насилия над безобидными существами
Насилие
3
Нанесение увечий или убийства людей
Насилие
4
Жестокое и бессмысленное насилие
Секс
0
Отсутствие сиен сексуальной активности (романтические или невинные поцелуи)
Секс
1
Страстные поцелуи
Секс
2
Сексуальные ласки без раздевания
Секс
3
Сексуальный контакт без полового акта
Секс
4
Явное изображение полового акта
Обнажение тела
0
Обнажение отсутствует
Обнажение тела
1
Откровенная одежда
Обнажение тела
2
Частичное обнажение
Обнажение тела
3
Полное обнажение
Обнажение тела
4
Полное обнажение с вызывающими позами
Ненормативная лексика
0
Неоскорбительный жаргон; без сквернословия
Ненормативная лексика
1
Неоскорбительная брань; выражения, описывающие естественные функции организма
Ненормативная лексика
2
Умеренные ругательства; выражения по поводу человеческого тела без упоминания половых органов
Ненормативная лексика
3
Противоречащий общепринятым нормам язык; неприличные жесты; выражения с использованием нецензурных эпитетов
Ненормативная лексика
4
Откровенные, оскорбительные, грубые ругательства с выражением ненависти; явное упоминание половых органов
Назначая свойству HttpPics строку определенного формата, можно определить уровень PICS, соответствующий уровню RSACi. Формат этой строки имеет следующий вид:
"PICS-Label: (PICS-1.0 "http://www.rsac.org/ratingsv01.html" 1 by
"contact_e-inail@company.com" on "year.month.dayThour:minute-GMToffset" exp
"year.month.dayThour:minute-GMToffset" r (v n s n n n 1 n))
Рассмотрим пример:
2 января 2001, 13:002 января 2001, 13:00webmastergdot.comЧикаго (Chicago) 2 июня 2001webmastergdot.comЧикаго (Chicago) 2 июня 2001Дата создания Пользователь уровня Расположение
2 января 2001, 13:00
2 января 2001, 13:00
webmastergdot.com
Чикаго (Chicago) 2 июня 2001
webmastergdot.com
Чикаго (Chicago) 2 июня 2001
Дата истечения срока
Насилие
Обнажение тела
Секс
Ненормативная лексика
В результате строка примет вид:
"PICS-Label: (PICS-1.0 "http://www.rsac.org/ratingsv01.html" 1 by "webmaster@dot.com" on "2001.О.02Т13:00-0600" exp "2001.0.02Т12:00-0600" r(vlsln211)) *
Просмотр уровней RSACi ресурса с помощью Visual Basic
Для просмотра уровней RSACi связанного ресурса используйте следующий код:
Dim Resource As IADs'
Dim ServerName As String
Dim Index As Long
Dim Entry As Variant
ServerName = " IIS_Server_Name"■
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Index & "/ROOT")
For Each Entry In Resource.HttpPics
Debug.Print Entry
Next
Установка уровня RSACi ресурса с помощью Visual Basic
Чтобы установить уровень RSACi ресурса, воспользуйтесь кодом
Dim Resource As IADs
Dim ServerName As String
Dim Index As Long
Dim PICSLabel As String
ServerName = " IlS_Server_Name"
Index = Site_Index_Value
PICSLabel = "PICS_Format_String"
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _
& Index & "/ROOT")
Resource.HttpPics = PICSLabel1
Resource.Setinfo•
Примечание
В строке PICS необходимо дважды использовать двойные кавычки:
"PICS-Label: (PICS-1.0 ""http://www.rsac.org/ratingsv01.html"" 1 by
■""webmaster@dot.com"" on ""2000.О.02T13:00-0500"" exp ""2000.0.02112:00-0500"" r (v 1 s 1 n 2 1 1))
Управление типом MIME
Дтя установки типов MIME на уровне ресурсов можно применять синтаксис, аналогичный используемому при определении типов MIME на уровне сервера.
Просмотр определений типов MIME ресурса с помощью Visual Basic
Для просмотра определений типов MIME ресурса используйте следующий код:
Dim Resource As IADs
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
Set Resource = Getobject("IIS://" & ServerName & "/W3SVC/" _ S Index & "/ROOT")
Debug. Print "Registered File Types:"
For Each MimeMapping in Resource.MimeMap
Debug.Print "Extension: " & MimeMapping.Extension _
& " MIME Content Type: " & MimeMapping.MimeType Next
Установки новых типов MIME ресурса с помощью Visual Basic
Чтобы создать новый тип MIME ресурса, воспользуйтесь кодом
Dim Resource As IADs
Dim ServerName As String
Dim Index As Long
Dim MimeMapping As Variant
Dim NewMimeMapping As Variant
Dim MimeExtension As String
Dim MimeType As String .
Dim i As Integer
MimeExtension = "New_MIME_Extension"
MimeType = "New_MIME_ Type"
ServerName = " IIS_Server_Name“
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" _
S Index & "/ROOT")
NewMimeMapping = Resource.GetEx("MimeMap")
i = UBound(NewMimeMapping) + 1
ReDim Preserve NewMimeMapping(i)
Set NewMimeMapping(i) = CreateObject("MimeMap")
NewMimeMapping(i).MimeType = MimeType
NewMimeMapping(i).Extension = MimeExtension
Resource.PutEx ADS_PROPERTY_UPDATE, "MimeMap", NewMimeMapping
Resource.Setinfo
Создание модуля icnaccallsWebManagement
В этом разделе продолжим рассматривать создание начатого в главе 8, “Программное управление метабазой 1IS”, приложения СОМ-сервера IIsAdmin.DLL.
Упражнение 9.1. Создание ilsAdmin.DLL: функции управления Web-сервером
Откройте проект Visual Basic ActiveX DLL IIsAdmin, который вы начали создавать, читая главу 8. Этот проект можно найти по адресу: http:// www.williamspublishing.com.
Добавьте к проекту новый модуль класса. Если вы начали новый проект, то не забудьте установить ссылку на библиотеку Active DS Type Library, используя диа-
логовое окно References, доступ к которому осуществляется с помощью команды Projects References..
Переименуйте новый модуль в IIsWebManagement. Введите следующий код в раздел общих объявлений модуля класса:
Public Function ManageldentityProperty(ByVai Targetcomputer As _ String, ByVai Siteindex As Integer, ByVai Action As String, _ ByVai Identityproperty As String, Optional ByVai NewValue _ As Variant) As Variant On Error Resume Next Dim ArrayElement As Variant Dim NewElement() As Variant Dim i As Integer Dim Site As IADs
Set Site = GetObject("IIS://" & Targetcomputer & "/W3SVC/" _ & Siteindex) Select Case UCase(Action) Case "QUERY"
Select Case UCase(Identityproperty) Case "SERVERCOMMENT"
ManageldentityProperty = Site.Servercomment Case "SERVERBINDINGS"
For Each ArrayElement In Site.ServerBindings i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = ArrayElement
Next
ManageldentityProperty = NewElement Case "SECUREBINDINGS"
For Each ArrayElement In Site.SecureBindings i = UBound(NewElement) + 1•
ReDim Preserve NewElement(i) NewElement(i) = ArrayElement
Next
ManageldentityProperty = NewElement Case "MAXCONNECTIONS"
ManageldentityProperty = Site.Maxconnections Case "CONNECTIONTIMEOUT"
ManageldentityProperty = Site.ConnectionTimeout End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty)'
Case "SERVERCOMMENT"
Err.Number = 0
Site.Servercomment = NewValue
Case "ADDSERVERBINDING" If IsArray(Site.ServerBindings) Then
For Each ArrayElement In Site.ServerBindings i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) ■ ArrayElement
Next
i - UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = NewValue Err.Number = 0
Site.ServerBindings = NewElement Else
Site.ServerBindings = Array(NewValue)
End If
Case "ADDSECUREBINDING"
If IsArray(Site.SecureBindings) Then
For Each ArrayElement In Site.SecureBindings i = UBound(NewElement) + 1
ReDim Preserve NewElement(i) NewElement(i) = ArrayElement
Next
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = NewValue
Err.Number = 0
Site.SecureBindings = NewElement
Else
Site.SecureBindings = Array(NewValue) End If
Case "REMOVEALLSERVERBINDINGS" Site.ServerBindings = Array("") Err.Number = 0
Case "REMOVEALLSECUREBINDINGS"
Err.Number = 0
Site.SecureBindings = Array("")
Case "REMOVESERVERBINDING"
If IsArray(Site.ServerBindings) Then
For Each ArrayElement In Site.ServerBindings If ArrayElement <> NewValue Then
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i) NewElement(i) = ArrayElement End If
Next
Err.Number = 0
Site.ServerBindings = NewElement
Else
If Site.ServerBindings = NewValue Then Err.Number = 0
Site.ServerBindings = Array("")
End If End If Case "REMOVESECUREBINDING"
If IsArray(Site.SecureBindings) Then
For Each ArrayElement In Site.SecureBindings If ArrayElement <> NewValue Then
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i) NewElement(i) = ArrayElement End If
Next
Err.Number = 0
Site.SecureBindings = NewElement Else
If Site.SecureBindings = NewValue Then Site.SecureBindings = Array("")
End If
End If
Case "MAXCONNECTIONS"
Site.MaxConnections = NewValue
Case "CONNECTIONTIMEOUT"
Site.ConnectionTimeout = NewValue End Select Site.Setinfo
If Err.Number = 0 Then ManageldentityProperty = True End If
End Select
End Function
Public Function ManageOperators(ByVai Targetcomputer As String, _
ByVai Siteindex As Integer, ByVai Action As String, _
ByVai Identityproperty As String, Optional ByVai NewValue _
As Variant) As Variant
On Error Resume Next
Dim SecurityDescriptor As Variant
Dim DiscretionaryACL As Variant
Dim ACE As Variant
Dim ArrayElement As Variant
Dim NewElement() As Variant
Dim i As Integer
Dim Site As IADs
Set Site = GetObject("IIS://" & Targetcomputer & "/W3SVC/" _
& Siteindex)
Set SecurityDescriptor = Site.AdminAcl
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty)
Case "OPERATORS"
For Each ArrayElement In DiscretionaryACL
If ArrayElement.AccessMask = 11 Or _
ArrayElement.AccessMask = 262315 Then
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = ArrayElement.Trustee
End If
Next'
ManageOperators = NewElement
End Select
Case "SET"
If NewValue <> "” Then
Select Case UCase(Identityproperty)
Case "NEWOPERATOR"
Set ACE Croat .ЮЬ )м:и"AccessCont rolEnt.i y")
ACE.Trust ее = NewValue
ACE.AccessMask 11
Discret ionaiyACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DiscretionaryACL
Site.AdminAcl = SecurityDescriptor
Case "REMOVEOPERATOR"
Set ACE = CreateObject("AccessControlEntry")
ACE.Trustee = NewValue
ACE.AccessMask = 11
DiscretionaryACL.RemoveAce ACE
SecurityDescriptor.DiscretionaryACL = DiscretionaryACL
Site.AdminAcl = SecurityDescriptor
End Select
Site.Setinfo
If Err.Number = 0 Then ManageOperators = True
End If
End Select
End Function
Public Function ManageAuthenticationMethods(ByVai Targetcomputer _ As String, ByVai Siteindex As Integer, ByValAction As String, _
ByVai Identityproperty As String, Optional ByVai NewValue _ As Variant) As Variant On Error Resume Next Dim Site As IADs Dim Resource As IADs Dim NewElement() As Variant Dim i As Integer
Set Resource = GetObject("IIS://" & Targetcomputer & "/W3SVC/" _ & Siteindex "/ROOT") Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty) Case "ALLAUTHENTICATIONMETHODS" i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = "Anonymous Access Enabled:" _ & Resource.AuthAnonymous If Resource-AuthAnonymous = True Then i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = "Anonymous Username:" _ & Resource.AnonymousUserName i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = "Anonymous User Account Password:" _ & Resource.AnonymousUserPass i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = "Anonymous User Account Password _ Sync Enabled:" & Resource.AnonymousPasswordSync End If i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = "Basic Authentication Enabled:" _ & Resource.AuthBasic If Resource.AuthBasic = True Then
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = "Basic Authentication Default _
Domain:" Resource.DefaultLogonDomain End If i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = "NTLM Authentication Enabled:" _ & Resource.AuthNTLM ManageAuthenticationMethods = NewElement Case "ANONYMOUS"
ManageAuthenticationMethods = Resource.AuthAnonymous Case "BASIC"
ManageAuthenticationMethods = Resource.AuthBasic Case "NTLM"
ManageAuthenticationMethods = Resource-AuthNTLM Case "ANONYMOUSUSERNAME"
ManageAuthenticationMethods = Resource-AnonymousUserName Case "ANONYMOUSUSERPASS"
ManageAuthenticationMethods = Resource-AnonymousUserPass Case "ANONYMOUSPASSWORDSYNC"
ManageAuthenticationMethods = _
Resource-AnonymousPasswordSync
Case "DEFAULTLOGONDOMAIN"
ManageAuthenticationMethods = Resource.DefaultLogonDomain
End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty)
Case "ANONYMOUS"
Resource.AuthAnonymous = NewValue
Case "BASIC"■
Resource.AuthBasic = NewValue
Case "NTLM"
Resource.AuthNTLM = NewValue
Case "ANONYMOUSUSERNAME"
Resource.AnonymousUserName = NewValue
Case "ANONYMOUSUSERPASS"
Resource.AnonymousUserPass = NewValue
Case "ANONYMOUSPASSWORDSYNC"
Resource.AnonymousPasswordSync = NewValue
Case "DEFAULTLOGONDOMAIN"
Resource.DefaultLogonDomain = NewValue
End Select
Resource.Setlnfо
If Err.Number = 0 Then ManageAuthenticationMethods = True End If
End Select
End Function
Public Function MIMETypeManagement(ByVai Targetcomputer As _ String, ByVai Index As Integer, ByVai Action As String, _ Optional ByVai MIMEExtension As String, Optional ByVai _ MIMEType As String) As Variant On Error Resume Next Dim IlsComputer As IADs
Set IlsComputer = GetObject("IIS://" & Targetcomputer _
& "/W3SVC/" & Index s "/ROOT")
Select Case UCase(Action)
Case "ENUMERATE"
Dim MimeMapping As Variant
Dim NewElement () As Variant
Dim i As Long
For Each MimeMapping In IlsComputer.MimeMap
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = MimeMapping.Extension s vbTab _ s MimeMapping.MIMEType
Next
MIMETypeManagement = NewElement
Case "ADD"
If MIMEType <> "" And MIMEExtension <> "" Then Dim NewMimeMapping As Variant NewMimeMapping = IlsComputer.GetEx("MimeMap") i = UBound(NewMimeMapping) + 1 ReDim Preserve NewMimeMapping(i) Set NewMimeMapping(i) = CreateObject("MimeMap") NewMimeMapping(i).MIMEType = MIMEType NewMimeMapping(i).Extension = MIMEExtension IlsComputer.PutEx ADS_PROPERTY_UPDATE, "MimeMap", _ NewMimeMapping Err.Number = 0
IlsComputer.Setinfo
If Err.Number = 0 Then MIMETypeManagement = True Else
MIMETypeManagement = False
End If
Case "REMOVE"
If MIMEExtension <> "" Then
Dim MapToDelete As String
Dim Mimeitem As Variant
NewMimeMapping = IlsComputer.MimeMap
For Each MimeMapping In IlsComputer.MimeMap
If MimeMapping.Extension <> MIMEExtension Then ReDim Preserve NewMimeMapping(i) Set NewMimeMapping(i) = CreateObject("MimeMap") NewMimeMapping(i).MIMEType = MimeMapping.MIMEType NewMimeMapping(i).Extension = MimeMapping.Extension i = i + 1
End If
Next
IlsComputer.PutEx ADS_PROPERTY_UPDATE, "MimeMap", _ NewMimeMapping
Err.Number = 0
IlsComputer.Setinfo
If Err.Number = 0 Then MIMETypeManagement = True Else
MIMETypeManagement = False End If
End Select
End Function
Public Function ManagelPRestrictions(ByVai Targetcomputer As _ String, ByVai Siteindex As Integer, ByVai RelativePath As String, ByVai Action As String, Optional ByVai RestrictAction As String, Optional ByVai Restrict As String, Optional ByVai IPSubnet _ As String) As Variant
On Error Resume Next
Dim Site As IADs
Dim IPSecurity As Variant
Dim NewElement() As Variant
Dim iPAddress As String
Dim ActionType As String
Dim Entry As Variant
Dim i As Integer
Set Site = GetObject("IIS://" & Targetcomputer s "/W3SVC/" _ s Siteindex s RelativePath)
Select Case UCase(Action)
Case "QUERY"
Set IPSecurity = Site.IPSecurity
If IPSecurity.GrantByDefault Then
For Each Entry In IPSecurity.IPDeny
If InStrfl, Entry, "255.255.255.255") Then
i = UBound(NewElement) + 1
ReDim Preserve NewElement (1)
NewElement(i) = "Denied IP:" & Replace(Entry, _ . ", 255.255.255.255", "")
Else
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = "Denied Subnet:" & Entry End If
Next
For Each Entry In IPSecurity.DomainDeny
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = "Denied Domain:" & Entry
Next
Else
For Each Entry In IPSecurity.IPGrant
If InStrfl, Entry, "255.255.255.255") Then
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = "Allowed IP:" & Replace(Entry, _ ", 255.255.255.255", "")
Else
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = "Allowed Subnet:" & Entry End If
Next
For Each Entry In IPSecurity.DomainGrant
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = "Allowed Domain:" & Entry
Next
End If
ManagelPRestrictions = NewElement
Case "SET"
If Restrict <> "" Then
Select Case UCase(RestrictAction) •
Case "GRANTIP"
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = False
Site.IPSecurity = IPSecurity
Site.Setinfo
IPSecurity.IPGrant = Array(Restrict & ", _ 255.255.255.255")
Site.IPSecurity = IPSecurity
Site.Setinfo
If Err.Number = 0 Then ManagelPRestrictions = True
Case "GRANTSUBNET"
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = False
IPSecurity.IPGrant = Array(Restrict & "," & IPSubnet) Site.IPSecurity = IPSecurity
Site.Set Info
If Err.Number = 0 Then ManagelPRestrictions = True
Case "GRANTDOMAIN"
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = False
IPSecurity.DomainGrant = Array(Restrict)
Site.IPSecurity = IPSecurity
Site.Setinfo
If Err.Number = 0 Then ManagelPRestrictions = True
Case "DENYIP"
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = True
IPSecurity.IPDeny = Array(Restrict & ", 255.255.255.255") Site.IPSecurity = IPSecurity
Site.Setinfo
If Err.Number = 0 Then ManagelPRestrictions = True
Case "DENYSUBNET"
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = True
IPSecurity.IPDeny = Array(Restrict & "," & IPSubnet) Site.IPSecurity = IPSecurity
Site.Setinfo
If Err.Number = 0 Then ManagelPRestrictions = True Case "DENYDOMAIN"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = True IPSecurity.DomainDeny = Array(Restrict) Site.IPSecurity = IPSecurity Site.Setinfo
If Err.Number = 0 Then ManagelPRestrictions = True End Select
End If
End Select
End Function
Public Function ManagePerformanceProperty(ByVai Targetcomputer _ As String, ByVai Siteindex As Integer, ByVai Action As String, _ ByVai Identityproperty As String, Optional ByVai NewValue _ As Variant) As Variant
Dim Site As IADs
Set Site = GetObject("IIS://" & TargetComputer & "/W3SVC/" _
& Siteindex)
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty)
Case "SERVERSIZE"
ManagePerformanceProperty = Site.ServerSize
Case "MAXBANDWIDTH"
ManagePerformanceProperty = Site.MaxBandwidth
Case "ALLOWKEEPALIVE"
ManagePerformanceProperty = Site.AllowKeepAlive Case "HTTPEXPIRES"
Set Site = GetObject("IIS://" & Targetcomputer _
& "/W3SVC/" Siteindex & "/ROOT")
ManagePerformanceProperty = Site.HttpExpires End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty)
Case "SERVERSIZE"
Site.ServerSize = NewValue
Case "MAXBANDWIDTH"
Site.MaxBandwidth = NewValue
Case "ALLOWKEEPALIVE"
Site.AllowKeepAlive = NewValue Case "HTTPEXPIRES"
Set Site = GetObject("IIS://" & Targetcomputer _ & /W3SVC/" & Siteindex & "/ROOT")
Site.HttpExpires = NewValue
End Select
Site.Setinfo
If Err.Number = 0 Then ManagePerformanceProperty = True End If
End Select
End Function
Public Function ManageHomeDirectoryProperty(ByVai Targetcomputer As String, ByVai Siteindex As Integer, ByVai RelativePath As _ String, ByVai Action As String, ByVai Identityproperty As _ String, Optional ByVai NewValue As Variant) As Variant
Dim Resource As IADs
Set Resource = GetObject("IIS://" & Targetcomputer & "/W3SVC/" & Siteindex "/ROOT" & RelativePath)
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty)
Case "PATH"
ManageHomeDirectoryProperty = Resource.Path
Case "UNCUSERNAME"
ManageHomeDirectoryProperty = Resource.UNCUserName
Case "UNCPASSWORD"
ManageHomeDirectoryProperty = Resource.UNCPassword
Case "ACCESSREAD"
ManageHomeDirectoryProperty = Resource.AccessRead
Case "ACCESSWRITE"
ManageHomeDirectoryProperty = Resource.AccessWrite
Case "DONTLOG"
ManageHomeDirectoryProperty = Resource.DontLog
Case "ENABLEDIRBROWSING"
ManageHomeDirectoryProperty = Resource.EnableDirBrowsing Case "CONTENTINDEXED"
ManageHomeDirectoryProperty = Resource.ContentIndexed Case "FRONTPAGEWEB"
Set Resource = GetObject(Resource.Parent)
ManageHomeDirectoryProperty = Resource.FrontPageWeb
Case "HTTPREDIRECT"
ManageHomeDirectoryProperty = Resource.HttpRedirect End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty)
Case "PATH"
Resource.Path = NewValue
Case "UNCUSERNAME"
Resource.UNCUserName = NewValue
Case "UNCPASSWORD"
Resource.UNCPassword = NewValue
Case "ACCESSREAD"
Resource.AccessRead = NewValue
Case "ACCESSWRITE"
Resource.AccessWrite = NewValue
Case "DONTLOG"
Resource.DontLog = NewValue
Case "ENABLEDIRBROWSING"
Resource.EnableDirBrowsing = NewValue
Case "CONTENTINDEXED"
Resource.Content Indexed = NewValue
Case "FRONTPAGEWEB"
Set Resource = GetObject(Resource.Parent)
Resource.FrontPageWeb = NewValue
Case "HTTPREDIRECT"
Resource.HttpRedirect = NewValue End Select
Resource.Set Info
If Err.Number = 0 Then ManageHomeDirectoryProperty = True End If
End Select
End Function
Public Function ManageApplicationProperty(ByVai Targetcomputer _ As String, ByVai Siteindex As Integer, ByVai Relativepath As _ String, ByVai Action As String, ByVai Identityproperty As _ String, Optional ByVai NewValue As Variant) As Variant
Dim Resource As IADs
Set Resource = GetObject("IIS://" & Targetcomputer & "/W3SVC/" _
Siteindex "/ROOT"' & Relativepath)
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty)
Case "APPFRIENDLYNAME"
ManageApplicationProperty = Resource.AppFriendlyName
Case "APPROOT"
ManageApplicationProperty = Resource.AppRoot
Case "APPISOLATED"
ManageApplicationProperty = Resource.Applsolated
Case "ACCESSREAD"
ManageApplicationProperty = Resource.AccessRead
Case "ACCESSEXECUTE"
ManageApplicationProperty = Resource.AccessExecute
Case "ASPSESSIONTIMEOUT"
ManageApplicationProperty = Resource.AspSessionTimeout
Case "ASPBUFFERINGON"
ManageApplicationProperty = Resource.AspBufferingOn
Case "ASPENABLEPARENTPATHS"
ManageApplicationProperty = Resource.AspEnableParentPaths
Case "ASPSCRIPTLANGUAGE"
ManageApplicationProperty = Resource.AspScriptLanguage
Case "ASPSCRIPTTIMEOUT"
ManageApplicationProperty = Resource.AspScriptTimeout
Case "ASPLOGERRORREQUESTS"
ManageApplicationProperty = Resource.AspLogErrorRequests
Case "ASPEXCEPTIONCATCHENABLE"
ManageApplicationProperty = _
Resource.AspExceptionCatchEnable
Case "ASPSCRIPTENGINECACHEMAX"
ManageApplicationProperty = _ ' Resource.AspScriptEngineCacheMax
Case "ASPSCRIPTFILECACHESIZE"
ManageApplicationProperty = Resource.AspScriptFileCacheSize Case "CGITIMEOUT"
Set Resource = GetObject(Resource.Parent)
ManageApplicationProperty = Resource.CGlTimeout
Case "APPALLOWDEBUGGING"
ManageApplicationProperty = Resource.AppAllowDebugging
Case "APPALLOWCLIENTDEBUG"
ManageApplicationProperty = Resource.AppAllowClientDebug
Case "ASPSCRIPTERRORSENTTOBROWSER"
ManageApplicationProperty = _
Resource.AspScriptErrorSentToBrowser
Case "ASPSCRIPTERRORMESSAGE"
ManageApplicationProperty = Resource.AspScriptErrorMessage End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty)
Case "APPFRIENDLYNAME"
Resource.AppFriendlyName = NewValue
Case "APPROOT"
Resource.AppRoot = NewValue
Case "APPISOLATED"
Resource.Applsolated = NewValue
Case "ACCESSREAD"
Resource.AccessRead = NewValue
Case "ACCESSEXECUTE"
Resource.AccessExecute = NewValue
Case "ASPSESSIONTIMEOUT"
Resource.AspSessionTimeout = NewValue
Case "ASPBUFFERINGON"
Resource.AspBufferingOn = NewValue
Case "ASPENABLEPARENTPATHS"
Resource.AspEnableParentPaths = NewValue
Case "ASPSCRIPTLANGUAGE"
Resource.AspScriptLanguage = NewValue
Case "ASPSCRIPTTIMEOUT"
Resource.AspScriptTimeout = NewValue
Case "ASPLOGERRORREQUESTS"
Resource.AspLogErrorRequests = NewValue
Case "ASPEXCEPTIONCATCHENABLE"
Resource.AspExceptionCatchEnable = NewValue
Case "ASPSCRIPTENGINECACHEMAX"
Resource.AspScriptEngineCacheMax = NewValue
, Case "ASPSCRIPTFILECACHESIZE"
Resource.AspScriptFileCacheSize = NewValue
Case "CGITIMEOUT"
Set Resource = GetObject(Resource.Parent) Resource.CGITimeout = NewValue
Case "APPALLOWDEBUGGING"
Resource.AppAllowDebugging = NewValue
Case "APPALLOWCLIENTDEBUG"
Resource.AppAllowClientDebug = NewValue
Case "ASPSCRIPTERRORSENTTOBROWSER"
Resource.AspScriptErrorSentToBrowser = NewValue
Case "ASPSCRIPTERRORMESSAGE"
Resource.AspScriptErrorMessage = NewValue End Select
Resource.Set Info
If Err.Number = 0 Then ManageApplicationProperty = True End If
End Select
End Function
Public Function ManageSSLConfigProperty(ByVai Targetcomputer _
As String, ByVai Siteindex As Integer, ByVai RelativePath As _ String, ByVai Action As String, ByVai Identityproperty As _ String, Optional ByVai NewValue As Variant) As Variant
Dim Resource As IADs
Set Resource - GetObject("IIS://" & Targetcomputer & "/W3SVC/" _
Siteindex "/ROOT" & RelativePath)
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty)
Case "ACCESSSSL"
ManageSSLConfigProperty = Resource.AccessSSL
Case "ACCESSSSL128"
ManageSSLConfigProperty = Resource.AccessSSL128
Case "ACCESSSSLMAPCERT"
ManageSSLConfigProperty = Resource.AccessSSLMapCert
Case "ACCESSSSLNEGOTIATECERT"
ManageSSLConfigProperty = Resource.AccessSSLNegotiateCert
Case "ACCESSSSLREQUIRECERT"
ManageSSLConfigProperty = Resource.AccessSSLRequireCert End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty)
Case "ACCESSSSL"
Resource.AccessSSL = NewValue Case "ACCESSSSL128"
Resource.AccessSSL128 = NewValue Case "ACCESSSSLMAPCERT"
Resource.AccessSSLMapCert = NewValue
Case "ACCESSSSLNEGOTIATECERT"
Resource.AccessSSLNegotiateCert = NewValue
Case "ACCESSSSLREQUIRECERT"
Resource.AccessSSLRequireCert = NewValue End Select
Resource.Setinfo
If Err.Number = 0 Then ManageSSLConfigProperty = True End If
End Select End Function
Public Function ManageDefaultDocumentProperty(ByVai Targetcomputer As String, ByVai Siteindex As Integer, ByVai RelativePath As _ String, ByVai Action As String, ByVai Identityproperty As _ String, Optional ByVai NewValue As Variant) As Variant
Dim Site As IADs,
Set Site = GetObject("IIS://" & Targetcomputer & "/W3SVC/" _'
Siteindex & "/ROOT" & RelativePath) Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty)
Case "ENABLEDEFAULTDOC"
ManageDefaultDocumentProperty = Site.EnableDefaultDoc Case "DEFAULTDOC"
ManageDefaultDocumentProperty = Site.DefaultDoc Case "DEFAULTDOCFOOTER"
ManageDefaultDocumentProperty = Site.DefaultDocFooter Case "ENABLEDOCFOOTER"
ManageDefaultDocumentProperty = Site.EnableDocFooter End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty)
Case "ENABLEDEFAULTDOC" *
Site.EnableDefaultDoc = NewValue
Case "DEFAULTDOC"
Site.DefaultDoc = NewValue
Case "DEFAULTDOCFOOTER"■4
Site.DefaultDocFooter = NewValue
Case "ENABLEDOCFOOTER"
Site.EnableDocFooter = NewValue
End Select
Site.Setinfo
If Err.Number = 0 Then ManageDefaultDocumentProperty = True End If
End Select
End Function
Public Function ManageHTTPHeaderProperty(ByVai Targetcomputer As _ String, ByVai Siteindex As Integer, ByVai RelativePath As String, _ ByVai Action As String, ByVai Identityproperty As String, Optional ByVai NewValue As Variant) As Variant On Error Resume Next Dim Resource As IADs Dim ArrayEntry As Variant Dim NewElement() As Variant
Dim i As Integer
Set Resource = GetObject("IIS://" & Targetcomputer & "/W3SVC/" & Siteindex "/ROOT" & RelativePath)
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty)
Case "HTTPCUSTOMHEADERS"
For Each ArrayEntry In Resource.HttpCustomHeaders
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = ArrayEntry
Next
ManageHTTPHeaderProperty = NewElement
Case "PICSRATING"
For Each ArrayEntry In Resource.HttpPics
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = ArrayEntry
Next
ManageHTTPHeaderProperty = NewElement
End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty)
Case "HTTPCUSTOMHEADERS"
If IsArray(Resource.HttpCustomHeaders) Then
For Each ArrayEntry In Resource.HttpCustomHeaders i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = ArrayEntry
Next
i = UBound(NewElement) t 1
ReDim Preserve NewElement(i)
NewElement(i) = NewValue
Resource.HttpCustomHeaders = NewElement
Err.Number = 0
Else
Resource.HttpCustomHeaders = Array(NewValue)
End If
Case "PICSRATING"
Resource.HttpPics = Array(NewValue)
End Select
Resource.Setinfo
If Err.Number = 0 Then ManageHTTPHeaderProperty = True End If
End Select
End Function
Public Function CreatePICSLabel(ByVai ResponsiblePartyEMail As _ String, ByVai ExpirationDate As Date, ByVai violenceRating As _ Integer, ByVai SexRating As Integer, Byval NudityRating As _ Integer, ByVai LanguageRating As Integer) As String
Dim PicsExpirationDate As String
Dim PicsCurrentDate As String
PicsExpirationDate = Year(ExpirationDate) & "." _
S (Month(ExpirationDate)) & ." & Day(ExpirationDate) _
S "T12:00-0000"
PicsCurrentDate = Year(Date) & "." & (Month(Date)) & "." _
& Day(Date) & "T12:00-0000"
CreatePICSLabel = "PICS-Label:(PICS-1.0""http://www.rsac.org/ ratingsv01.html"" 1 by""" & ResponsiblePartyEMail & """ on""" _
& PicsCurrentDate & """ exp""" & PicsExpirationDate & """ r ((v" & ViolenceRating S " s" & SexRating & " n" & NudityRating & " 1"
& LanguageRating & "))"
End Function
Скомпилируйте код в виде IlsAdmin.DLL.
Сохраните и закройте проект IIsAdmin.
Совет
Код проекта, а также скомпилированную его версию можно найти по адресу: http: //ww.williamspublishing.сот..
Использование функций модуля IIsWebManagement
После создания модуля класса IIsWebManagement можно использовать его функции практически из любого языка программирования, который поддерживает автоматизацию OLE, например Visual Basic, VBScript или JavaScript.
Совет
Создание экземпляра объекта и необходимый синтаксис приведены в главе 3. Не забудьте изменить имя класса на IIsWebManagement, где это необходимо.
В табл. 9.9 приведен синтаксис каждого метода интерфейса IIsWebManagement.
Таблица 9.9. Синтаксис методов интерфейса IIsWebManagement
Действие
Синтаксис
Просмотр/установка комментариев сервера
ManageldentityProperty("Server_Name", 1, "Query", "Servercomment")
ManageldentityProperty("Server_Name", 1, "Set", "Servercomment", "Default Web Site")
Просмотр/установка связей For Each Binding In ManageldentityProperty (
сервера
"Server_Name", 1, "Query", "ServerBindings") Debug.Print Binding
Next
ManageldentityProperty("Server_Name", 1, "Set", "AddServerBinding", "127.0.0.1:81:")
ManageldentityProperty("Server_Name", 1, "Set", "RemoveAllServerBindings")
ManageldentityProperty("Server_Name", 1, "Set", "RemoveServerBinding", "127.0.0.1:81:")
Просмотр/установка безопасного соединения
For Each Binding In ManageldentityProperty( "Server_Name", I, "Query", "SecureBindings")
Debug.Print Binding
Next
ManageldentityProperty("Server_Name", 1, "Set", "AddSecureBinding", "127.0.0.1:445:")
ManageldentityProperty("Server_Name", 1, "Set", "RemoveAHSecureBindings")
ManageldentityProperty("Server_Name", 1, "Set", "RemovesecureBinding", "127.0.0.1:445:")
Действие
Синтаксис
Просмотр/установка максимального числа подключений
ManageldentityProperty("Server_Name", 1, "Query", "MaxConnections")
ManageldentityProperty("Server_Name", 1, "Set", "MaxConnections", 1000)
Просмотр/установка соединения
ManageldentityProperty("Server_Name", 1, "Query", "ConnectionTimeout")
ManageldentityProperty("Server_Name", 1, "Set", "ConnectionTimeout", 900)
Перечисление операторов узла
For Each Operator In ManageOperators("Server_Name", 1, "Query", "Operators")
Debug.Print Operator
Next
Управление операторами узла
ManageOperators("Server_Name", 1, "Set", "NewOperator", "Server_Name\Administrator")
ManageOperators("Server_Name", 1, "Set", "Removeoperator", "Server_Name\Administrator")
Перечисление методов аутентификации ресурса
For Each Item In ManageAuthenticationMethods( "Server_Name", 1, "Query", "AllAuthenticationMethods")
Debug.Print Item
Next
Просмотр свойств метода аутентификации для выбранного ресурса
ManageAuthenticationMethods("Server_Name", 1, "Query", "Anonymous")
ManageAuthenticationMethods("Server_Name", 1, "Query", "Basic")
ManageAuthenticationMethods("Server_Name", 1, "Query", "NTLM")
ManageAuthenticationMethods("Server_Name", 1, "Query", "AnonymousUserName")
ManageAuthenticationMethods("Server_Name", 1, "Query", "AnonymousUserPass")
ManageAuthenticationMethods(”Server_Name", 1, "Query", "AnonymousPasswordSync")
ManageAuthenticationMethods("Server_Name", 1, "Query", "DefaultLogonDomain")
Установка свойств метода аутентификации для выбранного ресурса
ManageAuthenticationMethods("Server Name", 1, "Set", "Anonymous", Fa .Iso)
ManageAuthenticat.ionMethods ("Server Name", 1, "Set", "Basic", False)
ManageAuthenticationMethods("Server Name", 1, "Set", "NTLM", False)
ManageAuthenticationMethods("Server_Name", 1, "Set", "AnonymousUserName", "Server_Name\IUSR_Server_Name")
Действие
Синтаксис
ManageAuthenticationMethods("Server_Name", 1,,"Set", "AnonymousUserPass", "u327eshf2sa!")
ManageAuthenticationMethods("Server_Name", 1, "Set", "AnonymousPasswordSync", True)
ManageAuthenticationMethods("Server_Name", 1, "Set", "Default LogonDoma in", "User_Doma in_Name")
Перечисление типов MIME, специфичных для определенного узла
For Each Item In
Obj.MIMETypeManagement("IIS_Server_Name", "Enumerate")
Debug.Print Item
Next
Добавление нового типа MIME, специфичного для определенного узла
Удаление нового типа MIME, специфичного для определенного узла
Просмотр ограничений 1Р
MIMETypeManagement("IIS_Server_Name", "Add", ".Extension", "Application/Type")
MIMETypeManagement("IIS_Server_Name", "Remove", ".Extension")
For Each Item In ManagelPRestrictions("Server_Name",
1, "/ROOT", "Query")
Debug.Print Item
Next
Отказ в доступе всем, за исключением определенного адреса IP
Отказ в доступе всем, за исключением определенной подсети
Отказ в доступе всем, за исключением определенного домена DNS
ManagelPRestrictions("Server_Name", 1, "/ROOT", "Set", "GrantIP", "xxx.xxx.xxx.xxx")
ManagelPRestrictions("Server_Name", 1, "/ROOT", "Set", "GrantSubnet", "xxx.xxx.xxx.xxx", "xxx.xxx.xxx.0")
ManagelPRestrictions("Server_Name", 1, "/ROOT", "Set", "GrantDomain", "DNS_Domain")
Разрешение доступа всем, за исключением определенного адреса IP
Разрешение доступа всем, за исключением определенной подсети
ManagelPRestrictions("Server_Name", 1, "/ROOT", "Set", "DenyIP", "xxx.xxx.xxx.xxx")
ManagelPRestrictions("Server_Name", 1, "/ROOT", "Set", "DenySubnet", "xxx.xxx.xxx.xxx", "xxx.xxx.xxx.0")
Разрешение доступа всем, за исключением определенного домена DNS
ManagelPRestrictions("Server_Name", 1, "/ROOT", "Set", "DenyDomain", "DNS_Domain")
Просмотр свойств производительности
ManagePerformanceProperty("Server_Name", 1, "Query", "ServerSize")
ManagePerformanceProperty("Server_Name", 1, "Query", "MaxBandwidth")
ManagePerformanceProperty("Server_Name", 1, "Query", "AllowKeepAlive")
ManagePerformanceProperty("Server_Name", 1, "Query", "HttpExpires")
Действие
Синтаксис
Установка свойств производительности
ManagePerformanceProperty("Server_Name", 1, "Set", "Serversize", 1)
ManagePerformanceProperty("Server_Name", 1, "Set", "MaxBandwidth", 104856)
ManagePerformanceProperty("Server_Name", 1, "Set", "AllowKeepAlive", False)
ManagePerformanceProperty("Server_Name", 1, "Set", "HttpExpires", "D,60")
Просмотр свойств личного каталога
ManageHomeDirectoryProperty("Server_Name", 1, "", "Query", "Path")
ManageHomeDirectoryProperty("Server_Name", 1, "", "Query", "UNCUsername")
ManageHomeDirectoryProperty("Server_Name", 1, "", "Query", "UNCUserPass")
ManageHomeDirectoryProperty("Server_Name", 1, "", "Query", "AccessRead")
ManageHomeDirectoryProperty("Server_Name", 1, "", "Query", "AccessWrite")
ManageHomeDirectoryProperty("Server_Name", 1, "", "Query", "DontLog")
ManageHomeDirectoryProperty("Server_Name", 1, "", "Query", "EnableDirBrowsing")
ManageHomeDirectoryProperty("Server_Name", 1, "", "Query", "ContentIndexed")
ManageHomeDirectoryProperty("Server_Name", 1, "", "Query", "FrontPageWeb")
ManageHomeDirectoryProperty("Server_Name", 1, "", "Query", "HttpRedirect")
Установка свойств личного каталога
ManageHomeDirectoryProperty("Server_Name", 1, "", "Set", "Path", "c:\inetpub\wwwroot") [Local]
ManageHomeDirectoryProperty("Server_Name", 1, "", "Set", "Path", "\\servername\share") [Remote]
ManageHomeDirectoryProperty("Server_Name", 1, "", "Set", "UNCUsername", "Server_Name\administrator")
ManageHomeDirectoryProperty("Server_Name", 1, "", "Set", "UNCUserPass", "sih93f91hfsNA")
ManageHomeDirectoryProperty("Server_Name", 1, "", "Set", "AccessRead", True)
ManageHomeDirectoryProperty("ServerName", 1, "",
"Set", "AccessWrite", True)
ManageHomeDirectoryProperty("Server_Name", 1, "", "Set", "DontLog", False)
ManageHomeDirectoryProperty("Server_Name", 1, "", "Set", "EnableDirBrowsing", True)
ManageHomeDirectoryProperty("Server_Name", 1, "", "Set", "ContentIndexed", True)
Действие
Синтаксис
ManageHomeDirectoryProperty("Server_Name", 1, "", "Set", "FrontPageWeb", True)
ManageHomeDirectoryProperty("Server_Name", 1, "", "Set", "HttpRedirect", "SiteName,FLAG")
Просмотр свойств приложения
ManageApplicationProperty("Server_Name", 1, "", "Query", "AppFriendlyName")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AppRoot")
ManageApplicationProperty("Server_Name", 1, "", "Query", "Applsolated")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AccessRead")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AccessExecute")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AspSessionTimeout")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AspBufferingOn")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AspEnableParentPaths")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AspScriptLanguage")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AspScriptTimeout")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AspLogErrorRequests")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AspExceptionCatchEnable")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AspScriptEngineCacheMax")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AspScriptFileCacheSize")
ManageApplicationProperty("Server_Name", 1, "", "Query", "CGITimeout")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AppAllowDebugging")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AppAllowCllentDebug")
ManageApplicationProperty("Server_Name", 1, "",
"Query", "AspSctiptErrorSentToBrowser")
ManageApplicationProperty("Server_Name", 1, "", "Query", "AspScriptErrorMessage")
Установка свойств приложения
ManageApplicationProperty("Server_Name", 1, "", "Set", "AppFriendlyName", "Default Application")
ManageApplicationProperty("Server_Name", 1, "", "Set", "AppRoot", "/LM/W3SVC/1/ROOT")
ДействиеСинтаксис
ManageApplicationProperty("Server_Name", 1, "”, "Set", "Applsolated", False) ManageApplicationProperty("Server_Name", 1, "", "Set", "AccessRead", False) ManageApplicationProperty("Server_Name", 1, ”", "Set", "AccessExecute", False) ManageApplicationProperty("Server_Name", 1, ””, "Set", "AspSessionTimeout", 60)
•ManageApplicationProperty("Server_Name", 1, "",
"Set", "AspBufferingOn", True) ManageApplicationProperty("Server_Name", 1, "", "Set", "AspEnableParentPaths", True) ManageApplicationProperty("Server_Name", 1, "", "Set", "AspScriptLanguage”, "VBScript") ManageApplicationProperty("Server_Name", 1, ”", "Set", "AspScriptTimeout", 360) ManageApplicationProperty("Server_Name", 1, "", "Set", "AspLogErrorRequests", False) ManageApplicationProperty("Server_Name", 1, ”", "Set", "AspExceptionCatchEnable", False) ManageApplicationProperty("Server_Name", 1, "", "Set", "AspScriptEngineCacheMax", 60) ManageApplicationProperty("Server_Name", 1, "", "Set", "AspScriptFileCacheSize", 1024) ManageApplicationProperty("Server_Name", 1, "", "Set", "CGITimeout", 300) ManageApplicationProperty("Server_Name", 1, "”, "Set", "AppAllowDebugging", True) ManageApplicationProperty("Server_Name", 1, "", "Set", "AppAllowClientDebug", True) ManageApplicationProperty("Server_Name", 1, "", "Set", "AspScriptErrorSentToBrowser", False) ManageApplicationProperty("Server_Name", 1, "”, "Set", "AspScriptErrorMessage", "An error has occurred. Please call the corporate technical support center at x9321")
Просмотр свойств конфи- ManageSSLConfigProperty ("Server_Name", 1, "", гурации SSL"Query", "AccessSSL")
■ ManageSSLConfigProperty("Server_Name", 1, "", "Query", "AccessSSL128") ManageSSLConfigProperty("Server_Name", 1, "", "Query", "AccessSSLMapCert") ManageSSLConfigProperty("Server_Name", 1, "", "Query", "AccessSSLNegotiateCert") ManageSSLConfigProperty("Server_Name", 1, "”, "Query", "AccessSSLRequireCert")
Действие
Синтаксис
Установка свойств конфигурации SSL
ManageSSLConfigProperty("Server_Name", 1, "", "Set", "AccessSSL", False)
ManageSSLConfigProperty("Server_Name", 1, "", "Set", "AccessSSL128", False)
ManageSSLConfigProperty("Server_Name", 1, "", "Set", "AccessSSLMapCert", False)
ManageSSLConfigProperty("Server_Name", 1, "", "Set", "AccessSSLNegotiateCert", False)
ManageSSLConfigProperty("Server_Name", 1, "", "Set", "AccessSSLRequireCert", False)
Просмотр свойств документа и колонтитулов по умолчанию
ManageDefaultDocumentProperty("Server_Name", 1, "", "Query", "DefaultDoc")
ManageDefaultDocumentProperty("Server_Name", 1, "", "Query", "EnableDefaultDoc")
ManageDefaultDocumentProperty("Server_Name", 1, "", "Query", "DefaultDocFooter")
ManageDefaultDocumentProperty("Server_Name", 1, "", "Query", "EnableDocFooter")
Установка свойств документа и колонтитулов по умолчанию
ManageDefaultDocumentProperty("Server_Name", 1, "", "Set", "DefaultDoc", "default.asp")
ManageDefaultDocumentProperty("Server_Name", 1, "", "Set", "EnableDefaultDoc", True)
ManageDefaultDocumentProperty("Server_Name", 1, "", "Set", "DefaultDocFooter",
"C:\lnetpub\wwwroot\LegalFooter.htm")
ManageDefaultDocumentProperty("Server_Name", 1, "", "Set", "EnableDocFooter", True)
Просмотр конфигурации пользовательского заголовка HTTP
For Each Header In ManageHTTPHeaderProperty( "Server_Name", 1, "", "Query", "HttpCustomHeaders”)
Debug.Print Header
Next
Добавление нового пользовательского заголовка
ManagcH'l’TPHnadnrl’roperty ("Server_Name", 1 , "", "Set", "HttpCustomHeaders", "CustomHeaderl: True")
HTTP
Просмотр уровней RSACi/PlCS выбранного ресурса
For Each Header in ManageHTTPHeaderProperty( "Server_Name", 1, ”", "Query", "PicsRating") Debug.Print Header
Next
Установка нового уровня RSACi/PICS выбранного ресурса
Dim PICSLabel As String PICSLabel = CreatePICSLabel( "thomas.eck@wdr.com", #1/1/2001#, 0, 0, 0, 0)
ManageHTTPHeaderProperty("Server_Name", 1, "", "Set", "PicsRating", PICSLabel)
Резюме
С помощью ADSI и модели объектов сервера IIS можно управлять конфигурацией Web-узла. Совместное использование ADSI и Visual Basic существенно упрощает манипулирование конфигурацией следующих вкладок диалогового окна свойств в IIS 4.0 Internet Service Manager:
Web Site;
Operators;
Performance;
Home Directory;
Documents;
Directory Security; .
HTTP Headers.
Используя ADSI, нельзя управлять параметрами вкладки Custom Errors. Более подробные сведения можно найти в документации к ADSI SDK и серверу IIS.
С помощью приведенных фрагментов кода можно создать приложение, используемое для настройки вновь созданного Web-узла или управления уже существующим.
10
Программное управление FTP-узлом
Повсеместное распространение Web-технологии привело к появлению довольно сложной проблемы — требовался простой и безопасный способ помещения данных на узел. Многие компании и крупные провайдеры Internet для решения этой проблемы используют протокол передачи файлов (File Transfer Protocol — FTP).
Для программного управления службой IIS FTP корпорация Microsoft предлагает более 60 свойств. Независимо от реализации FTP-узла (отдельный или часть сложного механизма публикации в Web), можно использовать ADS1 для программного управления параметрами следующих вкладок свойств:
FTP Site;• Home Directory;
Security Accounts;• Directory Security.
Messages;
В этой главе речь идет о программном администрировании службы IIS FTP. А в конце главы описана последняя часть создаваемого СОМ-сервера IIsAdmin.DLL, посвященная этой службе.
Определение наследуемых свойств
В табл. 10.1 приведен список свойств, которые можно использовать на каждом уровне метабазы IIS. Эти данные помогут вам при разработке необходимых приложений администрирования, т.е. вы не вызовете то свойство, которое не поддерживается на выбранном уровне метабазы I1S. Например, свойство ServerComment доступно только на уровне объекта llsFTPServer, а объект IIsFTPVirtualDir его не поддерживает.
Таблица 10.1. Свойства, поддерживаемые интерфейсами llsFTPServer и IIsFTPVirtualDir
Свойство
llsFTPServer
IIsFTPVirtualDir
AccessFlags
+
+
AccessRead
+
+
AccessWrite
+
+
AdminACL
+
—
AllowAnonymous
+
—
AnonymousOnly
+
—
Свойство
IIsFTPServerIIsFTPVirtualDir
AnonymousPasswordSync
AnonymousUserName AnonymousUserPass ConnectionTimeout
+-
+-
+-
DefaultLogonDomain DontLog ExitMessage GreetingMessage IPSecurity LogAnonymous LogExtFileBytesRecv LogExtFileBytesSent LogExt Fil eClient Ip LogExt Fi1eComputerName LogExtFileCookie LogExtFileDate LogExtFileFlags LogExtFileHttpstatus LogExtFi1eMethod LogExtFileProtocolVersion LogExtFileReferer LogExtFileserverIp LogExtFileserverPort LogExtFileSiteName LogExtFileTime LogExt Fi1eT imeTaken LogExtFileUriQuery LogExtFileUriStem LogExtFileUserAgent LogExtFileUserName LogExtFileWin32Status LogFileDirectory LogFilePeriod LogFileTruncateSize LogNonAnonymous LogOdbcDataSource LogOdbcPassword LogOdbcTableName LogOdbcUserName
+ - + + + - + - + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + — + - + - + - + - + -
296
Часть III. Исследование провайдеров ADSI: IIS
Свойство
IIsFTPServerIIsETPVirtualDir
LogPluginClsId
+-
LogType
+-
MaxClientsMessage
+-
MaxConnections
+-
MaxEndpointConnections
+-
MSDOSDirOutput
+-
Path
-+
Realm
+-
ServerAutoStart
+-
ServerBindings
+-
ServerComment
+-
ServerListenBacklog
+-
ServerListenTimeout
+-
ServerSize
+-
Serverstate
+-
UNCPassword
-+
UNCUserName
+
Программное управление параметрами вкладки FTP Site
Во вкладке FTP Site (рис. 10.1) можно ввести описание, адрес 1Р, порт TCP, число подключений и параметры ведения журнала FTP-узла.
Default FTP Site Properties
I ^У^е1 Security Accounts J Messages | Home Directory | Directory Security |V-
Identification
description:joelault FTP Site-.
|P Address: ^Un^rgned)"~~~3■: i
ICPPat [21;
Connection •-■ : .■ ■
■ C y*M *>p
: <• Limited TapOO.OOOconnections .
’ Connection Timeout |900 seconds • <,'
17 Enable Logging *~
Actrve log format.,ч-'> :
|W3C Extended log File Format*| Properties... 1 ‘/
'Current Sessions I
j OK ~| Cancel | &pp|y | .Help
Puc. 10.1. Вкладка FTP Site диалогового окна Default FTP Site Properties
С помощью параметров этой вкладки можно настроить основную идентификацию узла. Как и для Web-узла, можно назначить альтернативный порт TCP или адрес IP, что позволит создавать несколько FTP-узлов на одном сервере. Обратите внимание, что для FTP-узла, в отличие от Web-узла, нельзя настраивать заголовки. На первый взгляд это покажется существенным ограничением, но, назначив уникальный порт TCP каждому FTP-узлу и создав Web-страницу со ссылкой на этот узел, вы получите простой доступ к нему из броузера.
Управление свойствами идентификации узла
В группе Identification можно ввести описание сервера, а также выбрать используемые адрес IP и порт TCP. Каждый узел должен использовать уникальные значения для последних двух параметров.
Управление описанием FTP-узла
Для управления описанием FTP-узла можно воспользоваться значением свойства Servercomment.
Совет
Значения этого свойства могут быть одинаковыми — идентификация узла в метабазе осуществляется с помощью его индекса, а не значения свойства Servercomment. Несмотря на это, все же старайтесь не использовать одинаковые описания узлов.
Просмотр значения свойства Servercomment с помощью Visual Basic
Для просмотра текущего описания FTP-узла используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
Index = Site_Index_Integer
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" S Index)
Debug.Print Site.Servercomment
Установка нового значения свойства Servercomment с помощью Visual Basic
Для ввода нового описания FTP-узла воспользуйтесь кодом
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
Dim NewServerComment as String
ServerName = *4IS_Server_Name"
Index = Site_Index_Integer
NewServerComment = ”New_Server_Comment_String"
Set Site = GetObject("IIS://" S ServerName & "/MSFTPSVC/" S Index)
Site.Servercomment = NewServerComment
Site.setinfo
Управление адресом IP и портом TCP
Если параметры адреса IP и порта TCP одного узла аналогичны параметрам другого, то сервер IIS не позволит запустить последний узел. FTP-узлы не поддерживают заголовков, поэтому необходимо использовать комбинацию уникальных параметров адреса IP и порта TCP для каждого узла на сервере.
Следует отметить, что для нескольких FTP-узлов на одном сервере можно использовать одинаковый адрес IP, но обязательно назначить уникальный порт TCP. Но в таком случае невозможно получить доступ к узлам с альтернативными портами TCP (не 21) с помощью некоторых программ-клиентов FTP. Это связано с тем, что в таких программах реализована “жесткая” привязка к порту с номером 21.
Например, используя клиент FTP командной строки из поставки Windows NT, можно определять альтернативный порт только при использовании команды Open, как показано ниже.
C:\>ftp
ftp> open Server_Name 5000 Connected to Server_Name.
220 Server_Name Microsoft FTP Service (Version 4.0).
User (Server_Name:(none)): anonymous
331 Anonymous access allowed, send identity (e-mail name) as password. Password:
230 Anonymous user logged in. ftp>
А при вводе команды
C:\>ftp server_name
устанавливается соединение с узлом, которому назначен порт TCP с номером 21.
Чтобы избежать ввода порта TCP, можно использовать уникальные адреса IP, а также создать необходимые записи DNS для каждого FTP-узла. В таком случае пользователю не требуется запоминать порт узла, а нужно лишь вводить его имя.
Управление адресом IP и портом TCP осуществляется с помощью свойства ServerBindings. Значения этого свойства представляют массив строк, каждая из которых имеет следующий формат:
IP_Address:TCP_Port:
Просмотр значения свойства ServerBindings с помощью Visual Basic
Для просмотра используемого адреса IP и порта TCP связанного FTP-узла используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" S ServerName S "/MSFTPSVC/" _
Siteindex)
For Each Binding In Site.ServerBindings Debug.Print Binding
Next
Установка нового значения свойства ServerBindings с помощью Visual Basic
Установить новое значение адреса 1Р и порта TCP можно, воспользовавшись кодом
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim NewBindingArray As Variant
Dim IPAddress As String
Dim TCPPort As Long
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
IPAddress = ’’xxx. xxx. xxx. xxx”
TCPPort = TCP_Port_Number
NewBindingArray = Array(IPAddress & ":" & TCPPort & ":") Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _ & Siteindex)
Site.ServerBindings = NewBindingArray■
Site.Setinfo
Управление свойствами соединения
Чтобы не перегружать сервер, можно ограничить число подключений к выбранному FTP-узлу. Для программного управления этим параметром используется свойство MaxConnections интерфейса IIsFTPService.
Просмотр максимального числа подключений с помощью Visual Basic
Для просмотра максимального числа подключений выбранного узла используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
Dim RetVal As Long
ServerName = " IIS_Server_Name”
Index = Site_Index
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _
Index)
RetVal = Site.MaxConnections
Debug.Print RetVal
Совет
Неограниченное число подключений соответствует значению свойства MaxConnections, равному 2 000 000 000.
Установка максимального числа подключений с помощью Visual Basic
Чтобы установить максимальное число подключений выбранного FTP-узла, используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
Dim NewMaxConnections As Long
ServerName = "IIS_Server_Name"
Index = Site_Index
NewMaxConnections = Maximum_Number_of_Connections
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _
Index)
Site.MaxConnections = NewMaxConnections
Site.Setinfo
Управление временем ожидания соединения
Для определения времени ожидания (в секундах) перед закрытием FTP-соединения МОЖНО использовать СВОЙСТВО ConnectionTimeout.
Просмотр значения времени ожидания с помощью Visual Basic
Для просмотра времени, в течение которого FTP-соединение остается открытым, воспользуйтесь кодом
Dim Site As IADs
Dim ServerName As String
Dim Index As Long
Dim RetVal As Long
ServerName = " lIS_Server_Name"
Index = Site_Index
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _ 6 Index)
RetVal = Site.ConnectionTimeout
Debug.Print RetVal
Установка нового значения времени ожидания с помощью Visual Basic
Чтобы установить новое значение (в секундах) времени ожидания перед закрытием FTP-соединения, используйте следующий код:
Dim Site As IADs■■
Dim ServerName As String
Dim Index As Long
Dim ConnectionTimeout As Long
ServerName = " IIS_Server_Name"
Index = Site_Index_Value'
NewConnectionTimeout = Connection_Timeout_in_Seconds
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _ 6 Index)
Site.ConnectionTimeout = NewConnectionTimeout
Site.Setinfo
Программное управление параметрами вкладки Security Accounts
Во вкладке Security Accounts (рис. 10.2) можно настраивать параметры анонимного доступа к узлу, а также операторов, имеющих право на изменение конфигурации узла.
Настройка анонимного соединения
Активизация анонимной регистрации на общедоступном FTP-узле позволяет внешним пользователям получать доступ к ресурсам FTP-сервера без определения наборов параметров регистрации для каждого из них. При этом любой пользователь может зарегистрироваться на FTP-узле под именем anonymous. В результате этому пользователю будут доступны все файлы, доступ к которым разрешен пользователям анонимной учетной записи. Если анонимный доступ закрыт, пользователь должен ввести имя и пароль, существующие в Windows NT.
Несмотря на это, Microsoft рекомендует использовать для доступа к FTP-узлу исключительно анонимную учетную запись, поскольку в этом случае аутентификационная информация передается в сети открытым текстом; эту информацию без особого труда могут извлечь злоумышленники.
Впилишие
Несмотря на рекомендации Microsoft, имя пользователя анонимной учетной записи и пароль с помощью ADSI можно просмотреть в виде текста, при этом безопасность подвергается более существенному риску по сравнению с угрозой взлома с помощью метода “прослушивания” сети. Таким образом, анонимная учетная запись должна иметь строго ограниченные разрешения в файловой системе.
В группе параметров Allow Anonymous Connections вкладки Security Accounts можно активизировать или деактивизировать анонимный доступ к ресурсам узла, выбрать учетную запись, от имени которой будет выполняться анонимный доступ, запретить все неанонимные подключения, а также синхронизацию пароля учетной записи анонимного пользователя.
Рис. 10.2. Вкладка Security Accounts диалогового окна Default FTP Site Properties
Активизация анонимного доступа к FTP-узлу
Для программного управления анонимным доступом к FTP-узлу используется свойство AllowAnonymous, которое может принимать значения True и False. При установке значения этого свойства равным True разрешается доступ к узлу пользователю с именем anonymous; a False — только пользователям, зарегистрированным в Windows NT и имеющим соответствующие разрешения.
Просмотр значения свойства AllowAnonymous с помощью Visual Basic
Для определения возможности использования анонимного доступа к FTP-узлу используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name”
Siteindex = Site_lndex_Value
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _ & Siteindex)
Debug.Print Site.AllowAnonymous
Установка нового значения свойства AllowAnonymous с помощью Visual Basic
Чтобы активизировать или деактивизировать анонимный доступ к FTP-узлу, воспользуйтесь кодом
Dim Site As IADS'
Dim ServerName As String Dim Siteindex As Long■
ServerName = " IIS_Server_Name" Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" 4 ServerName 4 "/MSFTPSVC/" _ 4 Siteindex)
Site.AllowAnonymous = False
Site.Setinfo
Определение учетной записи пользователя для анонимного доступа
При активизации анонимного доступа к узлу необходимо также выбрать учетную запись, используемую для этого типа доступа. Хотя сервер IIS и создает учетную запись Ш5К_имя_компьютера, можно выбрать любую другую существующую учетную запись, которая имеет необходимые разрешения NTFS для доступа к файлам. В безопасной системе необходимо создать учетную запись с соответствующими правами, а не.использовать общеизвестную учетную запись Ш5К_имя_компъютера.
После выбора учетной записи анонимного пользователя необходимо установить соответствующие ACL каждого ресурса файловой системы, к которой будет открыт доступ из FTP-узла или виртуального каталога. Программный выбор учетной записи анонимного пользователя осуществляется с помощью свойств AnonymousUsername и AnonymousUserPass. Чтобы активизировать автоматическую синхронизацию пароля между метабазой I1S и базой SAM Windows NT, установите значение свойства AnonymousPasswordSync в True.
Просмотр значений параметров учетной записи анонимного пользователя с помощью Visual Basic
Для просмотра имени пользователя и пароля учетной записи анонимного пользователя используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value•
Set Site = GetObject("IIS://" 4 ServerName & "/MSFTPSVC/" _ 4 Siteindex)
Debug.Print Site.AnonymousUsername
Debug.Print Site.AnonymousUserPass
Debug.Print Site.AnonymousPasswordSync
Установка новых значений параметров учетной записи анонимного пользователя с помощью Visual Basic
Для установки нового набора параметров учетной записи анонимного пользователя воспользуйтесь кодом
Dim Site As IADS
Dim ServerName As String
Dim Siteindex As Long
Dim AnonymousUserName As String
Dim AnonymousUserPassword As String
ServerName = ” IIS_Server_Name"
Siteindex = Site_Index_Value
AnonymousUserName = ”Username_for_Anonymous_FTP_Access"
AnonymousUserPassword = "Password_for_Anonymous_User_Account"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _
& Siteindex)
Site.AnonymousUsername = AnonymousUserName
Site.AnonymousUserPass = AnonymousUserPassword
Site.AnonymousPasswordSync = True Site.Setinfo
Настройка исключительно анонимного доступа
Итак, вы активизировали анонимный доступ. Но кроме него вы можете использовать и собственную учетную запись как для доступа к узлу, так и для выполнения необходимых действий. Таким образом, ваш пароль можно извлечь при передаче его по сети. Чтобы предотвратить подобного рода взлом, Microsoft реализовала свойство AnonymousOnly для исключительно анонимного доступа к FTP-узлу. Это свойство может принимать значения True и False.
Просмотр значения свойства AnonymousOnly с помощью Visual Basic
Чтобы определить возможность “неанонимного” подключения, используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _
& Siteindex)
Debug.Print Site.AnonymousOnly
Установка нового значения свойства AnonymousOnly
с помощью Visual Basic
Для того чтобы установить исключительно анонимный доступ к FTP-узлу, используйте код
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _
& Siteindex)
Site.AnonymousOnly = True
Site.Setinfo
Операторы FTP-узла
По умолчанию все локальные администраторы могут управлять всеми свойствами в метабазе 11S. Кроме этого, можно определить дополнительных операторов узла, создав новые записи АСЕ в ACL.
Просмотр операторов FTP-узла с помощью Visual Basic 1
Для просмотра списка текущих операторов FTP-узла используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName * " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _
6 Siteindex)■
Set SecurityDescriptor = Site.AdminAcl
Set DiscretionaryAcI = SecurityDescriptor.DiscretionaryAcI
For Each Item In DiscretionaryAcI
If Item.AccessMask = 11 Or Item.AccessMask = 262315 Then
Debug.Print Item.Trustee
End If
Next
Регистрация нового оператора FTP-узла с помощью Visual Basic
Чтобы зарегистрировать нового оператора FTP-узла, воспользуйтесь кодом
Dim Site As IADs
Dim ACE As Variant
Dim DiscretionaryACL As Variant
Dim ServerName As String
Dim Siteindex As Long
Dim NewOperator As String
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
NewOperator = "New_Cperator_in_Format_Domain\Username"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _ 6 Siteindex)
Set SecurityDescriptor = Site.AdminACL
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject("AccessControlEntry")
ACE.Trustee = NewOperator.
ACE.AccessMask = 11
DiscretionaryACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DiscretionaryACL
Site.AdminACL = SecurityDescriptor,
Site.Setinfo
Программное управление параметрами вкладки Messages
При успешном подключении или отключении FTP-сессии клиенту можно отображать различные сообщения. Во вкладке Messages (рис. 10.3) можно создать три типа сообщений FTP-узла: приветствие (Welcome), выход (Exit) и превышение числа подключений (Maximum Connections).
Для программного управления этими параметрами используются свойства GreetingMessage, ExitMessage И MaxClientsMessage.
DcMull FTF* Site P«ipe<tiMирг
t 'H£$te|jB«GtfyAceM&^M^DbtWSe^’l '^V/-
&^HP$«Me«ege8^^-^—-«x-J—,•<-'Velcomr ’ / • *' -, • j
:' Welcome to ftp.eCoMmerce2000.coMl1
. ?- Using this site, you can download our^U'
x.-'' •" analysis of E-Commerce technologicalJ
.-.enhancements for the financial industry. j ••
•- .-Feel free to navigate to the Public th; directory to download our latest reports.
•j. If you should require technical assistance, please feel free to drop us an e-mail at
; ftp_techsupporteecommerce2000 com।
• [Thanke for visiting ftp.eCommerce2000/сом - M^^Conrectiont;p
|the maximum number^oT connect ions for this sit| i.,
/'V- ,^2 Г в* 1 Cancel | Appfc> |H^>
Рис. 10.3. Вкладка Messages диалогового окна Default FTP Site Properties
Сообщение-приветствие
Этот тип сообшения отображается при успешной аутентификации на FTP-узле. Данное значение хранится в метабазе в виде массива строк свойства GreetingMessage. Каждая строка массива отображается как отдельная строка текста, например:
C:\>ftp server_name
Connected to server_name.eCommerce2000.com.
220 server_name Microsoft FTP Service (Version 4.0).
User (aerver_name.eCommerce2000.com:(none)): anonymous
331 Anonymous access allowed, send identity (e-mail name) as password. Password:
230-Welcome to ftp.eCommerce2000.com!
230-
230-Using this site, you can download our
230-analysis of E-Commerce technological
230-enhancements for the financial industry.
230-
230-Feel free to navigate to the Public
230-directory to download our latest reports.
230-
230-If you should require technical assistance,
230-please feel free to drop us an e-mail at 230-ftp_techsupport@ecoinmerce2000. com
230 Anonymous user logged in.
ftp>
Просмотр текущего сообщения-приветствия с помощью Visual Basic
Для просмотра текущего сообщения-приветствия, отображаемого при успешном подключении, используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IlS_Server_Name’’
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName 4 "/MSFTPSVC/" _
6 Siteindex)
For Each MessageLine In Site.GreetingMessage Debug.Print MessageLine
Hext
Установка нового текущего сообщения-приветствия с помощью
Visual Basic
Чтобы установить новое сообщение-приветствие, отображаемое при успешном подключении, необходимо создать массив строк, как показано ниже.
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IlS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" 4 ServerName 4 "/MSFTPSVC/" _
4 Siteindex)
Site.GreetingMessage = Array("Greeting_Line_l", _
"Greeting_Line_2","Greeting_Line_3")
Site.Setinfo
Сообщение о выходе
В отличие от приветствия, сообщение о выходе представляет собой одну строку, отображаемую непосредственно перед окончанием FTP-сессии, например:
ftp> bye
221 Thanks for visiting ftp.eCommerce2000.com
Для программного управления этим типом сообщения используется свойство ExitMessage.
Просмотр текущего сообщения о выходе с помощью Visual Basic
Для просмотра строки, отображаемой перед разрывом FTP-соединения, используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" 4 ServerName 4 "/MSFTPSVC/" _ 4 Siteindex)
Debug.Print Site.ExitMessage.
Установка нового сообщения о выходе с помощью Visual Basic
Чтобы создать строку сообщения, отображаемую непосредственно перед окончанием FTP-сессии, воспользуйтесь кодом
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim NewExitMessageString As String
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value.
NewExitMessageString = " FTP_Session_Termination_Text"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _
& Siteindex)
Site.ExitMessage = NewExitMessageString
Site.Setinfo
Сообщение о превышении числа подключений
Если пользователь пытается подключиться к узлу, у которого превышено число подключений, появляется соответствующее сообщение, в котором ему, например, предлагается посетить зеркальный узел или же просто приносятся извинения:
Connected to server_name.ecommerce2000.com.
421 The maximum number of connections for this site has been reached. Please visit our mirror site at ftp2.ecommerce2000.com
Connection closed by remote host.■
Для программного управления этим типом сообщения используется свойство MaxClient sMessage.
Просмотр текущего сообщения о превышении числа подключений с помощью Visual Basic
Для просмотра текущего сообщения, отображаемого при превышении числа подключений, используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _
& Siteindex)
Debug.Print Site.MaxClientsMessage
Создание нового сообщения о превышении числа подключений с помощью Visual Basic
Для программного создания нового сообщения о превышении числа подключений воспользуйтесь кодом
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim MaxConnectionsString As String
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
MaxConnectionsString =
" Strj.ng_Passed_To_Client_When_Maxj.mum_Connectj.ons_Reached"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _.
& Siteindex)-
Site.MaxClientsMessage = MaxConnectionsString
Site.Setinfo
Программное управление параметрами вкладки Ноте Directory
С помощью параметров вкладки Home Directory (рис. 10.4) можно выбрать расположение личного каталога FTP-узла: на локальном или удаленном компьютере. При выборе последнего параметра также следует указать необходимую аутентификационную информацию для доступа к этому ресурсу.
Default FTP Site PropertiesПЕЗ
FTPStej Security Accounts | Messages HomeDirectory | Directory Security |
When connecting to this гекмсе. the Garment shocid come from:■
^ ajfredorykreeted on ttit computer^
• г _• '. • Г a sh& Jddaled on another eoinpMJ :\;y ;^
: FTP Site Directory.'^гЛ
Local Pattu |CAInetPub\ftproot ^2™J^^2—-j
- A P Bead
> ■ ■ ■ ■ : П >i6te
j ■ P LogAgeeu . . siv. •..
: Directory LMng Styte ;~;^.ц.™,.^^:^....^...^
^ UNK* ■^■ ■.
V Г MS-DOS* / i4 . ” As- ^^А^Ж^ VM
OK| Cancel .’ |&*& I - ' *^
Рис. 10.4. Вкладка Home Directory диалогового окна Default FTP Site Properties (выбран локальный компьютер)
Кроме этого, можно определить разрешения для доступа к виртуальному каталогу, а также режим отображения списка — стиль MS DOS или UNIX.
Локальный личный каталог
Для доступа к содержимому, хранящемуся на локальном компьютере, необходимо установить значение свойства Path. В приведенных примерах кода демонстрируется настройка пути к корневому виртуальному каталогу, но вы можете использовать любой существующий виртуальный каталог, незначительно изменив код.
Просмотр локального пути корневого виртуального каталога FTP- узла с помощью Visual Basic
Для просмотра текущего пути, ассоциированного с выбранным FTP-узлом, используйте следующий код:
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
Dim RetVal As String
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName _
& "/MSFTPSVC/" & Index & "/ROOT")
RetVal = VirtualDirectory.Path
Debug.Print RetVal
Модификация локального пути корневого виртуального каталога
FTP-узла с помощью Visual Basic
Чтобы программно изменить месторасположение существующего корневого виртуального каталога FTP-узла, воспользуйтесь кодом
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
Dim NewVirtualDirPath As String
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
NewVirtualDirPath = "New_Path_for_Site"
Set VirtualDirectory = GetObject("IIS://" & ServerName
& "/MSFTPSVC/" & Index 6 "/ROOT")
VirtualDirectory.Path = NewVirtualDirPath
VirtualDirectory.Setinfo
Удаленный личный каталог
Для доступа к содержимому, расположенному на удаленном компьютере, следует установить значение свойства Path в формате UNC (например, \\Server_Name\Share_Name), а также определить необходимую аутентификационную информацию с помощью свойств UNCUserName и UNCPassword. Пример использования удаленного виртуального каталога в окне Internet Server Manager показан на рис. 10.5. .
HPStel Security Accounts | Meteagee Home D«c*xy] Directory Security |. Whenconnectingto thh resource, thecontent ehouldcome from:.
■s :;r-.-j > r^ejrectory located on thit computer/
•<’^ о «harejoeaied on another compute* . V
., ^FTP Sie Diectory --:-.---.— • -
J Nehygrk Share: [vSetw^^CpyectM./ |
i1:‘ ‘/
PiogAsca» ■. //./у
-D»ectotyLi»lrigSl*—:— '——-^^.s^„4
.1, ff UN%»; ■
OlMSOOS* . Л V'
Просмотр удаленного пути корневого виртуального каталога FTP-узла и аутентификационной информации с помощью Visual Basic
Для просмотра удаленного пути корневого виртуального каталога FTP-узла и аутентификационной информации используйте код
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
Dim RetVal As String
ServerName = "IIS_Server_№me"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName _
4 "/MSFTPSVC/" & Index & "/ROOT")
Debug.Print VirtualDirectory.Path
Debug.Print VirtualDirectory.UNCUserName
Debug.Print VirtualDirectory.UNCPassword
Внимание
Для доступа к удаленному каталогу необходимо знать имя пользователя и пароль.
Не используйте в свойствах UNCUserName и UNCPassword привилегированные учетные записи.
Модификация удаленного пути корневого виртуального каталога FTP-узла и аутентификационной информации с помощью Visual Basic
Программное изменение удаленного пути корневого виртуального каталога FTP- узла и всех необходимых параметров аутентификации можно выполнить с помощью следующего кода:
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
Dim NewVirtualDirPath As String
Dim NewVirtualDirUser As String
Dim NewVirtualDirPassword As String
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
NewVirtualDirPath = " New_Path_for_Site"
NewVirtualDirUser = " UNC_Credentials_Used_ro_Establish_Connection" NewVirtualDirPassword = _
"UNC_Credentj.als_Used_To_Establj.sh_Connectj.on"
Set VirtualDirectory = GetObject("IIS://" 6 ServerName _ i "/MSFTPSVC/" & Index & "/ROOT")
VirtualDirectory.Path = NewVirtualDirPath
VirtualDirectory.UNCUserName = NewVirtualDirUser
VirtualDirectory.UNCPassword = NewVirtualDirPassword
VirtualDirectory.Setinfo
Разрешения для доступа к каталогу
Сервер 1IS использует разрешения NTFS для управления доступом к ресурсам. Но существует возможность еще более ограничить разрешения, присваивая соответствующее значение типа Boolean свойствам AccessRead и AccessWrite связанного ресурса.
Свойства AccessRead и AccessWrite накладывают дополнительные ограничения на файловую систему NTFS. Например, если разрешения NTFS учетной записи пользователя не позволяют записывать в каталог, то, несмотря на разрешающее значение свойства Accesswrite, вы все равно не сможете выполнить запись в каталог. А если пользователю разрешена запись в файловую систему, он сможет осуществлять ее только в том случае, если значение свойства AccessWrite установлено в True. .
Кроме того, с помощью соответствующего значения свойства DontLog можно активизировать или деактивизировать ведение журнала.
Просмотр разрешений на доступ к каталогу и состояния журнала с помощью Visual Basic
Для определения возможности считывания или записи в каталог, а также ведения журнала воспользуйтесь кодом
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
Dim RetVal As String
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName _
& "/MSFTPSVC/" & Index & "/ROOT")
Debug.Print "Read:" & vbTab & vbTab & vbTab & vbTab _
VirtualDirectory.AccessRead
Debug.Print "Write:" & vbTab & vbTab & vbTab & vbTab _
VirtualDirectory.AccessWrite
Debug.Print "Logging Disabled:" & vbTab & vbtab _ s VirtualDirectory.DontLog
Установка разрешений на доступ к каталогу и параметров журнала с помощью Visual Basic
Для этого установите соответствующие значения свойств AccessRead, AccessWrite и DontLog, используя следующий код:
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
Dim RetVal As String
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName _
& "/MSFTPSVC/" & Index & "/ROOT")
VirtualDirectory.AccessRead = True
VirtualDirectory.AccessWrite = True
VirtualDirectory.DontLog = False
VirtualDirectory.Setinfo
Стиль отображения списка каталога
Сервер IIS включает два способа форматирования отображаемого списка каталога. Рассмотрим существующие между ними различия.
Стиль MS DOS:
ftp> dir *.exe
200 PORT command successful.
150 Opening ASCII mode data connection for /bin/ls.
11-05-97
03:25PM
20480 aceclcab.exe
06-02-98
07: 4 4 AM
44544 clspack.exe
10-27-97
06:19PM
38784 cpsdir.exe
03-18-99
08:09PM
100864 extract.exe
09-09-99
03:16PM
2 6896 hh.ex.e
03-18-99
08:09PM
17655 iextract.exe
08-26-97
12:06PM
315904 IsUninst.exe
06-02-98
07:29AM
154112 jview.exe
06-02-98
07:41AM
42496 setdebug.exe
06-13-97
06:46AM
298496 uninst.exe
10-14-96
02:38AM
22288 welcome.exe
06-02-98
07:2 9AM
147456 wjview.exe
226 Transfer complete.
618 bytes received in 0.02 seconds (30.90 Kbytes/sec) ftp>
Стиль UNIX:
ftp> dir *.exe
200 PORT command successful.
150 Opening
AS(
211 mode
data connection
for /bin/ls.
-r-xr-xr-x
1
owner
group
20480 Nov 5 1997 aceclcab.exe
-r-xr-xr-x
1
owner
group
44544 Jun 21998 clspack.exe
-r-xr-xr-x
1
owner
group
38784 Oct 27 1997 cpsdir.exe
-r-xr-xr-x
1
owner
group
100864 Mar 18 20:09 extract.exe
-r-xr-xr-x
1
owner
group
26896 Sep 9 15:16 hh.exe
-r-xr-xr-x
1
owner
group
17655 Mar 18 20:09 iextract.exe
-r-xr-xr-x
1
owner
group
315904 Aug 26 1997 IsUninst.exe
-r-xr-xr-x
1
owner
group
154112 Jun 21998 jview.exe
-r-xr-xr-x
1
owner
group
42496 Jun 21998 setdebug.exe
-r-xr-xr-x
owner
group
298496 Jun 13 1997 uninst.exe
-r-xr-xr-x
1
owner
group
22288 Oct 14 1996 welcome.exe
-r-xr-xr-x
1
owner
group
147456 Jun 2 1998 wjview.exe
226 Transfer
complete.
858 bytes received in 0
.29 seconds (2.
96 Kbytes/sec)
Для выбора стиля отображения списка содержимого каталога используйте свойство MSDOSDirOutput. При установке его значения в True применяется стиль MS DOS (он устанавливается по умолчанию). Но лучше использовать стиль UNIX, который обеспечивает пользователя более подробной информацией о содержимом каталога.
Просмотр стиля отображения списка содержимого каталога с помощью Visual Basic
Для просмотра используемого в настоящее время стиля отображения списка содержимого каталога используйте следующий код:
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName
"/MSFTPSVC/" & Index)
Debug.Print VirtualDirectory.MSDOSDirOutput
Установка стиля отображения списка содержимого каталога с помощью Visual Basic
Чтобы установить новый стиль отображения списка содержимого каталога, определите необходимое значение свойства MSDOSDirOutput, используя код
Dim VirtualDirectory As IADs
Dim ServerName As String
Dim Index As Long
ServerName = " IIS_Server_Name”
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" 6 ServerName _
"/MSFTPSVC/" & Index)
VirtualDirectory.MSDOSDirOutput = False
VirtualDirectory.SetInfо
Программное управление параметрами вкладки Directory Security
Для включения или исключения определенных узлов на основе их адресов 1Р можно использовать параметры вкладки Directory Security (рис. 10.6).
Рис. 10.6. Вкладка Directory Security диалогового окна Default FTP Site Properties
Если в вашей организации необходимо построить Великую Китайскую стену между подразделениями, то можно запретить отдельным подсетям или доменам DNS получать доступ к определенным ресурсам intranet. Хотя такого рода защиту довольно просто обойти, изменив необходимые параметры адресации 1Р, ее можно использовать как передний край обороны внутренней сети от несанкционированного доступа.
Ограничения адресов 1Р, например, гарантирует, что узел разработчиков с анонимным доступом будет доступен лишь разработчикам. Это достигается путем про-
стого включения в список компьютеров, имеюших доступ к узлу, адресов 1Р рабочих станций разработчиков.
Описанный способ реализации безопасности можно создать с помощью массива адресов IP, а следовательно, назначив одно из свойств объекта ipsecurity, приведенных в табл. 10.2.
Таблица 10.2. Свойства ipsecurity
Свойство
Описание
IPGrant
Массив адресов IP с разрешенным доступом; сохраняется в виде массива строк в формате iPAddress, Subnet Mask
IPDeny
Массив адресов IP с запрещенным доступом; сохраняется в виде массива строк в формате iPAddress, Subnet Mask
DomainGrant
Массив строк, представляющих домены DNS, с разрешенным доступом к ресурсам
DomainDeny
Массив строк, представляющих домены DNS, с запрещенным доступом к ресурсам
Теперь, после небольшой теоретической подготовки, пора рассмотреть примеры кода.
Впилишие
Для ограничения доступа не рекомендуется использовать домены DNS. Это связано в первую очередь с потерей производительности при поиске сервера DNS.
Просмотр текущих ограничений адресов IP с помощью Visual Basic
Для просмотра текущих ограничений адресов IP и доменов DNS выбранного узла используйте следующий код:
Dim Site As IADs
Dim ServerName As String
Dim Siteindex As Long
Dim IPSecurity As Variant
ServerName = " IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" 6 ServerName 6 "/MSFTPSVC/" _ i Siteindex 6 "/ROOT")
Set IPSecurity = Site.IPSecurity
If IPSecurity.GrantByDefault Then
Debug.Print "All addresses will be allowed, except as follows:" For Each Entry In IPSecurity.IPDeny
If InStrd, Entry, "255.255.255.255") Then
Debug.Print vbTab 6 "Denied IP: " 6 vbTab 6 vbTab _
6 Replace(Entry, ", 255.255.255.255", ") Else
Debug.Print vbTab & "Denied Subnet: " 6 vbTab S Entry End If
Next
For Each Entry In IPSecurity.DomainDeny
Debug.Print vbTab 6 "Denied Domain: " 6 vbTab & Entry Next Else
Debug.Print "All addresses will be blocked, except as follows:" For Each Entry In IPSecurity.IPGrant.
If InStr(l, Entry, "255.255.255.255") Then
Debug.Print vbTab & "Allowed IP: " & vbTab & vbTab _ & Replace(Entry, ", 255.255.255.255", ") Else
Debug.Print vbTab & "Allowed Subnet: " & vbTab & Entry End If
Next
For Each Entry In IPSecurity.DomainGrant
Debug.Print vbTab & "Allowed Domain: " & vbTab & Entry Next
End If.
Установка новых ограничений адресов IP с помощью Visual Basic
Для программного создания ограничений адресов IP или доменов DNS воспользуйтесь кодом
Dim Site As IADs
Dim ServerName As String Dim Siteindex As Long Dim IPSecurity As Variant Dim IPAddress As String Dim IPSubnet As String Dim Domain As String Dim ActionType As String ServerName = "IIS_Server_Wame" Siteindex = Site_Index_Value IPAddress = "xxx.xxx.xxx.xxx" IPSubnet = "xxx.xxx.xxx.xxx" Domain = "DNS_Domain. Name" ActionType = "GRANTIP" 'ActionType = "GRANTSUBNET" 'ActionType = "GRANTDOMAIN" 'ActionType = "DENYIP" 'ActionType = "DENYSUBNET" •ActionType = "DENYDOMAIN" Select Case ActionType
Case "GRANTIP"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _ & Siteindex & "/ROOT") Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False Site.IPSecurity = IPSecurity Site.Setinfo IPSecurity.IPGrant = Array(IPAddress & ", 255.255.255.255") Site.IPSecurity = IPSecurity Site.Setinfo Case "GRANTSUBNET"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _ & Siteindex & "/ROOT") Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False IPSecurity.IPGrant = Array(IPAddress & ", " & IPSubnet) Site.IPSecurity = IPSecurity Site.Setinfo Case "GRANTDOMAIN"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _
Siteindex & "/ROOT")
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = False
IPSecurity.DomainGrant = Array(Domain)
Site.IPSecurity = IPSecurity
Site.Setinfo
Case "DENYIP"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/"
Siteindex & "/ROOT")
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = True
IPSecurity.IPDeny = Array(IPAddress & ", 255.255.255.255")
Site.IPSecurity = IPSecurity
Site.Set Info
Case "DENYSUBNET"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/"
Siteindex & "/ROOT")
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = True
IPSecurity.IPDeny = Array(IPAddress & ", " & IPSubnet)
Site.IPSecurity = IPSecurity
Site.Setinfo
Case "DENYDOMAIN"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" _
Siteindex & "/ROOT")
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = True
IPSecurity.DomainDeny = Array(Domain)
Site.IPSecurity = IPSecurity<
Site.Setinfo
End Select
Примечание
Для установки нового ограничения адреса IP, удалите символы комментария в строке присвоения значения переменной ActionType.
Создание модуля класса llsFTPManagement
В этом разделе продолжим описывать создание начатого в главе 8, “Программное управление метабазой IIS”, приложения СОМ-сервера HsAdmin.DLL.
Упражнение 10.1. Создание iisAdmin.DLL: функции управления FTP-сервером
Откройте проект Visual Basic ActiveX DLL IIsAdmin, который вы начали создавать при чтении главы 8. Этот проект можно найти по адресу: http:// www.williamspublishing.com.
Добавьте к проекту новый модуль класса. Если вы начали новый проект, то не забудьте установить ссылку на библиотеку Active DS Type Library, используя диалоговое окно References, доступ к которому осуществляется с помощью команды Projects References.
Переименуйте новый модуль в llsFTPManagement. Введите следующий код в раздел общих объявлений модуля класса:
Public Function ManageldentityProperties(ByVai Targetcomputer _ As String, ByVai Siteindex As Integer, ByVai Identityproperty _ As String, ByVai Action As String, Optional ByVai NewValue As _ String) As Variant
Dim Site As IADs
Set Site = GetObjectfUS://" & Target Computer & "/MSFTPSVC/"
& Siteindex)
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty)
Case "DESCRIPTION"
ManageldentityProperties = Site.Servercomment
Case "MAXCONNECTIONS"
ManageldentityProperties = Site.Maxconnections
Case "TIMEOUT"
ManageldentityProperties = Site.ConnectionTimeout End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty)
Case "DESCRIPTION"
Site.Servercomment = NewValue
Site.Setinfo
If Err.Number = 0 Then ManageldentityProperties = True Case "MAXCONNECTIONS"
Site.MaxConnections = NewValue
Site.Setinfo
If Err.Number = 0 Then ManageldentityProperties = True Case "TIMEOUT"
Site.ConnectionTimeout = NewValue
Site.Setinfo
If Err.Number = 0 Then ManageldentityProperties = True End Select
End If
End Select
End Function
Public Function ManageServerBindings(ByVai Targetcomputer As _ String, ByVai Siteindex As Integer, ByVai Action As String, _ Optional ByVai Element As Variant) As Variant
On Error Resume Next
Dim Binding As Variant
Dim Site As IADs
Dim NewElement() As Variant
Dim i As Long
Dim Entry As Variant
Set Site = GetObjectfUS://" & Targetcomputer & "/MSFTPSVC/"
& Siteindex)
Select Case UCase(Action)
Case "QUERY"
If IsArray(Site.ServerBindings) = True Then
For Each Entry In Site.ServerBindings
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = Entry
Next
ManageServerBindings = NewElement
Else
ManageServerBindings = Array(Site.ServerBindings) End If
Case "SET"
If Element <> "" Then
If IsArray(Element) = True Then
For Each Entry In Element
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = Entry
Next
Site.ServerBindings = NewElement Else
Site.ServerBindings = Array(Element)
End If
Site.Setinfo
If Err.Number = 0 Then ManageServerBindings = True End If
End Select
End Function
Public Function ManageSecurityProperties(ByVai Targetcomputer _
As String, ByVai Siteindex As Integer, ByVai Identityproperty _
As String, ByVai Action As String, Optional ByVai NewValue As _ String) As Variant
Dim Site As IADs
Set Site = GetObject("IIS://" & Targetcomputer & "/MSFTPSVC/" _
& Siteindex)
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty)
Case "ALLOWANONYMOUS"
ManageSecurityProperties = Site.AllowAnonymous
Case "ANONYMOUSUSERNAME"
ManageSecurityProperties = Site.AnonymousUserName
Case "ANONYMOUSUSERPASS"
ManageSecurityProperties = Site.AnonymousUserPass
Case "ANONYMOUSPASSWORDSYNC"
ManageSecurityProperties = Site.AnonymousPasswordSync
Case "ANONYMOUSONLY"
ManageSecurityProperties = Site.AnonymousOnly End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty)
Case "ALLOWANONYMOUS"
Site.AllowAnonymous = NewValue.
Site.Setinfo
If Err.Number = 0 Then ManageSecurityProperties = True Case "ANONYMOUSUSERNAME"
Site.AnonymousUserName = NewValue
Site.Setlnfo
If Err.Number = 0 Then ManageSecurityProperties = True Case "ANONYMOUSUSERPASS"
Site.AnonymousUserPass = NewValue
Site.Setinfo
If Err.Number = 0 Then ManageSecurityProperties = True Case "ANONYMOUSPASSWORDSYNC"
Site.AnonymousPasswordSync = NewValue
'Site.Setinfo
If Err.Number = 0 Then ManageSecurityProperties = True Case "ANONYMOUSONLY"
Site.AnonymousOnly = NewValue
Site.Setinfo
If Err.Number = 0 Then ManageSecurityProperties = True
End Select
End If
End Select
End Function
Public Function ManageOperators(ByVai Targetcomputer As String, ByVai Siteindex As Integer, ByVai Action As String, Optional _ ByVai NewOperator As String) As Variant On Error Resume Next Dim i As Long Dim Entry As Variant Dim NewElement() As Variant Dim Site As IADs Dim ACE As Variant
Dim DiscretionaryACL As Variant
Set Site = GetObject("IIS://" S Targetcomputer & "/MSFTPSVC/" & Siteindex)
Select Case UCase(Action)
Case "QUERY"
Set SecurityDescriptor = Site.AdminAcl
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL For Each Item In DiscretionaryACL
If Item.AccessMask = 11 Or Item.AccessMask = 262315 Then i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Item.Trustee
End If■
Next
ManageOperators = NewElement
Case "SET"
Set SecurityDescriptor = Site.AdminAcl
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL Set ACE = CreateObject("AccessControlEntry") ACE.Trustee = NewOperator ACE.AccessMask = 11
DiscretionaryACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DiscretionaryACL Site.AdminAcl = SecurityDescriptor Site.Setinfo
If Err.Number = 0 Then ManageOperators = True
End Select
End Function
Public Function ManageMessageProperties(ByVai Targetcomputer As String, ByVai Siteindex As Integer, ByVai IdentityProperty As _ String, ByVai Action As String, Optional ByVai NewValue As _ Variant) As Variant On Error Resume Next Dim i As Long Dim MessageLine As Variant Dim NewElement() As Variant Dim Site As IADs
Set Site = GetObject("IIS://" S Targetcomputer & "/MSFTPSVC/" _ & Siteindex)
Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty)
Case "GREETINGMESSAGE"
For Each MessageLine In Site.GreetingMessage i = UBound(NewElement) + 1 ReDim Preserve NewElement(i)
NewElement(i) = MessageLine
Next
ManageMessageProperties = NewElement
Case "EXITMESSAGE"
ManageMessageProperties = Site.ExitMessage
Case "MAXCLIENTSMESSAGE"
ManageMessageProperties = Site.MaxClientsMessage End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty) Case "GREETINGMESSAGE"
If IsArray(NewValue) = True Then For Each MessageLine In NewValue i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = MessageLine
Next
Site.GreetingMessage = NewElement Else
Site.GreetingMessage = Array(NewValue) End If
Site.Setlnfо
If Err.Number = 0 Or Err.Number = 9 Then _ ManageMessageProperties = True
Case "EXITMESSAGE"
Site.ExitMessage = NewValue
Site.Setinfo
If Err.Number = 0 Then ManageMessageProperties = True Case "MAXCLIENTSMESSAGE"'
Site.MaxClientsMessage = NewValue
Site.Setinfo
If Err.Number = 0 Then ManageMessageProperties = True End Select
End If
End Select End Function
Public Function ManageDirectory(ByVai Targetcomputer As String, _ ByVai Siteindex As Integer, ByVai VirtualDirectoryRelativePath As String, ByVai Identityproperty As String, ByVai Action As String, Optional ByVai NewValue As String) As Variant ’
Dim VirtualDirectory As IADs
Set VirtualDirectory = GetObject("IIS://" & Targetcomputer & _ "/MSFTPSVC/" & Siteindex & VirtualDirectoryRelativePath) Select Case UCase(Action)
Case "QUERY"
Select Case UCase(Identityproperty)
Case "PATH"
ManageDirectory = VirtualDirectory.Path
Case "UNCUSERNAME"
ManageDirectory = VirtualDirectory.UNCUserName Case "UNCPASSWORD"
ManageDirectory = VirtualDirectory.UNCPassword Case "ACCESSREAD"
ManageDirectory = VirtualDirectory.AccessRead Case "ACCESSWRITE"
ManageDirectory = VirtualDirectory.Accesswrite Case "DONTLOG"
ManageDirectory = VirtualDirectory.DontLog Case "MSDOSDIROUTPUT"
ManageDirectory = VirtualDirectory.MSDOSDirOutput End Select
Case "SET"
If NewValue <> "" Then
Select Case UCase(Identityproperty)
Case "PATH"
VirtualDirectory.Path = NewValue
VirtualDirectory.Setinfo
If Err.Number = 0 Then ManageDirectory = True
Case "UNCUSERNAME"
VirtualDirectory.UNCUserName = NewValue
VirtualDirectory.Setinfo
If Err.Number = 0 Then ManageDirectory = True
Case "UNCPASSWORD"
VirtualDirectory.UNCPassword = NewValue
VirtualDirectory.Set Infо
If Err.Number = 0 Then ManageDirectory = True
Case "ACCESSREAD"
VirtualDirectory.AccessRead = NewValue
VirtualDirectory.Setinfo
If Err.Number = 0 Then ManageDirectory = True
Case "ACCESSWRITE"
VirtualDirectory.AccessWrite = NewValue
VirtualDirectory.Set Info
If Err.Number = 0 Then ManageDirectory = True
Case "DONTLOG"
VirtualDirectory.DontLog = NewValue
VirtualDirectory.Setinfo
If Err.Number = 0 Then ManageDirectory = True
Case "MSDOSDIROUTPUT"
VirtualDirectory.MSDOSDirOutput = NewValue
VirtualDirectory.Setlnfо
If Err.Number = 0 Then ManageDirectory = True End Select
End If
End Select
End Function
Public Function ManagelPRestrictions(ByVai Targetcomputer As _ String, ByVai Siteindex As Integer, ByVai Relativepath As String, ByVai Action As String, Optional ByVai RestrictAction As String, Optional ByVai Restrict As String, Optional ByVai IPSubnet As _ String) As Variant
On Error Resume Next
Dim Site As IADs
Dim IPSecurity As Variant
Dim NewElement() As variant
Dim IPAddress As String
Dim ActionType As String
Set Site = GetObject("IIS://" S Targetcomputer S "/MSFTPSVC/" _ & Siteindex & Relativepath) Select Case UCase(Action)
Case "QUERY"
Set IPSecurity = Site.IPSecurity
If IPSecurity.GrantByDefault Then
For Each Entry In IPSecurity.IPDeny
If Instrd, Entry, "255.255.255.255") Then
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = "Denied IP:" _
& Replace(Entry, ",255.255.255.255", "")
Else
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = "Denied Subnet:" & Entry End If
Next
For Each Entry In IPSecurity.DomainDeny i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = "Denied Domain:" & Entry Next
Else
For Each Entry In IPSecurity.IPGrant
If InStrd, Entry, "255.255.255.255") Then i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = "Allowed IP:" _
& Replace(Entry, ",255.255.255.255", "") Else
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = "Allowed Subnet:" & Entry End If
Next
For Each Entry In IPSecurity.DomainGrant i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = "Allowed Domain:" & Entry Next
End If
ManayelPRestrictions = NewElement
Case "SET"
If Restrict <> "" Then
Select Case UCase(RestrictAction)
Case "GRANTIP"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False Site.IPSecurity = IPSecurity Site.Setinfo
IPSecurity.IPGrant = Array(Restrict & ",255.255.255.255") Site.IPSecurity = IPSecurity
Site.Setinfo
If Err.Number = 0 Then ManayelPRestrictions = True Case "GRANTSUBNET"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False IPSecurity.IPGrant = Array(Restrict & "," & IPSubnet) Site.IPSecurity = IPSecurity Site.Setinfo
If Err.Number = 0 Then ManayelPRestrictions = True Case "GRANTDOMAIN"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False IPSecurity.DomainGrant = Array(Restrict) Site.IPSecurity = IPSecurity Site.Setinfo
If Err.Number = 0 Then ManayelPRestrictions = True
Case "DENYIP"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = True
IPSecurity.IPDeny = Array(Restrict S ",255.255.255.255")
Site.IPSecurity = IPSecurity Site.Setinfo
If Err.Number = 0 Then ManagelPRestrictions = True Case "DENYSUBNET"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = True IPSecurity.IPDeny = Array(Restrict & "," & IPSubnet) Site.IPSecurity = IPSecurity Site.Setinfo
If Err.Number = 0 Then ManagelPRestrictions = True Case "DENYDOMAIN"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = True IPSecurity.DomainDeny = Array(Restrict) Site.IPSecurity = IPSecurity Site.Setinfo
If Err.Number = 0 Then ManagelPRestrictions = True End Select
End If
End Select
End Function
Скомпилируйте код в виде HsAdmin.DLL.
Сохраните и закройте проект IIsAdmin.
Совет
Код проекта, а также скомпилированную его версию можно найти по адресу: http://www.williamspublishing. com.
Использование функций модуля IIsFTPManagement
После создания модуля класса IIsFTPManagement можно использовать его функции практически из любого языка программирования, который поддерживает автоматизацию OLE, например Visual Basic, VBScript или JavaScript.
Совет
Создание экземпляра объекта и необходимый синтаксис приведены в главе 3, “Методы перечисления контейнера и программное управление политикой учетных записей домена”. Не забудьте изменить имя класса на IIsFTPManagement, где это необходимо.
В табл. 10.3 приведен синтаксис каждого метода интерфейса IIsFTPManagement.
Таблица 10.3. Синтаксис методов интерфейса IIsFTPManagement
ДействиеСинтаксис
Просмотр описанияЕТР-узлаУстановка описанияЕТР-узлаПросмотр максимального числа подключенийУстановка максимального числа подключенийПросмотр описанияЕТР-узлаУстановка описанияЕТР-узлаПросмотр максимального числа подключенийУстановка максимального числа подключенийManageldentityProperties("Server_Name", 1, "Description", "Query")
Просмотр описания
ЕТР-узла
Установка описания
ЕТР-узла
Просмотр максимального числа подключений
Установка максимального числа подключений
Просмотр описания
ЕТР-узла
Установка описания
ЕТР-узла
Просмотр максимального числа подключений
Установка максимального числа подключений
ManageldentityProperties("Server_Name", 1, "Description", "Set", "New_Description")
ManageldentityProperties("Server_Name", 1, "MaxConnections", "Query")
ManageldentityProperties("Server_Name", 1, "MaxConnections", "Set", 100)
Действие
Синтаксис
Просмотр времени задержки
Установка времени задержки
ManageldentityProperties("Server_Name", 1, "Timeout", "Query")
ManageldentityProperties("Server_Name", 1, "Timeout", "Set", "300")
Просмотр адреса IP и порта For Each item In ManageServerBindings(
TCP FTP-узла
Установка адреса IP и порта TCP FTP-узла
Просмотр активизации анонимного доступа Разрешение анонимного доступа
Просмотр имени пользователя, используемого для анонимного доступа
Установка имени пользователя, используемого для анонимного доступа Просмотр пароля анонимного доступа
Установка пароля анонимного доступа
Просмотр синхронизации пароля
Установка синхронизации пароля
Просмотр активности исключительно анонимного доступа
Активизация исключительно анонимного доступа Просмотр операторов ума
"Server_Name", 1, "Query")- Debug.Print ItemNext
ManageServerBindings("Server_Name", 1, "Set", "xxx.xxx.xxx.xxx:tcp_port")
ManageSecurityProperties("Server_Name", 1, "AllowAnonymous", "Query")
ManageSecurityProperties("Server_Name", 1, "AllowAnonymous", "Set", True)
ManageSecurityProperties("Server_Name", 1, "AnonymousUserName", "Query")
.ManageSecurityProperties("Server_Name", 1, "AnonymousUserName", "Set", "Username")
ManageSecurityProperties("Server_Name", 1,
"AnonymousUserPass", "Query")
ManageSecurityProperties("Server_Name", 1, "AnonymousUserPass", "Set", "Password")
ManageSecurityProperties("Server_Name", 1, "AnonymousPasswordSync", "Query")
ManageSecurityProperties("Server_Name", 1, "AnonymousPasswordSync", "Set", True)
ManageSecurityProperties("Server_Name", 1, "AnonymousOnly", "Query")
ManageSecurityProperties (''Server_Name", 1,
"AnonymousOnly", "Set", True)
For Each Item In ManageOperators("Server_Name", 1, "Query")
Debug.Print Item
Next
Добавление оператора ума
ManageOperators("Server_Name", 1, "Set", "User_Name")
Просмотр сообшения- приветствия FTP-ума
For Each Item In ManageMessageProperties!
"Server_Name", 1, "GreetingMessage", "Query") Debug.Print Item
Next
Установка нового сообщения-приветствия FTP-ума
ManageMessageProperties("Server_Name", 1, "GreetingMessage", "Set", Array("Linel", "Line2", "Line3"))
Действие
Синтаксис
Просмотр сообщения о выходе FTP-узла
Установка нового сообщения о выходе FTP-узла Просмотр сообщения о превышении числа подключений FTP-узла
Установка нового сообщения о превышении числа подключений FTP-узла Просмотр пути виртуального каталога
ManageMessageProperties("Server_Name", 1, "ExitMessage", "Query")
ManageMessageProperties("Server_Name", 1, "ExitMessage", "Set", "Exit^Message")
ManageMessageProperties("Server_Name", 1, "MaxClientsMessage", "Query")
ManageMessageProperties("Server_Name", 1, "MaxClientsMessage", "set", "too many users right now")
ManageDirectory("Server_Name", 1, "/ROOT", "Path", "Query")
Установка пути виртуального каталога
ManageDirectory("Server_Name", 1, "/ROOT", "Path", "Set", "C:\")
Просмотр имени пользователя удаленного виртуального каталога
ManageDirectory("Server_Name", 1, "/ROOT", "UNCUserName", "Query")
Установка имени пользователя удаленного виртуального каталога
ManageDirectory("Server_Name", 1, "/ROOT", "UNCUserName", "Set", "User_Name")
Просмотр пароля удаленного виртуального каталога
Установка пароля удаленного виртуального каталога Просмотр разрешения на чтение виртуального каталога
Установка разрешения на чтение виртуального каталога
ManageDirectory("Server_Name", 1, "/ROOT", "UNCPassword", "Query")
ManageDirectory("Server_Name", 1, "/ROOT", "UNCPassword", "Set", "User_Password")
ManageDirectory("Server_Name", 1, "/ROOT", "AccessRead", "Query")
ManageDirectory("Server_Name", 1, "/ROOT", "AccessRead", "Set", False)
Просмотр разрешения на запись виртуального каталога
ManageDirectory("Server_Name", 1, "/ROOT", "AccessWrite", "Query")
Установка разрешения на запись виртуального каталога
ManageDirectory("Server_Name", 1, "/ROOT", "AccessWrite", "Set", False)
Просмотр активности ведения журнала виртуального каталога
ManageDirectory("Server_Name", 1, "/ROOT", "DontLog", "Query")
Активизация ведения журнала виртуального каталога Просмотр стиля отображения содержимого виртуального каталога
ManageDirectory("Server_Name", 1, "/ROOT", "DontLog", "Set", True)
ManageDirectory("Server_Name", 1, "", "MSDOSDirOutput", "Query")
Действие
Синтаксис
Установка стиля отображе-
ManageDirectory("Server Name", 1, "",
ния содержимого виртуального каталога
"MSDOSDirOutput", "Set", True)
Просмотр ограничений IP
For Each Item In ManagelPRestrictions("Server Name", 1, "/ROOT", "Query")
Debug.Pri nt Item
Next
Разрешение доступа всем,
ManagelPRestrictions("Server Name", 1, "/ROOT",
за исключением определен-
"Set", "GrantIP", "xxx.xxx.xxx.xxx")
ных адресов 1Р
Разрешение доступа всем{
ManagelPRestrictions("Server_Name", 1, "/ROOT",
за исключением определен-
"Set", "Grantsubnet", "xxx.xxx.xxx.xxx",
ных подсетей
"xxx.xxx.xxx.0")
Разрешение доступа всем,
ManagelPRestrictions("Server Name", 1, "/ROOT",
за исключением определенных доменов DNS
"Set", "GrantDomain", "DN3_Domain")
Запрещение доступа всем,
ManagelPRestrictions("Server_Name", 1, "/ROOT",
за исключением определенных адресов IP
"Set", "DenyIP", "xxx.xxx.xxx.xxx")
Запрещение доступа всем,
ManagelPRestrictions("Server_Name", 1, "/ROOT",
за исключением определен-
"Set", "DenySubnet", "xxx.xxx.xxx.xxx",
ных подсетей
"xxx.xxx.xxx.0")
Запрещение доступа всем,
ManagelPRestrictions("Server_Name", 1, "/ROOT",
за исключением определенных доменов DNS
"Set", "DenyDomain", "DNS_Domain")
Резюме
Используя свойства ADSI, описанные в этой главе, можно программно управлять FTP-сервером.
Для снижения риска несанкционированного доступа корпорация Microsoft рекомендует использовать только анонимное подключение к узлу. Следует отметить, что с помощью ADS1 взломщик может получить аутентификационную информацию учетной записи анонимного пользователя и проникнуть в вашу систему. Поэтому перед выбором конфигурации безопасности FTP-узла необходимо тщательно проанализировать область, которая представляет наибольшую угрозу целостности размещенных на узле данных.
Каждый FTP-узел может иметь собственную систему сообщений, которые отображаются пользователю при успешном подключении, отключении или превышении числа подключений. Кроме этого, у вас есть возможность выбрать местоположение файлов узла — на локальном или удаленном компьютерах, стиль отображения содержимого каталога и ограничения адресов 1Р и доменов DNS.
Используя фрагменты кода из этой главы, можно создать приложение для управления FTP-узлом (кстати, один из примеров создания подобного приложения рассматривается в этой главе).
Часть IV
Исследование провайдеров ADSL: LDAP
Программное управление инфраструктурами LDAP
Программное управление Active Directory Windows 2000
Программное управление инфраструктурами LDAP
Упрощенный протокол доступа к каталогу (Lightweight Directory Access Protocol — LDAP) создан на основе RFC-стандарта, утвержденного организацией IETF (Internet Engineering Task Force), и предназначен для хранения пользовательской, организационной и прикладной конфигураций, доступ к которым можно получить с помощью любого LDAP-совместимого клиентского приложения. Повсеместное распространение продуктов HTML и рост числа узлов привели к тому, что LDAP стал стандартным протоколом для доступа к каталогу во многих приложениях и операционных системах, включая Netscape. Entrust и Microsoft.
В этой главе речь идет о роли и месте LDAP в компьютерной модели компании, а также рассматривается связь между ADSI и LDAP. Здесь приведена краткая терминология LDAP, обсуждаются интерфейсы прикладного программирования LDAP и описываются коммерческие реализации каталога LDAP.
Итак, в этой главе обсуждаются следующие темы:
управление каталогом LDAP с помощью ADSI;
перечисление пространства имен LDAP с помощью ADSI;
поиск в пространстве имен LDAP с помощью ADO (ActiveX Data Objects);
управление почтовыми ящиками Microsoft Exchange и списками рассылки с помощью ADSI-провайдера LDAP.
Кроме этого, здесь кратко описан процесс установки приложения Netscape Directory Server и приведен пример каталога Airius. В нем определяется общее пространство имен, используемое во всех фрагментах кода этой главы.
Краткий обзор технологии и терминологии LDAP
Лежащие в основе LDAP технология и архитектура — это довольно сложные и обширные темы, которые в полной мере невозможно осветить в одной книге. Для понимания LDAP изучите приложение Б, “Справочник по программированию ADSI 2.5”, и найдите компромисс между теоретической подготовкой и практикой, поэкспериментировав с одним из нескольких серверных продуктов LDAP.
Эта глава не претендует на полноту описания LDAP — здесь лишь приведены базовые сведения.
Что такое LDAP
Созданный на основе стандарта каталога Х.500, LDAP представляет собой общий язык, который могут использовать для связи все LDAP-совместимые клиенты и серверы. LDAP был разработан для того, чтобы упростить реализацию стандарта каталога Х.500 в клиентских приложениях.
Тимоти Хоув (Timothy Howe), основной идеолог оригинальной спецификации LDAP, определяет следующие четыре модели для стандарта протокола доступа к каталогу:
информационная модель — определение данных, помещаемых в каталог;
модель имен — определение организации пространства имен;
функциональная модель — определение методов для доступа и обновления данных;
модель безопасности — определение методов, которые применяются для зашиты каталога от несанкционированного доступа.
Информационная модель: как поместить что-либо в каталог LDAP
В больших распределенных компаниях центральное хранилище информации о сотрудниках обеспечивает быстрый доступ к телефонным номерам и информации об учетных записях пользователей и даже реализует общее хранилище сертификатов Х.500. В большинстве компаний информация о сотрудниках хранится в различных системах, например базах данных, базе SAM Windows NT, а также в локальных файлах серверов и рабочих станций. Однако, используя LDAP, вы избавитесь от необходимости создавать отдельные приложения для поиска информации в этих разнородных системах.
Если в компании информация хранится в базах данных различных производителей (например, Oracle, Sybase и Microsoft SQL Server), то реализация инфраструктуры LDAP поможет снизить или ограничить число различных библиотек клиентов, необходимых для доступа к каждому типу базы данных. Кроме того, снижается стоимость поддержки сложной системы.
Используя гибкость инфраструктуры LDAP, разработчик корпоративного телефонного каталога, например, может выполнить простой запрос к каталогу LDAP для получения необходимой информации. Таким образом, ему не нужно выполнять прямые запросы к хранилищам данных, определять имена источников данных и устанавливать необходимые библиотеки для доступа к различным базам данных. Кроме того, разработчик телефонного каталога может создать инфраструктуру для размещения информации непосредственно из программируемой АТС и базы данных сотрудников, что будет гарантировать поддержку текущего состояния телефонного каталога без прямого администрирования.
Хранение информации в виде каталога существенно упрощает доступ к записям и атрибутам. Запись (entry) определяет предмет интереса, например, это может быть вся компания, подразделение, сотрудник и даже отдельный компьютер. Внутри каждой записи атрибуты (attributes) представляют собой описание предмета интереса. Пользователь обычно определяется его полным именем (атрибуты сп (имя) и sn (фамилия)) и (необязательно) подразделением, расположением офиса, номером телефона и др.
В каждой записи необходимые атрибуты (определяющие ее тип) хранятся в атрибуте Objectclass. В зависимости от класса объекта, также определяются некоторые обязательные и необязательные атрибуты. Например, в классе записи люди
атрибут сп необходим для идентификации записи. Кроме того, можно создавать дополнительные атрибуты, что позволит настроить каталог для специфических требований вашей компании.
Модель имен: как организованы данные
' LDAP создает иерархическую модель данных для организации собственного каталога. В этой модели существуют небольшие ограничения на способ размещения данных. Такая относительная свобода позволяет конструировать каталог на основе географического расположения компании или ее отдельных подразделений либо применять другой метод организации. Чтобы обеспечить хранение и доступ к данным, необходимо предусмотреть способ указания их расположения в каталоге. В LDAP для идентификации записей каталога используется характерное имя (Distinguished Name— DN) или относительное характерное имя (Relative Distinguished Name — RDN). Еще одна иерархическая служба каталога, в которой используются характерные имена, — файловая система Windows NT. В этой структуре каталога для запуска файла notepad.exe из командной строки (предположим, что в списке путей нет %systemroot%/system32) можно использовать два метода ссылки на имя запускаемого приложения. Первый — использование характерного имени (DN):
С:\WinNT\System32\notepad.exe
Этот метод эффективен лишь в том случае, если известен путь, иначе необходимо проверять существование исполняемого файла приложения перед его запуском.
Второй метод заключается в использовании набора команд для перехода в соответствующую папку:
C:\>cd WinNT
C:\WinNT>cd System32
C:\WinNT\System32>notepad.exe
С помощью этого метода файл notepad.exe может быть описан относительным характерным именем (RDN). Для доступа к файлу необходимо связать контейнер, содержащий объект. В этом методе notepad.exe располагается относительно его родительского контейнера.
В каталогах LDAP характерное имя обычно используется для быстрой навигации к определенному расположению, а создание или удаление объекта каталога выполняется с помощью относительного характерного имени.
Кроме этого, в каталоге есть организационный блок (Organization Unit — OU), с помощью которого администратор каталога может создавать логические группы записей.
Функциональная модель: доступ и обновление данных
Функциональная модель определяет способ добавления, модификации и удаления записей каталога. Кроме того, она включает методы, используемые при поиске и сравнении элементов в каталоге (с помощью операций запроса) и определяющие основу доступа пользователей к содержащимся данным (с помощью операций аутентификации и контроля)./
Внутри этой функциональной модели можно создать фильтр (filter). Фильтры LDAP используются для ограничения результирующего набора, подобно предложению where оператора SELECT в ANSI SQL. Определения фильтра создаются с помощью синтаксиса поиска LDAP, который довольно сложен для начинающих пользователей. Для создания интуитивно понятных запросов используется провайдер ADsDSOObject для ADO, позволяющий применять синтаксис ANSI SQL в пространствах имен LDAP. Пример использования ADO для поиска в пространстве имен LDAP приведен далее в главе.
Модель безопасности: контроль за несанкционированным доступом к записям и атрибутам
Довольно странно, но модель безопасности LDAP не определяет стандарт обшей модели контроля доступа — его реализация отдается на откуп создателю каталога. Однако в документах RFC определяются процедуры аутентификации, используемые для протоколов соединения LDAP.
Необходимо помнить, что в каждом сервере LDAP реализована собственная модель безопасности. Например, в продуктах компании Netscape правила безопасности устанавливаются как на записи, так и на атрибуты. Более подробную информацию о реализованной модели безопасности необходимо искать в документации на продукт.
Существующие интерфейсы прикладного программирования LDAP
Файлы формата обмена данных LDAP (LDAP Data Interchange Format — LDIF) поддерживают различные способы создания новых записей и модификации существующих. Однако для распространения каталогов на основе LDAP необходимо использовать соответствующий SDK.
Документ RFC-1823 определяет LDAP С API для LDAP v2, а стандартные SDK реализованы для третьей версии каталогов LDAP. Некоторые компании и организации реализовали собственные SDK, которые доступны в Internet как в виде скомпилированных приложений, так и в исходных кодах. Более подробную информацию о местоположении этих продуктов можно найти вприложении В, “Дополнительные источники информации”.
Обратите внимание, что для использования этих SDK необходимо знание языка С. Для пользователе, не знакомых с этим языком программирования, некоторые компании выпускают реализации LDAP SDK для Java, Perl, C++ и Visual Basic. Особый интерес представляет реализация Microsoft, которая содержится в ADSL
Коммерческие продукты, поддерживающие LDAP
Как вы уже убедились, ADSI — это относительно простой API, используемый для управления несколькими пространствами имен. Узнав, какие продукты используют для хранения информации каталог LDAP, можно определить те из них, которыми можно управлять с помощью ADSL
К моменту написания этой книги возможность запросов с помощью провайдера LDAP ADS1 поддерживалась следующими продуктами и каталогами Internet:
Microsoft Windows 2000 (описывается в главе 12, “Программное управление Active Directory Windows 2000”);
Microsoft Exchange версии 5.5 и выше;
Microsoft Site Server 3.0 (с установленным Site Server Service Pack 2);
Netscape Directory Server;
каталоги Internet— The BigFoot (ldap.bigfoot.com), InfoSpace (ldap.infospace.com), SwitchBoard (ldap.switchboard.com), VeriSign
(directory.verisign.com), WhoWhere (ldap.whowhere.com) и Yahoo (Idap .yahoo . com);
Entrust PKI.
Кроме этого, компании Cisco и Microsoft предложили стандарт сети на основе каталога, в котором описывается интеграция сетевых устройств в каталоги LDAP.
Соответствующие реализации каталога LDAP служат мостом между гетерогенными системами, обеспечивая общие язык и структуру для хранения данных приложения, конфигурационных параметров и пользовательской информации. LDAP также поддерживает централизованное хранилище сертификатов Х.509, которое в настоящее время активно используется в электронной коммерции.
Пример установки Netscape Directory Server
При установке Netscape Directory Server можно в качестве примера импортировать пространство имен вымышленной компании Airius. Выполните следующее упражнение для настройки Netscape Directory Server, который впоследствии можно использовать для управления каталогом.
Упражнение 11.1. Установка Netscape Directory Server 4.11
Внимание
Прежде чем приступать к выполнению этих действий, проверьте правильность настройки домена DNS в свойствах протокола TCP/IP вашего сервера Windows NT Server.
Вначале загрузите файл D411DIU.EXE по адресу: http://www.iplanet.com/ downloads/testdrive/index.html.
После загрузки запустите этот файл на компьютере с Windows NT Server.
Пропустите первое диалоговое окно мастера установки и в следующем окне выберите установку Netscape Servers (не Netscape Console).
В следующем диалоговом окне выберите тип установки Custom.
Выберите папку для размещения файлов устанавливаемого продукта.
Выберите для установки все компоненты, за исключением Netscape Directory Server 4.1 Synch Service.
Настройте параметры расположения файлов данных Netscape Directory Server.
В диалоговом окне настройки параметров Netscape Directory Server 4.1 по умолчанию в поле Server Identifier отображается имя NetBIOS и установлен порт TCP 389 (назначаемый по умолчанию порт для LDAP). Кроме того, суффикс должен содержать имя текущего домена DNS, который настраивается в окне свойств протокола TCP/IP, а префикс — символы о=.
Совет
Если в диалоговом окне свойств протокола TCP/IP не выбран домен DNS, прекратите установку и перейдите к настройке необходимых параметров протокола TCP/IP. В противном случае нельзя будет продолжить установку сервера Netscape Directory Server 4.1.
Введите пароль для доступа к административной консоли.
Примечание
Конфигурация Administration Domain должна соответствовать конфигурации домена DNS Windows NT.
Введите пароль средства Directory Manager. Этот пароль необходим для программного управления каталогом, так что запомните его и сохраните в надежном месте.
Далее можно выбрать установку примера организационной структуры (она устанавливается по умолчанию). Кроме установки, необходимо заполнить базу данных примерами значений. Обратите внимание, что по умолчанию база данных не заполняется значениями, так что не забудьте активизировать необходимый параметр.
Пропустите диалоговое окно Disable Schema Checking.
Если для сервера назначено несколько адресов IP, выберите тот, который будет использоваться в качестве сервера администратора (оставьте все параметры, установленные по умолчанию).
Введите пароль пользователя сервера администратора. Эта учетная запись используется для регистрации в окне Netscape Console (приложение, написанное на языке Java и предназначенное для управления сервером каталога).
Примечание
Порт сервера администратора выбирается случайным образом. В большинстве случаев изменять его нет необходимости.
После настройки всех параметров появится итоговое диалоговое окно, в котором будут перечислены выбранные значения описанных выше параметров. Если все верно, то можно переходить к непосредственному копированию файлов.
После копирования файлов и перезагрузки компьютера у вас появится Netscape Directory Server 4.1 и пример пространства имен Airius.
Теперь можно приступать к программным экспериментам над каталогом LDAP с помошью ADSL
Примечание
Во всех примерах этой главы используется база данных Airius, устанавливаемая при инсталляции Netscape Directory Server 4.1. Для использования другого пространства имен необходимо незначительно модифицировать код.
Манипулирование каталогом LDAP с помощью ADSI
Воспользовавшись услугами провайдеров Windows NT и IIS ADSI, можно создать ограниченную структуру каталога. Открытая архитектура каталога LDAP позволяет реализовать множество различных пространств имен. Для некоторых компаний вполне достаточно полоской структуры каталога, а некоторым жизненно необходимо реализовывать глубокие иерархические схемы на географической основе или на основе функциональных подразделений.
Для правильного связывания записей в каталоге необходимо четко представлять и понимать архитектуру реализации этого каталога. В качестве примера рассмотрим отношение между строкой связывания и структурой каталога, показанной на рис. 11.1.
Рис. 11.1. В примере базы данных Airius используется относительно плоская иерархическая архитектура каталога
/
Для связывания пользовательского объекта scatter используйте следующие строки ADSI:
развернутая форма — Set Obj = GetObject ("LDAP://LDAP_ServerName/ O=airius.com/OU=People/UID=scarter");
сокращенная форма (по умолчанию) — Set Obj = Getobject ("LDAP:// LDAP_ServerName:TCP_Port/UID=scarter, OU=People, O=airius.com").
Обратите внимание, что при использовании развернутой формы строка связывания начинается с описания верхнего элемента структуры, затем осуществляется переход вниз по иерархии (в данном случае к пользовательскому объекту). А при использовании сокращенной формы вначале описывается наименьший элемент (в данном случае пользовательский объект), а затем выполняется переход вверх по иерархии — к корневому элементу дерева. Сокращённая форма по умолчанию возвращается при выполнении запросов ADSL Многие пользователи считают развернутую форму более понятной при связывании объектов в каталоге.
Примечание
При установке сервера LDAP на альтернативный порт в ADS1 необходимо использовать сокращенную форму.
Просмотр архитектуры существующего каталога LDAP с помощью Visual Basic
Для связывания каталога LDAP необходимо представлять отношения между родительскими и дочерними объектами каждой записи в каталоге. Если вы не участвовали в разработке каталога LDAP, то можете и не знать его детальную схему. В таком случае для программного просмотра архитектуры существующего каталога LDAP используйте следующий код:
Dim Container As TADsContainer
Dim Entry As IADs
Dim StartingPoint As String
'StartingPoint = "/ou=People"
Set Container = GetObject("LDAP://LDAP_SERVER/o=airius.com" _
4 StartingPoint)
For Each Entry In Container
Debug.Print "Entry Name: " & Entry.Name & vbTab & vbTab _
"Class: " & Entry.Class
Next
Изменяя установленную в строке отправную точку (StartingPoint), можно перечислять все дочерние записи, расположенные ниже нее. Например, можно перечислить все содержимое контейнеров People или Groups.
Внимание
Описанный процесс перечисления может выполняться довольно продолжительное время, особенно если каталог содержит много объектов (20 000 и более).
Просмотр атрибутов записи с помощью ADSI при анонимном доступе в Visual Basic
Для просмотра атрибутов записи можно связать запись и использовать метод Get. Если сервер LDAP разрешает анонимный доступ для чтения к каталогу, то используйте следующий код Visual Basic для просмотра атрибутов записи:
On Error Resume Next
Dim Container As TADsContainer
Dim User As IADs
Set Container = _
GetObject("LDAP://LDAP_SERVER/o=airius.com/ou=People")
For Each User In Container
Debug.Print "UserID: " & vbTab & User.Get("uid") & vbTab _
"Common Name: " & User.Get("cn") & vbTab & "Surname: " _
User.Get("sn")
Next
Примечание
В приведенном фрагменте кода просматриваются доступные свойства (атрибуты сп и sn) записи типа inetOrgPerson.
Просмотр атрибутов записи с помощью ADSI при разделяемом доступе в Visual Basic
Если доступ к записи блокирован для анонимной учетной записи, то можно использовать объект OpenDSObject интерфейса lADsOpenDSObject для определения набора прав доступа к каталогу.
В Netscape Directory Servers необходимая для доступа учетная запись определяется следующим образом: cn=directory manager. Это имя учетной записи можно изменить при установке продукта.
Для просмотра атрибута записи типа inetOrgPerson от имени учетной записи cn=directory manager используйте следующий код Visual Basic:
On Error Resume Next
Dim dso As lADsOpenDSObject
Dim Container As TADsContainer
Dim User As IADs
Set dso = GetObject("LDAP:")
Set Container = dso.OpenDSObject("LDAP://LDAP_SERVER/o=airius.com/ou=People",
"cn=Directory Manager", "18undrym@tl974", 0)
For Each User In Container
Debug.Print "UserID: " & vbTab & User.Get("uid") & vbTab _
"Common Name: " & User.Get("cn") & vbTab & "Surname: " _
& User.Get("sn")
Next
Модификация атрибутов записи с помощью ADSI в Visual Basic
Чтобы установить значение атрибута записи существующего каталога, используйте метод Put интерфейса iads. Для правильного выполнения этой задачи необходимо связать каталог с привилегиями его модификации. Пример идентификационных действий приведен в предыдущем разделе. Используя этот пример, попробуем создать следующий код Visual Basic для изменения атрибута sn пользователя uid=aknutson с Knutson на McNally.
Dim dso As lADsOpenDSObject
Dim Container As lADsContainer
Dim User As IADs
Set dso = GetObject("LDAP:")
Set Container = _
dso.OpenDSObject("LDAP://LDAP_SERVER/o=airius.com/ou=People", _ "cn=Directory Manager", "l@undrym@tl974", 0)
Set User = Container.GetObject("inetorgperson", "uid=aknutson")
User.Put "sn", "McNally"
User.Setinfo
Создание новой записи с помощью ADSI в Visual Basic
Для создания новой записи в каталоге необходимо поместить следующую часть информации о записи и ее родительском контейнере:
соответствующие права для обновления каталога;
путь к родительскому контейнеру, в котором необходимо создать запись;
класс создаваемого объекта;
соответствующие свойства создаваемого класса объекта записи.
В приведенном фрагменте кода создается новая запись uid=teck типа ine- tOrgPerson в организационном блоке People.
Dim dso As lADsOpenDSObject
Dim Container As lADsContainer
Dim User As IADs'
Dim ClassArray As variant
Set dso = GetObject("LDAP:")
Set Container = _
dso.OpenDSObject("LDAP://LDAP_SERVER/o=airius.com/ou=People", "cn=Directory Manager", "l@undrym@t!974", 0)
Set User = Container.Create("inetorgperson", "uid=teck") ClassArray = Array("inetOrgPerson", "person", "top", _ "organizationalPerson")
User.Put "objectclass", ClassArray
User.Put ”cn", "Thomas Eck"
User. Put "sn", "Eck"
User. Setinfo
Удаление записи с помощью ADSI в Visual Basic
Для удаления существующей записи в каталоге используйте метод Delete интерфейса IADs, передав в качестве аргументов имя записи и ее класс, как показано в приведенном фрагменте кода.
Dim dso As lADsOpenDSObject
Dim Container As lADsContainer
Set dso = GetObject ("LDAP: ")
Set Container = _
dso.OpenDSObject("LDAP://LDAP_SERVER/o=airius.com/ou=People", _ "cn=Directory Manager", "l@undrym@tl974", 0) Call Container.Delete("inetorgperson", "uid=teck")
Использование ADO для поиска в каталоге с помощью Visual Basic
При использовании провайдера Windows NT, комбинируя условия и функции перечисления, можно выполнять поиск необходимых данных в пространстве имен. Провайдер LDAP поддерживает альтернативные методы выполнения поиска в пространстве имен, например IDirectorySearch (только для языков, не поддерживающих автоматизацию) и ADO. В ADO можно использовать функции перечисления для поиска записей.
Поиск в каталоге LDAP с помощью ADO выполняется достаточно быстро; записи возвращаемого результирующего набора ADO можно отобразить с помощью цикла While.. .Wend. Кроме этого, при использовании ADO и провайдера ADsDSOObject можно употреблять синтаксис ANSI SQL для выполнения поиска в каталоге LDAP (в этом случае не нужно изучать синтаксис фильтра LDAP).
Примечание
Для запуска приведенного ниже примера необходимо установить компоненты ADO, которые можно загрузить с Web-стр.аницы Microsoft Data Access Components no адресу: http://www.microsoft.сот/data. После этого в проекте необходимо установить ссылку на библиотеку Microsoft ActiveX Data Objects 2.X Library.
Для поиска всех пользователей с атрибутом sn, равным Carter, в примере каталога Airius используйте следующий код Visual Basic:
Dim Connection As ADODB.Connection
Dim RS As ADODB.Recordset
Dim Entry As String
Dim Index As Long
Index = 0
Set Connection = New ADODB.Connection
Connection.Provider = "ADsDSOObject"
Connection.Open "ADSI"
Set RS = Connection.Execute("SELECT cn,telephonenumber FROM _ 'LDAP://LDAP_SERVER/o=airius.com/ou=people1 WHERE sn='carter'")
While Not RS.EOF.
For i = 0 To RS.Fields.Count - 1
If RS.Fields(i).Type = adVariant And Not _
(IsNull(RS.Fields(i).Value)) Then
For j = LBound(RS.Fields(i).Value) To _
UBound(RS.Fields(i).Value)
Entry = Entry & RS.Fields(i).Value(j) & vbTab Next j
Else
. Entry = Entry & RS.Fields(i)-Value & vbTab
End If_
If Index = RS.Fields.Count - 1 Then
Debug.Print Entry
End If
Index = Index + 1
Next i
Entry = ""
Index = 0
RS.MoveNext
Wend
Управление почтовыми ящиками Microsoft Exchange и списками рассылки с помощью провайдера LDAP ADSI
Используя провайдер LDAP ADSI для сервера Microsoft Exchange 5.5 (или выше), можно просматривать и манипулировать конфигурацией каталога, создавать и удалять почтовые яшики, а также управлять списками рассылки. С помощью этих программных методов можно, например, автоматизировать создание почтового ящика при приеме на работу нового сотрудника и создание для него учетной записи.
В этом разделе представлены программные методы выполнения описанных задач с помощью Visual Basic, провайдера LDAP ADSI и набора Microsoft ADSI ADsSecurity.DLL для управления безопасностью каталога Exchange.
Создание нового почтового ящика Exchange с помощью Visual Basic
Если установлен Exchange Administrator, при создании новой учетной записи в Windows NT автоматически появляется диалоговое окно, в котором можно зарегистрировать почтовый ящик Exchange. А при использовании программных методов это взаимодействие с Exchange теряется. Но можно использовать провайдер LDAP ADSI
для программного создания почтового ящика и ассоциации его с учетной записью пользователя Windows NT.
Примечание
Перед тестированием приведенного далее кода удостоверьтесь, что учетная запись, от имени которой зарегистрирован пользователь, обладает необходимыми правами (Termissions Admin и Service Account Admin,) для модификацци базы данных Exchange.
Итак, для программного создания почтового ящика Microsoft Exchange используйте следующий код Visual Basic:
Dim ExchangeServerName As String
Dim ExchangeServerOrganization As String
Dim ExchangeServerSite As String Dim Mailbox As IADs Dim MailboxParentContainer As IADs Dim MailboxRelativePath As String Dim MailboxDisplayName As String Dim MailboxFirstName As String Dim MailboxLastName As String Dim MailboxMiddlelnitial As String Dim MailboxAlias As String Dim MTA As String Dim MDB As String Dim MailboxSMTPAddress As String Dim MailboxX400Address As String Dim MailboxCCMailAddress As String Dim MailboxMSMailAddress As String Dim NTUserAccountToAssociate As String Dim UserDomain As String Dim SID As New ADsSID Dim Security As New ADsSecurity Dim SecurityDescriptor As lADsSecurityDescriptor Dim DiscretionaryACL As lADsAccessControlList Dim AccessControlEntry As New AccessControlEntry
ExchangeServerName = "EXCHANGE_SERVER" ExchangeServerOrganization = "ADSlTest" ExchangeServerSite = "Macmillan" MailboxRelativePath = "" MailboxDisplayName = "Eck, Thomas E." MailboxFirstName = "Thomas" MailboxLastName = "Eck" MailboxMiddlelnitial = "E" MailboxAlias = "Thomas.Eck" UserDomain = "UserDomain" NTUserAccountToAssociate = "teck"
MTA = "cn=Microsoft MTA,cn=" S ExchangeServerName _
",cn=Servers,cn=Configuration,ou=" & ExchangeServerSite _ S ",o=" S ExchangeServerOrganization
MDB = "cn=Microsoft Private MDB,cn=" S ExchangeServerName _ & ",cn=Servers,cn=Configuration,ou=" S ExchangeServerSite _ S ",o=" S ExchangeServerOrganization MailboxSMTPAddress = MailboxAlias S "@" S ExchangeServerSite _ & "." & ExchangeServerOrganization S ".com" MailboxX400Address = "c=US;a= ;p=" S ExchangeServerOrganization _ $ ";o=" s ExchangeServerSite S ";s=" & MailboxLastName S ";g=" _
& MailboxFirstName & ”;i=" & MailboxMiddlelnitial
MailboxCCMailAddress = MailboxLastName & ", " & MailboxFirstName _
& " at " & ExchangeServerSite
MailboxMSMailAddress = UCase(ExchangeServerOrganization & "/" _
& ExchangeServerSite & "/" & MailboxAlias)
Set MailboxParentContainer = GetObject("LDAP://" _
& ExchangeServerName & ”/o=" & ExchangeServerOrganization _
& "/ou=" & ExchangeServerSite & ”/cn=Recipients” _
& MailboxRelativePath)
Set Mailbox = _
MailboxParentContainer.Create("organizationalPerson”, _
"cn=" & MailboxAlias)
Mailbox.Put "mailPreferenceOption", 0
Mailbox.Put "givenName", MailboxFirstName
Mailbox.Put "sn", MailboxLastName
Mailbox.Put "cn", MailboxDisplayName
Mailbox.Put "uid", MailboxAlias
Mailbox.Put "Home-MTA", MTA
Mailbox.Put "Home-MDB", MDB
Mailbox.Put "mail", MailboxSMTPAddress
Mailbox.Put "MAPI-Recipient", True
Mailbox.Put "rfc822Mailbox", MailboxSMTPAddress
Mailbox.Put "textEncodedORAddress", MailboxX400Address
Mailbox.PutEx ADS_PROPERTY_APPEND, "otherMailbox", _
Array("CCMAIL$" & MailboxCCMailAddress, "MSS" & MailboxMSMailAddress)
SID.SetAs ADS_SID_WINNT_PATH, "WinNT://" & UserDomain & "/" _
& NTUserAccountToAssociate & ",user" sidHex = SID.GetAs(ADS_SID_HEXSTRING) Mailbox.Put "Assoc-NT-Account", sidHex Mailbox.Setinfo
Set SecurityDescriptor = _
Security.GetSecurityDescriptor(Mailbox.ADsPath)
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL
AccessControlEntry.AceType = ADS_ACETYPE_ACCESS_ALLOWED
AccessControlEntry.Trustee = UserDomain & "\" & MailboxAlias
AccessControlEntry.AccessMask = ADS_RIGHT_EXCH_MAIL_SEND_AS _
Or ADS_RIGHT_EXCH_MAIL_RECEIVE_AS _
Or ADS_RIGHT_EXCH_MODIFY_USER_ATT
DiscretionaryACL.AddAce AccessControlEntry
SecurityDescriptor.DiscretionaryACL = DiscretionaryACL Security.SetSecurityDescriptor SecurityDescriptor
Примечание
В приведенном фрагменте кода используются ссылки на интерфейсы ADsSid и ADsSecurity. Эти интерфейсы содержатся в файле ADSSECURITY.DLL, который можно загрузить по адресу: http://www. williamspublishing. сот и http://www.microsoft.com/adsi.
После загрузки необходимый файл следует зарегистрировать в системе с помощью утилиты REGSVR32, введя в командной строке REGSVR32 ADsSecurity.DLL.
После этого в диалоговом окне References интегрированной среды разработки Visual Basic появится новая запись ADsSecurity 2.5 Type Library.
Удаление существующего почтового ящика Exchange с помощью Visual Basic
Для удаления существующего почтового ящика Microsoft Exchange используйте следующий код:
Dim ExchangeServerName As String-
Dim ExchangeServerOrganization As String
Dim ExchangeServerSite As String
Dim MailboxParentContainer As TADsContainer
Dim MailboxRelativePath As String
Dim MailboxToRemove As String
ExchangeServerName = "EXCHANGE_SERVER" ExchangeServerOrganization = "ADSITest" ExchangeServerSite = "Macmillan" MailboxRelativePath = "" MailboxToRemove = "Thomas.Eck"
Set MailboxParentContainer = GetObject("LDAP://" _
6 ExchangeServerName & "/o=" & ExchangeServerOrganization
6 "/ou=" & ExchangeServerSite & ”/cn=Recipients" _
6 MailboxRelativePath)
Call MailboxParentContainer.Delete("organizationalPerson", "cn=" & MailboxToRemove)
Добавление члена списка рассылки с помощью Visual Basic
Если в вашей организации используются списки рассылки, в которых каждому пользователю назначена роль, расположение или подразделение (например, DL_Permanent_Employees, DL_Chicago, DL_Senior_Management или DL_Research_ Development), то можно автоматизировать процесс добавления пользователя к списку, используя провайдер LDAP ADSI и Visual Basic следующим образом:
Dim ExchangeServerName As String
Dim ExchangeServerOrganization As String
Dim ExchangeServerSite As String
Dim DistributionList As IADs
Dim DistributionListName As String
Dim DistributionListRelativePath As String
Dim DLMemberMailboxName As String
ExchangeServerName = "EXCHANGE_SERVER" ExchangeServerOrganization = "ADSITest" ExchangeServerSite = "Macmillan" DistributionListRelativePath = "" DistributionListName = "DL_Research_Development" DLMemberMailboxName = "Thomas.Eck"
Set DistributionList = GetObject("LDAP://" & ExchangeServerName _
S "/o=" & ExchangeServerOrganization & "/ou=" & ExchangeServerSite
6 "/cn=Recipients" & DistributionListRelativePath & "/cn=" _
6 DistributionListName)
DistributionList.Add ("LDAP://" & ExchangeServerName & "/o=" 6 ExchangeServerOrganization & "/ou=" & ExchangeServerSite _
& "/cr.=Recipients" & "/cn=" & DLMemberMailboxName)
DistributionList.SetInfo
Удаление члена списка рассылки с помощью Visual Basic
Для удаления существующего члена из списка рассылки используйте код
Dim ExchangeServerName As String
Dim ExchangeServerOrganization As String
Dim ExchangeServerSite As String
Dim DistributionList As IADs
Dim DistributionListName As String
Dim DistributionListRelativePath As String
Dim DLMemberMailboxName As String
ExchangeServerName = "EXCHANGE_SERVER" ExchangeServerOrganization = "ADSITest" ExchangeServerSite = "Macmillan" DistributionListRelativePath = "" DistributionListName = "DL_Research_Development" DLMemberMailboxName = "Thomas.Eck"
Set DistributionList = GetObject("LDAP://" & ExchangeServerName _
& "/o=" & ExchangeServerOrganization & "/ou=" & ExchangeServerSite
& "/cn=Recipients" & DistributionListRelativePath & "/cn=" _
& DistributionListName)
DistributionList.Remove ("LDAP://" & ExchangeServerName
& "/o=" & ExchangeServerOrganization & "/ou=" _
& ExchangeServerSite & "/cn=Recipients" & "/cn=" _
& DLMemberMailboxName).
DistributionList.SetInfо
Определение владельца списка рассылки с помощью Visual Basic
Чтобы передать права администрирования списка рассылки, сначала необходимо определить его владельца. Это можно сделать с помощью следующего кода:
Dim ExchangeServerName As String
Dim ExchangeServerOrganization As String
Dim ExchangeServerSite As String
Dim DistributionList As IADs
Dim DistributionListName As String
Dim DistributionListRelativePath As String.
ExchangeServerName = "EXCHANGE_SERVER"
ExchangeServerOrganization = "ADSITest"
ExchangeServerSite = "Macmillan"
DistributionListRelativePath = ""
DistributionListName = "DL_Senior_Management"
Set DistributionList = GetObject("LDAP://" & ExchangeServerName _
& "/d=" & ExchangeServerOrganization & "/ou=" _
& ExchangeServerSite & "/cn=Recipients" _
& DistributionListRelativePath & ”/cn=" & DistributionListName)
Debug.Print DistributionList.Owner
Создание модуля класса
LDAPObjectManagement
В этом разделе рассматривается процесс создания приложения СОМ-сервера LDAPAdmin. DLL.
Совет
Код этого проекта, а также скомпилированную его версию можно найти по адресу: http://www.williamspublishing.сот.
Упражнение 11.2. Создание LDAPAdmin.DLL: модуль LDAPObjectManagement
Откройте новый проект Visual Basic ActiveX DLL.
Установите ссылку на библиотеку Active DS Type Library и Microsoft ActiveX Data Objects, используя диалоговое окно References, доступ к которому осуществляется с помощью команды Projects References.
Переименуйте новый проект в LDAPAdmin.
Переименуйте модуль класса в LDAPObjectManagement.
Введите следующий код в раздел общих объявлений модуля класса:
Public Function ModifyObjectAttribute(ByVai _
ObjectDistinguishedName As String, ByVai DirectoryAdminUsername _ As String, ByVai DirectoryAdminPassword As String, ByVai _ AttributeName As String, ByVai NewAttributeValue _ As Variant) As Boolean
Dim dso As TADsOpenDSObject
Dim Obj As IADs
Set dso = GetObject("LDAP:")
Set Obj = dso.OpenDSObject(ObjectDistinguishedName, _ DirectoryAdminUsername, DirectoryAdminPassword, 0) Call Obj.Put(AttributeName, NewAttributeValue)
Obj.Setinfo
If Err.Number = 0 Then ModifyObjectAttribute = True End Function
Public Function CreateNewLDAPObject(ByVai _ ParentContainerDistinguishedName As String, ByVai _ DirectoryAdminUsername As String, ByVai DirectoryAdminPassword _ As String, ByVai ObjectRelativeName As String, ByVai _ Objectclass As String, Optional ByVai MandatoryAttributeNamel _ As String, Optional MandatoryAttributeValuel As Variant, Optional _ ByVai MandatoryAttributeName2 As String, Optional ByVai _ MandatoryAttributeValue2 As Variant, Optional ByVai _ MandatoryAttributeName3 As String, Optional ByVai _ MandatoryAttributeValue3 As Variant, Optional ByVai _ MandatoryAttributeName4 As String, Optional ByVai _ MandatoryAttributeValue4 As Variant, Optional ByVai _ MandatoryAttributeNameS As String, Optional ByVai _ MandatoryAttributeValueS As Variant) As Boolean
Dim dso As TADsOpenDSObject
Dim Obj As IADs
Dim ParentObj As IADs
Set dso = GetObject("LDAP:")
Set ParentObj = _
dso.OpenDSObject(ParentContainerDistinguishedName, _ DirectoryAdminUsername, DirectoryAdminPassword, 0) Set Obj = ParentObj.Create(Objectclass, ObjectRelativeName)
If MandatoryAttributeNamel <> "" Then
Obj.Put MandatoryAttributeNamel, MandatoryAttributeValuel End If
If MandatoryAttributeName2 <> "" Then
Obj.Put MandatoryAttributeName2, MandatoryAttributeValue2 End If
If MandatoryAttributeNamel <> "” Then
Obj.Put MandatoryAttributeName3, MandatoryAttributeValue3 End If
If MandatoryAttributeName4 <> "" Then
Obj . Put MandatoryAttributeNamel!, MandatoryAttributeValue4 End If
If MandatoryAttributeNameS <> "" Then
Obj.Put MandatoryAttributeNameS, MandatoryAttributeValueS End If
Obj.SetInfo
If Err.Number = 0 Then CreateNewLDAPObject = True
End Function
Public Function RemoveLDAPObject(ByVai _
ParentContainerDistinguishedName As String, ByVai _
DirectoryAdminUsername As String, ByVai DirectoryAdminPassword _ As String, ByVai ObjectRelativeName As String, ByVai Objectclass _ As String) As Boolean
Dim dso As lADsOpenDSObject
Dim Obj As IADs
Dim ParentObj As IADs
Set dso = GetObject("LDAP:")
Set ParentObj = _
dso.OpenDSObject(ParentContainerDistinguishedName, _ DirectoryAdminUsername, DirectoryAdminPassword, 0)
Call ParentObj.Delete(Objectclass, ObjectRelativeName)
If Err.Number = 0 Then RemoveLDAPObject = True
End Function
Public Function EnumerateLDAPContainer(ByVai _
ContainerDistinguishedName As String, ByVai DirectoryAdminUsername As String, ByVai DirectoryAdminPassword As String) As Variant
On Error Resume Next
Dim dso As lADsOpenDSObject
Dim Obj As IADs
Dim Item As IADs
Dim Counter As Long
Dim ReturnArray() As Variant
Set dso = Getobject("LDAP:")
Set Obj = dso.OpenDSObject(ContainerDistinguishedName, _ DirectoryAdminUsername, DirectoryAdminPassword, 0)
For Each Item In Obj
Counter = UBound(ReturnArray) + 1
ReDim Preserve ReturnArray(Counter)
ReturnArray(Counter) = item.Name
Next
EnumerateLDAPContainer = ReturnArray
End Function
Public Function SearchLDAPNamespace(ByVai SQLStmt As String) As Variant
On Error Resume Next
Dim Connection As ADODB.Connection
Dim RS As ADODB.Recordset
Dim Entry As String
Dim Index As String
Dim ReturnArray() As Variant
Dim Counter As Long
Index = 0
Set Connection = New ADODB.Connect ion
Connection.Provider = "ADsDSOObject"
Connection.Open "ADSI"
Set RS = Connection.Execute(SQLStmt)
While Not RS.EOF
For i = 0 To RS.Fields.Count - 1
If RS.Fields(i).Type = adVariant And Not
(IsNull(RS.Fields(i).Value)) Then
For j = LBound(RS.Fields(i).Value) To _
UBound(RS.Fields(i).Value)
Entry = Entry & RS.Fields(i).Value(j) & vbTab Next j
Else
Entry = Entry & RS.Fields(i).Value & vbTab End If
If Index = RS.Fields.Count - 1 Then'
Counter = UBound(ReturnArray) + 1 ReDim Preserve ReturnArray(Counter) ReturnArray(Counter) = Entry
End If
Index = Index + 1
Next i
Entry = ""
Index = 0
RS.MoveNext
Wend
SearchLDAPNamespace = ReturnArray
End Function
Скомпилируйте код в виде LDAPAdmin.DLL.
Сохраните и закройте проект LDAPAdmin.
Использование функций модуля LDAPObj ectManagement
После создания модуля класса LDAPObj ectManagement можно использовать его функции практически из любого языка программирования, который поддерживает автоматизацию OLE, например Visual Basic, VBScript или JavaScript.
Совет
Создание экземпляра объекта и необходимый синтаксис приведены в главе 3, “Методы перечисления контейнера и программное управление политикой учетных записей домена”. Не забудьте изменить имя класса на LDAPObjectManagement, где это необходимо.
В табл. 11.1 приведен синтаксис каждого метода интерфейса LDAPObjectManagement.
Таблица 11.1. Синтаксис методов интерфейса LDAPObjectManagement
Действие
Синтаксис
Модификация атрибута объекта
ModifyObjectAttribute("LDAP://Directory_Server/o=airius.com/ ou=people/uid=jlutz", "cn=directory manager", "l@undrym@tl962", "sn", "London")
Создание общего объекта в пространстве имен
Debug.Print CreateNewLDAPObject
LDAP("LDAP://Directory_Server/o=airius.com/ou=people", "cn=directory manager", "l@undrym@tl962", "uid=teck”, "inetOrgPerson", "cn", "Thomas Eck", "sn", "Eck", "givenName", "Thomas")
Перечисление объектов контейнера
For Each Item In EnumerateLDAPContainer( "LDAP://Directory_Server/o=airius.com/ou=people", "cn=directory manager", "l@undrym@tl962")
Debug.Print Item
Next
Удаление объекта из пространства имен LDAP
Debug.Print RemoveLDAPObject(
"LDAP://Directory_Server/o=airius.com/ou=people", "cn=directory manager", "l@undrym@tl962", "uid=eckth”, "inetOrgPerson")
Поиск в простран- ,'тве имен LDAP
For Each ObjName In SearchLDAP Attribute Value( "SELECT cn,telephonenumber FROM 'LDAP://Directory_Server/o=airius.com/ou=people' WHERE sn='carter'")
Debug.Print ObjName
Next
Создание модуля класса
ExchangeObjесtMgt
В этом разделе рассматривается процесс создания приложения СОМ-сервера MSExchAdmin. DLL.
Совет
Код этого проекта, а также скомпилированную его версию можно найти по адресу: http://www.williamspublishing.сот.
Упражнение 11.3. Создание MSExchAdmin.DLL: модуль ExchangeObjectMgt
Откройте новый проект Visual Basic ActiveX DLL.
Установите ссылку на библиотеку Active DS Type Library, воспользовавшись диалоговым окном References, доступ к которому осуществляется с помощью команды Project^ References.
Переименуйте новый проект в MSExchAdmin.
Переименуйте модуль класса в ExchangeObjectMgt.
Введите следующий код в раздел общих объявлений модуля класса:
Public Function CreateExchangeMailbox(ByVai ExchangeServerName _ As String, ByVai ExchangeServerOrganization As String, ByVai _ ExchangeServerSite As String, ByVai MailboxRelativePath As String, _ ByVai MaiIboxDisplayName As String, ByVai MailboxFirstName As _ String, ByVai MaiIboxLastName As String, ByVai _
MailboxMiddlelnitial As String, ByVai MailboxAlias As String, _
ByVai UserDomain As String, ByVai NTUserAccountToAssociate _
As String) As Boolean
Dim Mailbox As IADs
Dim MailboxParentContainer As IADs
Dim MTA As String
Dim MDB As String
Dim MailboxSMTPAddress As String
Dim MailboxX400Address As String
Dim MailboxCCMailAddress As String
Dim MailboxMSMailAddress As String
Dim SID As New ADsSID
Dim Security As New ADsSecurity
Dim SecurityDescriptor As lADsSecurityDescriptor
Dim DiscretionaryACL As lADsAccessControlList
Dim AccessControlEntry As New AccessControlEntry
MTA = "cn=Microsoft MTA,cn=" & ExchangeServerName _
",cn=Servers,cn=Configuration,ou=" & ExchangeServerSite _
”,o=" & ExchangeServerOrganization
MDB = "cn=Microsoft Private MDB,cn=" & ExchangeServerName _
",cn=Servers,cn=Configuration,ou=" & ExchangeServerSite _
",o=" & ExchangeServerOrganization
MailboxSMTPAddress = MailboxAlias & "0" & ExchangeServerSite _
' & "." & ExchangeServerOrganization & ".com"
MailboxX400Address = "c=US;a= ;p=" & ExchangeServerOrganization _
";o=" & ExchangeServerSite & ";s=" & MaiIboxLastName & ";g=" _
MailboxFirstName & ";i=" & MailboxMiddlelnitial
MailboxCCMailAddress = MailboxLastName & ", " & MailboxFirstName
& " at " & ExchangeServerSite
MailboxMSMailAddress = UCase(ExchangeServerOrganization & "/" _
& ExchangeServerSite & "/" & MailboxAlias)
Set MailboxParentContainer = GetObject("LDAP://" _
ExchangeServerName & "/o=" & ExchangeServerOrganization
"/ou=" & ExchangeServerSite & "/cn=Recipients" _
MailboxRelativePath)
Set Mailbox = _
MailboxParentContainer.Create("organizationalPerson", _ "cn=" & MailboxAlias)
Mailbox.Put "mailPreferenceOption", 0
Mailbox.Put "givenName", MailboxFirstName
Mailbox.Put "sn", MailboxLastName
Mailbox.Put "cn", MailboxDisplayName'
Mailbox.Put "uid", MailboxAlias
Mailbox.Put "Home-MTA", MTA
Mailbox.Put "Home-MDB", MDB
Mailbox.Put "mail", MailboxSMTPAddress
Mailbox.Put "MAPI-Recipient", True
Mailbox.Put "rfc822Mailbox", MailboxSMTPAddress
Mailbox.Put "textEncodedORAddress", MailboxX400Address
Mailbox.PutEx ADS_PROPERTY_APPEND, "otherMailbox", _ Array("CCMAIL$" & MailboxCCMailAddress, "MS$" _ & MailboxMSMailAddress)
SID.SetAs ADS_SID_WINNT_PATH, "WinNT://" & UserDomain & "/" s NTUserAccountToAssociate & ",user"
sidHex = SID.GetAs(ADS_SID_HEXSTRING)
Mailbox.Put "Assoc-NT-Account", sidHex
Mailbox.Setinfo
Set SecurityDescriptor = _
Security.GetSecurityDescriptor(Mailbox.ADsPath)
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL
AccessControlEntry.AceType = ADS_ACETYPE_ACCESS_ALLOWED
AccessControlEntry.Trustee = UserDomain £ "\" & MailboxAlias AccessControlEntry.AccessMask = ADS_RIGHT_EXCH_MAIL_SEND_AS Or ADS_RIGHT_EXCH_MAIL_RECEIVE_AS _"
Or ADS_RIGHT_EXCH_MODIFY_USER_ATT
DiscretionaryACL.AddAce AccessControlEntry
SecurityDescriptor.DiscretionaryACL = DiscretionaryACL Security.SetSecurityDescriptor SecurityDescriptor
If Err.Number = 0 Then CreateExchangeMailbox = True
End Function
Public Function RemoveExchangeMailbox(ByVal ExchangeServerName As String, ByVai ExchangeServerOrganization As String, ByVai _ ExchangeServerSite As String, ByVai MailboxRelativePath As _ String, ByVai MailboxToRemove As String) As Boolean
Dim MailboxParentContainer As lADsContainer
Set MailboxParentContainer = GetObject("LDAP://" _
ExchangeServerName & "/o=" & ExchangeServerOrganization _
"/ou=" & ExchangeServerSite & "/cn=Recipients" _
MailboxRelativePath)
Call MailboxParentContainer.Delete("organizationalPerson", _ "cn=" & MailboxToRemove)
If Err.Number = 0 Then RemoveExchangeMailbox = True End Function
Public Function AddExchangeDLMember(ByVai ExchangeServerName _ As String, ByVai ExchangeServerOrganization As String, ByVai _ ExchangeServerSite As String, ByVai DistributionListRelativePath _ As String, ByVai DistributionListName As String, ByVai _ DLMemberMailboxName As String) As Boolean
Dim DistributionList As IADs
Set DistributionList = GetObject("LDAP://" & ExchangeServerName
"/o=" & ExchangeServerOrganization & "/ou=" _
s ExchangeServerSite & "/cn=Recipients/cn=" _
DistributionListName)
DistributionList.Add ("LDAP://" & ExchangeServerName & ”/o=" _
ExchangeServerOrganization & "/ou=" s ExchangeServerSite _
s "/cn=Recipients" & "/cn=" s DLMemberMailboxName)
DistributionList.Setinfo
If Err.Number = 0 Then AddExchangeDLMember = True
End Function
Public Function RemoveExchangeDLMember(ByVai ExchangeServerName _ As String, ByVai ExchangeServerOrganization As String, ByVai _ ExchangeServerSite As String, ByVai DistributionListRelativePath _ As String, ByVai DistributionListName As String, _
ByVai DLMemberMailboxName As String) As Boolean
Dim DistributionList As IADs
Set DistributionList = GetObject("LDAP://" & ExchangeServerName
"/o=" & ExchangeServerOrganization & "/ou=" _
ExchangeServerSite & "/cn=Recipients" _
DistributionListRelativePath & ”/cn=” & DistributionListName)
DistributionList.Remove ("LDAP://" s ExchangeServerName _
"/o=" s ExchangeServerOrganization & "/ou=" _
s ExchangeServerSite & "/cn=Recipients" & "/cn=" _
DLMemberMailboxName)
DistributionList.Setinfo
If Err.Number = 0 Then RemoveExchangeDLMember = True
End Function" "
Public Function DetermineExchangeDLOwner(ByVai ExchangeServerName As String, ByVai ExchangeServerOrganization As String, _ ByVai ExchangeServerSite As String, ByVai _
DistributionListRelativePath As String, ByVai DistributionListName As String) As String
Dim DistributionList As IADs
Set DistributionList = GetObject("LDAP://" s ExchangeServerName _
"/o=" s ExchangeServerOrganization & "/ou=" _
s ExchangeServerSite s "/cn^Recipients" _
s DistributionListRelativePath & "/cn=" & DistributionListName)
DetermineExchangeDLOwner = DistributionList.Owner End Function
Скомпилируйте код в виде MSExchAdmin.DLL.
Сохраните и закройте проект MSExchAdmin.
Использование функций модуля ExchangeObjectMgt
После создания модуля класса ExchangeObjectMgt можно использовать его функции практически из любого языка программирования, который поддерживает автоматизацию OLE, например Visual Basic, VBScript или JavaScript.
Совет
Создание экземпляра объекта и необходимый синтаксис приведены в главе 3, “Методы перечисления контейнера и программное управление политикой учетных записей домена ”. Не забудьте изменить имя класса на ExcAaw^eObjectMgt, где это необходимо.
В табл. 11.2 приведен синтаксис каждого метода интерфейса ExchangeObjectMgt.
Таблица 11.2. Синтаксис методов интерфейса ExchangeObjectMgt
Действие
Синтаксис
Создание нового почтового ящика Exchange
Debug.Print CreateExchangeMailbox( "Exchange_Server", "ADSITest", "Macmillan", "", "Milan Kundera", "Milan", "Kundera", "-", "Milan.Kundera", "UserDomain", "mkundera")
Удаление существующего почтового ящика Exchange
Debug.Print RemoveExchangeMailbox( "Exchange_Server", "ADSITest", "Macmillan", "", "Milan.Kundera")
Добавление существующего почтового ящика как члена существующего списка рассылки
Удаление члена из списка рассылки
Debug.Print AddExchangeDLMember("Exchange_Server", "ADSITest", "Macmillan", "", "DL_Senior_Management", "Julian.Barnes")
Debug.Print RemoveExchangeDLMember( "Exchange_Server", "ADSITest", "Macmillan", "", "DL_Senior_Management", "Milan.Kundera")
Определение владельца списка рассылки
Debug.Print DetermineExchangeDLOwner( "Exchange_Server", "ADSITest", "Macmillan", "", "DL_Senior_Management")
Резюме
Для эффективной реализации взаимодействия подразделений компаний наилучшим образом подходит каталог LDAP. Созданный на основе документов RFC организации 1ETF стандарт LDAP определяет следующие аспекты:
тип хранимых данных (информационная модель);
организация данных (модель имен);
методы доступа и обновления данных в каталоге (функциональная модель);
зашита данных (модель безопасности).
Стандарт LDAP поддерживается многими основными приложениями Windows NT, Microsoft Windows 2000. Microsoft Exchange Server 5.5 и выше, Microsoft Site Server, практически всеми основными каталогами Internet (Yahoo, BigFoot, WhoWhere, VeriSign и т.д.) и даже некоторыми сетевыми устройствами.
Для модификации данных в каталоге можно воспользоваться экспортом и импортом файлов LD1F или же загрузить необходимый SDK производителя.
С помощью провайдера Microsoft LDAP (находящегося в библиотеках ADS1) можно программно получить доступ и управлять данными в каталоге LDAP. Кроме выполнения стандартных операций связывания, можно перечислять объекты контейнера и выполнять поиск в пространстве имен, используя стандартный синтаксис ANSI SQL в методе Execute объекта соединения ADO.
Корпорация Microsoft реализовала стандарты LDAP в нескольких продуктах семейства Microsoft BackOffice, что позволило программно управлять почтовыми ящиками Exchange и списками рассылки, а также выполнять другие административные задачи.
Поставщики будут с удовольствием использовать стандарт каталога LDAP для хранения конфигурационных данных приложения, что позволит создавать единые, интегрированные приложения, работающие на различных платформах.
12
Программное управление Active Directory Windows 2000
Несмотря на существенное обновление операционной системы Windows 2000 по сравнению с Windows NT, практически не изменились способы программного управления ее параметрами.
Active Directory (активный каталог) — это существенно модифицированная реализация объектов пользователей и групп на уровне компании, использующая упрощенный протокол для доступа к каталогу (Lightweight Directory Access Protocol — LDAP). Однако на рабочих станциях и серверах, не участвующих в управлении ресурсами, необходимо использовать провайдер ADSI Windows NT для управления локальными учетными записями и группами. А кроме того, на контроллере домена Windows 2000 Active Directory для выполнения большинства задач управления пользователями и группами можно продолжать использовать провайдер Windows NT.
В этой главе речь пойдет о возможностях провайдера ADSI LDAP в инфраструктуре Active Directory. Кроме того, вы познакомитесь с терминологией Active Directory и поддержкой провайдера интерфейсов ADSL Здесь также рассматриваются следующие темы:
связывание объектов в Active Directory;
управление объектами в Active Directory;
управление средствами безопасности объекта Active Directory.
Терминология Active Directory
Критики платформы Windows NT чаще всего указывают на невозможность использования базы SAM в масштабах компании, хотя эта операционная система и позиционируется на рынке корпоративных операционных систем. Несмотря на продолжающиеся дебаты вокруг Windows NT, даже самые непримиримые оппоненты этой системы не могут ничего сказать по поводу Active Directory.
Active Directory создан на основе документов RFC LDAP и обеспечивает создателей системы централизованным хранилищем корпоративной информации, начиная с данных сотрудников и заканчивая конфигурацией сетевых устройств.
Совет
Некоторые концепции, описанные в этой главе, пересекаются с темой главы 11, “Программное управление инфраструктурами LDAP".
Несмотря на то что Active Directory реализован на основе документов RFC, корпо- эация Microsoft использует новую терминологию, которая отличается от традиционной терминологии LDAP. Итак, прежде чем приступать к управлению Active Directory : помощью ADSI, рассмотрим кратко эти термины.
Атрибут (attribute). Характеристика каждого объекта; определяется схемой, установленной для каждого класса объекта. Атрибуты также называют свойствами объекта; эти термины взаимозаменяемы.
Домен (domain). Определяет границу процессов безопасности, администрирования и репликации. Домен может быть запушен в одном из режимов: естественный (все контроллеры домена Windows 2000) и смешанный (комбинация контроллеров домена Windows NT и Windows 2000). При запуске в естественном режиме домены получают преимущества общего администрирования групп, включая возможность создания вложенных и универсальных групп. Важно также отметить, что первый домен регистрируется как корневой, который не может быть переименован (по сведениям на момент написания книги).
Лес (forest). Коллекция деревьев, которые не используют совместно общее имя корневого домена. Деревья внутри одного и того же леса обмениваются информацией на основе автоматически установленных доверительных отношений.
Общий каталог (global catalog). Центральное хранилище часто используемой информации, описывающее создание частичной реплики каждого объекта в каталоге. Каждая частичная реплика объекта создана из определенного поднабора всех атрибутов каждого объекта. В результате общий каталог позволяет пользователю довольно быстро выполнять поиск определенного объекта по всему лесу, а также сохранять информацию, указывая реальное расположение объекта в лесу. Общий каталог является специфическим термином Active Directory.
Глобальный уникальный идентификатор (Globally Unique Identifier — GUID). Это 128-разрядное число, которое статистически не совпадает ни с одним числом из любого выбранного пространства имен. Этот идентификатор используется для уникальной и постоянной идентификации объектов; он не может быть изменен даже после перемещения какого-либо объекта в пространство имен. Даже при переименовании объекта GUID не изменяется. Такая стабильность позволяет постоянно идентифицировать связь объекта с другим объектом в каталоге.
Объект (object). Обычная запись определенного класса в каталоге. Объект “группа”, например, — это запись в каталоге, которая имеет значения для всех соответствующих свойств, определенных схемой для объекта группы. Кроме этого, объект может содержать различные дополнительные свойства, описывающие его; эти необязательные свойства также основаны на схеме, определенной для какого-либо класса объекта. Этот термин соответствует записи в LDAP.
Организационный блок (Organization Unit — OU). Контейнер используемый для хранения объектов в домене, позволяет логически группировать объемы по географическому, функциональному или административному принципу. Организационный блок особенно важен для делегирования администрирования (рекомендуется делегирование прав только на уровне организационного блока) и позволяет всем дочерним объектам наследовать разрешения, установленные для их родительских объектов-контейнеров. Кроме этого, организационный блок позволяет ограничить использование нескольких моделей с головным доменом, которые в настоящее время реализованы в больших сетях на базе Windows NT.
Узел (site). Определяет границу высокоскоростного подключения IP для оптимизации потока данных и увеличения вероятности успешной аутентификации. Несмотря на размещение в Active Directory, узел не является частью стандартной терминологии LDAP.
Дерево (tree). Если два домена совместно используют одно корневое имя, иерархическая структура, создаваемая таким образом, называется деревом. Между отдельными доменами в дереве автоматически определяется два способа транзитивных доверительных отношений. Чтобы лучше понять эту концепцию, предположим, что компания может иметь отдельные домены для отделов технической поддержки, продаж и маркетинга. Поскольку эти три сущности являются частью одного и того же корневого домена, они образуют дерево.
Главное имя пользователя (User Principal Name — UPN). Создается по умолчанию с помощью объединения регистрационного имени пользователя и имени DNS домена, которому принадлежит пользователь. Это имя может использоваться для уникальной идентификации пользовательского объекта при регистрации. Microsoft выбрала структуру главного имени пользователя, совпадающую с адресом электронной почты Internet, так что компании, создавшие уникальные адреса электронной почты сотрудников, могут использовать эти имена в качестве регистрационных.
Примечание
Более подробную информацию о темах, затронутых в этой главе, можно найти в других источниках, список которых приведен в приложении В, “Дополнительные источники информации ”.
Связывание объектов в Active .Directory
Несмотря на то что Active Directory изменяет наши представления о доменах пользователей, при работе на уровне рабочей станции и на отдельном сервере необходимо использовать провайдер ADS1 Windows NT (WinNT:). Например, для создания учетной записи пользователя на сервере можно продолжать использовать код, который применяется для аналогичных целей в среде Windows NT.
Используйте фрагменты кола, приведенные в этой главе в качестве примера обновления строки связывания, который манипулирует учетными записями пользователей, компьютеров, групп или очередей печати в каталоге Windows 2000. В большинстве случаев для выполнения необходимых действий можно использовать тот же код, изменив лишь строку связывания, указывающую расположение объекта в иерархической структуре данных Active Directory.
Использование модуля ADSI Edit ММС для изучения Active Directory
С помощью модуля ADSI Edit ММС можно просматривать и редактировать объекты в Active Directory на довольно низком уровне. Этот инструмент дублирует большинство функций стандартных инструментов администрирования ММС. Описываемый модуль будет особенно полезен для просмотра классов объектов, их обязательных и необязательных свойств, а также содержимого и иерархической структуры контекста имен домена, схемы и контейнеров конфигурации.
Связывание корневой записи DS (RootDSE) с помощью Visual Basic
Как часть документа RFC-2251, стандарт LDAP требует, чтобы все каталоги LDAP поддерживали набор свойств, которые любой пользователь может просмотреть для поиска различных ключей, характеризующих каталог. Эта характеристика включает текущее время сервера, имя сервера LDAP и имя сервера DNS. Эта информация хранится в RootDSE и поддерживает каждое свойство как атрибут объекта.
Для просмотра этих свойств используйте следующий код:
Dim RootDSE As IADs
Set RootDSE = GetObject("LDAP://RootDSE")
Debug.Print "Current Time: " & RootDSE.Get("CurrentTime")
Debug.Print "SubSchemaSubEntry: " & RootDSE.Get("SubSchemaSubEntry")
Debug.Print "DsServiceName: " & RootDSE.Get("DsServiceName")
For Each Item In RootDSE.Get("NamingContexts")
Debug.Print "Naming Context: " 4 Item Next
Debug.Print "Default Naming Context: " & _
RootDSE.Get("DefaultNamingContext")
Debug.Print "Schema Naming Context: " 4 _
RootDSE.Get("SchemaNamingContext")■
Debug.Print "Configuration Naming Context: " 4 _
RootDSE.Get("ConfigurationNamingContext")
Debug.Print "Root Domain Naming Context: " 4 _
RootDSE.Get("RootDomainNamingContext")
For Each Item In RootDSE.Get("SupportedControl")
Debug.Print "Supported Control: " 4 Item Next
For Each Item In RootDSE.Get("SupportedLDAPVersion")
Debug.Print "Supported LDAP Version: " 4 Item Next
Debug.Print "Highest Committed DSN: " 4 _
RootDSE.Get("HighestCommittedUSN")•
For Each Item In RootDSE.Get("SupportedSASLMechanisms")
Debug.Print "Supported SASL Mechanism: " 4 Item Next
Debug.Print "DNS Host Name: " 4 RootDSE.Get("DnsHostName")
Debug.Print "LDAP Service Name: " 4 RootDSE.Get("LdapServiceName")
Debug.Print "Server Name: " 4 RootDSE.Get("ServerName")
Использование в Visual Basic атрибута DefaultNamingContext RootDSE для связывания объекта Active Directory с помощью текущих аутентификационных параметров
Трудоемкое кодирование характерных имен можно устранить, используя по умолчанию контекст имен для описания имени домена, в котором вы регистрируетесь во время выполнения..
Следующий фрагмент кода возвращает характерное имя текущего домена пользователя во время выполнения:
Dim DefaultDomain As IADs
Dim RootDSE As IADs
Set RootDSE = GetObject("LDAP://RootDSE")
Set DefaultDomain = GetObject("LDAP://" s _
RootDSE.Get("DefaultNamingContext"))
Совет
Этот код должен составлять основу всех операций связывания, выполняемых в текущем домене пользователя; он устраняет необходимость определять имена сервера и домена или аутентификационную информацию во время выполнения.
Примечание
В приведенном фрагменте кода устанавливается связывание на уровне домена. Однако вы можете определить любую точку в иерархии, вставляя относительные различные имена структуры в строке между LDAP: // и RootDSE. Get.
Связывание объекта Active Directory с помощью альтернативной аутентификации
Для связывания Active Directory с набором аутентификационных параметров (имя пользователя и пароль), отличных от используемых клиентом, можно обратиться к интерфейсу lADsOpenDSObject с помощью следующего кода Visual Basic:
Dim DSO As TADsOpenDSCbject
Dim Obj As IADs
Dim AdsPath As String
Dim AlternateUser_UPN As String
Dim AlternateUser_Password As String
AdsPath = _
"LDAP://Server_Name.ResearchDevelopment.Testlnfra/cn= _
Users,dc=ResearchDevelopment,dc=TestInfra"
AlternateUser_UPN = "thomas.eck@ResearchDevelopment.Testlnfra"
Alternateuser Password = "P011tlc@l@rs0ni$t"
Set DSO = GetObject("LDAP:")
Set Obj = DSO.OpenDSObject(AdsPath, AlternateUser_UPN, AlternateUser_Password, ADS SECURE AUTHENTICATION)
Примечание
В примере из предыдущего раздела связывание выполняется с совершенно другим доменом; несмотря на это, можно использовать аналогичный код для определения альтернативного пользователя, который может получить доступ к закрытым атрибутам в
том же домене. Старайтесь по возможности описывать программный контекст именования по умолчанию, как показано в приведенном примере.
В подобных случаях можно использовать альтернативную аутентификацию, только после ошибки вызова GetObject при аутентификации пользователя. Для реализации подобного сценария используйте проверку условия Err.Number = 0. Если возвращается какое-либо ненулевое значение при связывании, можно выполнить последующий код, предложив пользователю ввести необходимую аутентификационную информацию во время выполнения.
Просмотр леса с помощью общего каталога и Visual Basic
Если вы не уверены в точном расположении элемента в лесу, используйте следующий код для выполнения поиска в общем каталоге:
Dim Container As ZADsContainer.
Dim GC As IADs
Dim ADsPath As String
Dim Obj As Variant
Dim Conn As ADODB.Connect ion"
Dim Command As ADODB.Command
Dim RS As ADODB.Recordset■
Dim SQLStmt As String
'Измените следующий оператор SQL для отображения объектов, 'удовлетворяющих определенному критерию
SQLStmt = "SELECT cn, distinguishedName FROM '" 5 ADsPath _
S "' WHERE objectcategory = 'person' AND objectclass = 'user'"
Set Container = GetObject ("GC: ")
For Each Obj In Container
Set GC = Obj
Next
ADsPath = GC.ADsPath
Set Conn = New ADODB.Connection
Set Command = New ADODB.Command
Conn.Provider = "ADsDSOObject"
Conn.Open
Set Command.ActiveConnection = Conn
Set RS = Conn.Execute(SQLStmt)
While Not RS.EOF
Debug.Print RS.Fields("cn") & vbTab & RS.Fields("distinguishedName") RS.MoveNext
Wend
RS .Close
Conn.Close
Изменив оператор SQL, можно вернуть параметр AdsPath любого необходимого объекта в лесу.
Определение с помощью Visual Basic атрибутов объектов, реплицируемых в общий каталог-■
Чтобы отыскать атрибуты, реплицированные в общий каталог, используйте ADO для выполнения запроса к контейнеру схемы, содержащему все объекты, поддерживающие условие True для атрибута IsMemberOfPartialAttributeSet, с помощью следующего кода Visual Basic:
Dim Connection As ADODB.Connection
Dim RS As ADODB.Recordset
Dim Entry As String
Dim Index As Long
Dim RootDSE As IADs
Dim Schemacontainer As IADs
Index = 0
Set Connection = New ADODB.Connection
Connection.Provider = "ADsDSOObject"
Connection.Open "ADSI"
Set RootDSE = GetObject("LDAP://RootDSE")
Set Schemacontainer = GetObject("LDAP://" _
RootDSE.Get("SchemaNamingContext"))
Set RS - Connection.Execute("SELECT cn FROM "' _
Schemacontainer.AdsPath 4 "' WHERE _ isMemberOfPartialAttributeSet = TRUE AND _ objectcategory = 'attributeschema'")
While Not RS.EOF
For i = 0 To RS.Fields.Count - 1
If RS.Fields(i).Type = adVariant And Not _
(IsNull(RS.Fields(i).Value)) Then
For j = LBound(RS.Fields(i).Value) To _
UBound(RS.Fields(i).Value)
Entry = Entry 4 RS.Fields(i).Value(j) 4 vbTab Next j
Else
Entry = Entry 4 RS.Fields(1).Value 4 vbTab End If
If Index = RS.Fields.Count - 1 Then
Debug.Print Entry
End If
Index = Index + 1
Next i
Entry = ""
Index = 0
RS.MoveNext '■
Wend
Примечание
He забудьте перед запуском этого кода установить ссылку на библиотеку типов Microsoft ActiveX Data Objects.
Управление объектами в Active Directory
Для создания объекта в каталоге вначале необходимо реализовать объект определенного класса, присвоить значения обязательных атрибутов и только после этого поместить объект в каталог. Таким образом, можно сделать вывод, что объекты в.каталоге отличаются классом и присвоенными значениями.
Следовательно, можно перечислять, создавать и удалять объекты каталога, используя общий синтаксис кода и изменяя присваиваемые значения соответствующего создаваемого объекта.
Отображение всех объектов пользователей в Active Directory с помощью Visual Basic
Для перечисления всех пользовательских объектов выбранного контейнера в Active Directory используйте следующий код:
Dim RootDSE As IADs
Dim UserContainer As lADsContainer
Dim User As IADs
Dim RelativePathFromDomainToUserContainer As String
RelativePathFromDomainToUserContainer = "ou=user accounts,"
Set RootDSE = GetObject("LDAP://RootDSE") Set UserContainer = GetObject("LDAP://" _ & RelatIvePathFromDomainToUserContainer & RootDSE.Get("DefaultNamingContext")) UserContainer.Filter = Array("User")
For Each User In UserContainer
Debug.Print User.AdsPath
Next
Примечание
В приведенном фрагменте кода применяется свойство Filter интерфейса lADsContainer для отображения объектов, принадлежащих только классу User.
Отображение всех объектов групп в Active Directory с помощью Visual Basic
Изменяя значение свойства Filter интерфейса lADsContainer, можно перечислять содержимое соответствующих контейнеров. Для перечисления относительного пути групп воспользуйтесь кодом
Dim RootDSE As IADs
Dim GroupContainer As lADsContainer
Dim Group As IADs
Dim RelatIvePathFromDomainToGroupContainer As String
RelativePathFromDomainToGroupContainer = "ou=Groups,ou=Chicago,"
Set RootDSE = GetObject("LDAP://RootDSE")
Set GroupContainer = GetObject("LDAP://" _
RelativePathFromDomainToGroupContainer _
RootDSE.Get("defaultNamingContext”))
GroupContainer.Filter = Array("Group")_
For Each Group In GroupContainer
Debug.Print Group.AdsPath■
Next
Отображение всех объектов компьютеров в Active Directory с помощью Visual Basic
Для просмотра всех учетных записей компьютеров в выбранном контейнере используйте код
Dim RootDSE As IADs
Dim ComputerAccountContainer As lADsContainer
Dim ComputerAccount As IADs
Dim RelativePathFromDomainToComputerContainer As String
RelativePathFromDomainToComputerContainer = _ "ou=Workstations,ou=Computer Accounts,ou=Chicago"
Set RootDSE = GetObject("LDAP://RootDSE")
Set ComputerAccountContainer = GetObject("LDAP://" _
RelativePathFromDomainToComputerContainer _
RootDSE.Get("defaultNamingContext"))
ComputerAccountContainer.Filter = Array("Computer")
For Each ComputerAccount In ComputerAccountContainer Debug.Print ComputerAccount.AdsPath
Next
Создание объектов в Active Directory
При создании объектов в Active Directory (как и в каталоге LDAP) необходимо владеть следующей информацией:
желаемое месторасположение в каталоге;
класс создаваемого объекта;
соответствующие значения обязательных атрибутов выбранного класса.
В табл. 12.1 приведены значения обязательных атрибутов наиболее часто создаваемых объектов в Active Directory.
Таблица 12.1. Обязательные атрибуты объектов, наиболее часто используемых в Active Directory
Объект
Обязательный атрибут
Тип данных
computer
СП
String
sAMAccountName
String
contact
СП
String
container
СП
String .
group
СП
String
groupType
Integer
sAMAccountName
String
locality
1
String
organizational Unit
OU
String
Объект
Обязательный атрибут
Тип данных
printQueue
СП
String
shortServerName
String
serverName
String
printerName
String
versionNumber
Integer
uNCName
String
user
cn
String
sAMAccountName
String
Создание объектов в Active Directory с помощью Visual Basic
Для создания практически любого объекта в Active Directory можно использовать следующий код:
Dim RootDSE As IADs
Dim Container As lADsContainer
Dim RelativePathToObject'As String
Dim Objectclass As String•
Dim ObjectName As String
Dim NewObject As IADs
Dim MandatoryPropertyl_Name As String
Dim MandatoryPropertyl_Value As String
'Здесь объявите другие обязательные свойства
RelativePathToObject = "ou=administrators,"
Objectclass = "user".
ObjectRelativeName = "cn=TestAdmin"
MandatoryPropertyl_Name = "sAMAccountName"
MandatoryPropertyl_Value = "TestAdmin"
'Здесь определите другие значения обязательных свойств
Set RootDSE = GetObject("LDAP://RootDSE")
Set Container = GetObject("LDAP://" 4 RelativePathToObject _
4 RootDSE.Get("defaultNamingContext"))
Set NewObject = Container.Create(Objectclass, ObjectRelativeName)
NewObject.Put MandatoryPropertyl_Name, MandatoryPropertyl_Value 'Назначьте объекту другие значения обязательных свойств
NewObject.Setinfo
Примечание
Для создания групп, учетных записей компьютеров или учетных записей пользователей в Active Directory используйте код, приведенный в главе 3, “Методы перечисления контейнера и программное управление политикой учетных записей домена ”. Код создания этих объектов на отдельном сервере или рабочей станции Windows 2000 аналогичен коду для инфраструктуры Windows NT.
Отображение классов и ассоциированных с ними обязательных атрибутов с помощью Visual Basic
Для просмотра обязательных атрибутов класса любого существующего объекта в Active Directory используйте следующий код:
Dim RootDSE As IADs
Dim ObjectName As IADs
Dim Objectclass As IADs
Dim RelativePath As String
Dim Obj As IADs
Dim Mandatoryproperty As Variant
RelativePath = "cn=System,"
Set RootDSE = GetObject("LDAP://RootDSE")
ADsPath = "LDAP://" & RelativePath _
& RootDSE.Get("DefaultNamingContext")
Set ObjectName = GetObject(ADsPath)
Debug.Print "Object Name: " & ObjectName.Name
Debug.Print "Object Class: " & ObjectName.Class
Set Objectclass = GetObject(ObjectName.Schema)
For Each Mandatoryproperty In ObjectClass.Mandatoryproperties
Debug.Print vbTab & Mandatoryproperty
Next
Удаление объектов из Active Directory с помощью Visual Basic
Для удаления объектов из Active Directory необходимо знать класс объекта, относительное имя объекта и характерный путь к объекту. Итак, для удаления любого объекта из Active Directory воспользуйтесь кодом
Dim RootDSE As IADs
Dim Container As lADsContainer
Dim RelativePathToObject As String
Dim Objectclass As String
Dim ObjectName As String
RelativePathToObject = "ou=administrators,"
Objectclass = "user"
ObjectRelativeName = "cn=TestAdmin"
Set RootDSE = GetObject("LDAP://RootDSE")
Set Container = GetObject("LDAP://" 4 RelativePathToObject & RootDSE.Get("DefaultNamingContext"))
Call Container.Delete(ObjectClass, ObjectRelativeName)
Удаление всей ветви дерева каталога
Используя интерфейс lADsDeleteOps, можно “подрезать” ветви дерева каталога. С помощью этого интерфейса удаляется объект, а также его дочерние объекты. Напри-
мер, для удаления организационного блока Print Queues из дерева используйте следующий код Visual Basic:
Dim RootDSE As IADs
Dim Container As lADsDeleteOps
Dim RelativePathToObject As String
RelativePathToObject = "ou=Print Queues,"
Set RootDSE = GetObject("LDAP://RootDSE")
Set Container = GetObject("LDAP://" & RelativePathToObject _
& RootDSE.Get("DefaultNamingContext"))
Container.DeleteObject (0)
Переименование объектов в Active Directory
Для переименования объекта Active Directory необходимо использовать метод MoveHere интерфейса lADsContainer. Несмотря на то что этот метод предназначен для перемещения объекта из одного места в другое, при одинаковом оригинальном месте и месте назначения контейнера, но новом имени объекта выполняется его переименование.
Итак, чтобы переименовать объект в Active Directory, используйте следующий код Visual Basic:
Dim Container As lADsContainer
Dim NewObjectName As IADs
Set Container = GetObject("LDAP://ou=Adnins,dc=eCommerce2000,dc=com")
Set NewObjectName = _
Container.MoveHere("LDAP://cn=Administrator,ou=Admins, _ dc=eCommerce2000,dc=com", "cn=DMZAdmin")
Внимание
При неверном использовании интерфейс lADsDeleteOps может привести к существенному повреждению пространства имен. Будьте особо внимательны, разрешая пользователям обращаться к иному интерфейсу.
Перемещение объектов по дереву
Для перемещения объекта необходимо использовать метод MoveHere интерфейса lADsContaincr: вначале свяжите контейнер, а затем выберите перемещаемый объект (в виде аргумента этого метода), как показано в приведенном ниже фрагменте кода Visual Basic.'
Dim Contains As lADsContainer
Dim NewObjectName As IADs
Set Container = GetObject("LDAP://ou=Users,dc=eCommerce2000,dc=com")
Set NewObjectName = _
Container.MoveHere("LDAP://cn=DMZAdmin,ou=Admins, _ dc=eCommerce20G0,dc-com", vbNullString)
Совет
Вы можете переместить и одновременно переименовать объект, передав новое имя объекта в качестве второго аргумента метода MoveHere интерфейса lADsContainer.
Внимание
Поскольку VBScript не имеет констант типа vbNullString, необходимо использовать явное имя объекта (например, cn=DMZAdmin) в качестве второго аргумента метода MoveHere интерфейса TADsContainer.
Управление безопасностью объектов в Active Directory
Проанализировав критику разделения модели администрирования, реализованной в Windows NT, корпорация Microsoft попыталась в Active Directory снизить нагрузку на администраторов системы. Такая свобода усложнила дизайн и программное управление записями каталога. Однако большинство администраторов согласны с таким усложнением, которое открывает дополнительные возможности, связанные с улучшенной разделяемой моделью администрирования.
Внимание
Программное администрирование дескрипторов безопасности объектов Active Directory — это тема, не относящаяся к Active Directory или Visual Basic. Для оптимальной реализации работающей модели безопасности довольно часто придется передавать свойства, форматированные schemalDGuid для каждого класса объекта или определения атрибута.
Безопасное администрирование объектов в каталоге сводится к выполнению ряда действий.
Свяжите объект в каталоге.
Откройте дескриптор безопасности объекта.
Получите из дескриптора безопасности дискреционный список контроля доступа (Discretionary Access Control List — DACL).
Создайте новый элемент контроля доступа (Access Control Entry- — АСЕ).
Назначьте соответствующие константы полям в АСЕ.
Назначьте владельца АСЕ.
Сохраните АСЕ в DACL.
Сохраните DACL в дескрипторе безопасности.
Обновите данные в Active Directory.
На основе констант, назначаемых свойствам АСЕ, можно определить, какие дочерние объекты должны наследовать разрешения, установленные для родительского объекта, а также должны ли все дочерние объекты наследовать необходимые разрешения либо могут воздействовать только на один класс или определение атрибута.
Дескрипторами безопасности можно управлять программно. Далее рассматривается самое полезное свойство системы безопасности Active Directory — делегирование административных полномочий.
Управляя безопасностью на уровне атрибута, можно создать модель администрирования, в которой определенные группы пользователей смогут управлять небольшой частью свойств всех пользователей в выбранном контейнере. Представьте себе, насколько снижается число административных задач, например,
при создании Web-страницы, где каждый пользователь может управлять только собственной информацией. Число подобного рода решений зависит только от дизайна каталога и вашего воображения.
Константы, используемые в АСЕ
Для настройки АСЕ объекта в Active Directory необходимо определить соответствующую константу, указывающую на предоставляемые права, тип элемента управления доступом и областью наследования для АСЕ.
Права доступа к объекту каталога
Для определения прав объекта в Active Directory полю AccessMask в АСЕ можно назначить любую из констант, приведенных в табл. 12.2.
Таблица 12.2. Флаги свойства AccessMask
Константа
Значение
Описание
Full Control Access
-1
Для полного доступа установите значение поля AccessMask в АСЕ равным -1
ADS_RIGHT_DS_CREATE_ CHILD
0x1
Устанавливает возможность создания дочерних объектов. Все объекты могут быть созданы, пока поле ObjectType в АСЕ содержит верное значение schemaIDGuid для каждого класса объекта
ADS_RIGHT_DS_DELETE_ CHILD
0x2
Устанавливает возможность удаления дочерних объектов всех классов, пока ObjectType в АСЕ содержит верное значение schema/DGuid для каждого класса объекта
ADS_RIGHT_ACTRL_DS_ LIST
0x4
Устанавливает возможность просмотра всех дочерних объектов
ADS_RIGHT_DS_SELF
0x8
Устанавливает возможность просмотра самого объекта
ADS_RIGHT_DS_READ_ PROP
0x10
Устанавливает возможность чтения свойств объекта. Установка значению ObjectType верного свойства или GU1D набора свойств ограничивает права определенного свойства или набора свойств
ADS_RIGHT_DS_WRITE_ PROP
0x20
Устанавливает возможность записи свойств объекта. Может быть ограничено с помощью ObjectType в АСЕ. Установка значению ObjectType верного свойства или GU1D набора свойств ограничивает права определенного свойства или набора свойств
ADS_RIGHT_DS_DELETE_ TREE
0x40
Устанавливает возможность удаления объекта и ассоциированных дочерних объектов
ADS_RIGHT_DS_LIST_ OBJECT
0x80
Может использоваться для отображения или сокрытия объекта из представления пользователя
ADS_RIGHT_DS_CO^TROL_ ACCESS
0x100
Устанавливает возможность выполнения операций ограничения существующих прав доступа. Должен быть определен правильный GLHD, идентифицирующий объект controlAccessRight в контейнере дополнительных прав в разделе конфигурирования (контекста имен)
Константа
Значение
Описание
ADS_RIGHT_DELETE
0x10000
Устанавливает права удаления объекта
ADS_RIGHT_READ_ CONTROL
0x20000
Устанавливает права считывания дескриптора безопасности объекта
ADS_RIGHT_WRITE_DAC
0x40000
Устанавливает права модификации дискреционного списка управлением доступом
ADS_RIGHT_OWNER
0x80000
Устанавливает права изменения владельца объекта
ADS_RIGHT_SYNCHRONIZE
0x100000
Активизирует объект, используемый для синхронизации
ADS_RIGHT_ACCE SS_ SYSTEM_SECURITY
0x1000000
Устанавливает права управления SACL объекта
ADS_RIGHT_G5NERIC_ALL
0x10000000
Устанавливает права создания или удаления дочерних объектов и поддеревьев, считывание и запись всех свойств, а также добавление или удаление объектов каталога
ADS_RIGHT_GENERIC_ EXECUTE
0x20000000
Устанавливает возможность просмотра дочерних объектов
ADS_RIGHT_GENERIC_
WRITE
0x40000000
Устанавливает права записи в DACL и все свойства, а также удаляет объект из каталога
ADS_RIGHT_GENERIC_
READ
0x80000000
Устанавливает права считывания дескриптора ■ безопасности, всех свойств и любых дочерних объектов
Типы элемента контроля доступа
Для определения типа АСЕ, используемого в списке контроля доступа Active Directory, в поле АсеТуре можно воспользоваться константами, приведенными в табл. 12.3.
Таблица 12.3. Значения флага АсеТуре
Константа
Значение
Описание
ADS_ACETYPE_ACCESS_
ALLOWED
0
Доступ разрешен, различия между классами объектов не су шествует
ADS_ACETYPE_ACCESS_ DENIED
0x1
Доступ запретен, различия между классами объектов нс существует
ADS_ACETYPE_SYSTEM_
AUDIT
0x2
Системный тип АСЕ, различия между классами объектов не существует
ADS_ACETYPE_ACCESS_ ALLOWED_OBJECT
0x5
Доступ разрешен для объектов, определенных с помощью ObjectType или InheritedObjectType
ADS_ACETYPE_ACCESS_ DENIED_OBJECT
0x6
Доступ запрещен для объектов, определенных с помощью ObjectType или InheritedObjectType
ADS_ACETYPE_SYSTEM_ AUDIT_OBJECT
0x7
Системный тип АСЕ, применяется только к объектам, определенным с помощью ObjectType или InheritedObjectType
Распространение и наследование безопасности
Для определения области наследования и использования системы сообщений аудита введите одну из констант (табл. 12.4) в поле AceFlags.
Таблица 12.4. Значения флага AceFlags
Константа
Значение
Описание
ADS_ACEFLAG_INHERIT_ACE
0x2
Дочерние объекты наследуют АСЕ, пока установлен флаг ads_aceflag_no_ PROPAGATE_INHERIT_ACE
ADS_ACEFLAG_NO_PROPAGATE_ INHERIT_ACE
0x4
Все записи АСЕ для всех дочерних объектов не содержат этого АСЕ
ADS_ACEFLAG_INHERIT_ONLY_ACE
0x8
Определяет АСЕ наследуемых дочерних объектов, но нс для самого АСЕ
ADS_ACEFLAG_INHERITSD_ACE
0x10
Контролируемый системой бит для определения, описывался ли АСЕ из родительского объекта
ADS_ACEFLAG_VALID_INHERIT_FLAGS
Oxlf
Контролируемый системой бит для определения, верны ли наследуемые флаги
ADS_ACEFLAG_SUCCESSFUL_ACCESS
0x40
Используется с SACL АСЕ для генерации успешного сообщения
ADS_ACEFLAG_FAILED_ACCESS
0x8Q
Используется с SACL АСЕ для генерации сообщения об ошибке
Константы ObjectType
Чтобы ограничить АСЕ определенного класса объектов (или даже отдельного атрибута класса), установите значение schemalDGuid, ассоциированное с классом объекта, полю ObjectType в АСЕ, а затем назначьте полю Flags в АСЕ одну из констант, приведенных в табл. 12.5.
Таблица 12.5. Значения флага Flags АСЕ
Константа
Значение Описание'
ADS_FLAG_OBJECT_TYPE_ PRESENT
0x1Указывает, что поле ObjectType заполнено значе
нием schemalDGuid и что должен использоваться GU1D ObjectType
ADS_FLAG_INHERITED_ OBJECT_TYPE_PRESENT
0x2Указывает, что поле InheritedObjectType запол
нено значением schemalDGuid и что должен использоваться GUID InheritedObjectType
Основы управления безопасностью Active Directory
Каждый объект в Active Directory поддерживает дескриптор безопасности, которым можно программно управлять с помощью Visual Basic. В этом разделе рассматриваются основы управления дескриптором безопасности объекта, включая список определенных записей контроля доступа, их обновление и удаление.
Перечисление записей АСЕ в списке ACL Active Directory с помощью Visual Basic
Для перечисления записей АСЕ в ACL дескриптора безопасности объекта используйте следующий код:'
Dim Obj As IADs
Dim ACE As AccessControlEntry
Dim DiscretionaryACL As AccessControlList
Dim SecurityDescriptor As lADsSecurityDescripter
Dim ObjectDistinguishedName As String
ObjectDistinguishedName = "ou=Admins,dc=eCommerce2000,dc=com"
Set Obj = GetObject("LDAP:// " & ObjectDistinguishedName)
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL
For Each ACE In DiscretionaryACL
Debug.Print ACE.Trustee
If (ACE.AccessMask And ADS_RIGHT_DELETE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Debug.Print vbTab & "ADS_RIGHT_DELETE"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_DELETE for SchemalDGuid: " _
ACE.ObjectType
Else
Debug.Print vbTab & "Inherited ADS_RIGHT_DELETE _
for SchemalDGuid: " & ACE.InheritedObjectType
End If End If End If
If (ACE.AccessMask And ADS_RIGHT_READ_CONTROL) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Debug.Print vbTab & "ADS_RIGHT_READ_CONTROL"
Else
If ACE.InheritedObjectType = "" Then ' .
Debug.Print vbTab & "ADS_RIGHT_READ_CONTROL for _
SchemalDGuid: " & ACE.ObjectType Else
Debug.Print vbTab & "Inherited ADS_RIGHT_READ_CONTROL _
for SchemalDGuid: " s ACE.InheritedObjectType End If
End If End If
If (ACE.AccessMask And ADS_RIGHT_WRITE_DAC) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Debug.Print vbTab s "ADS_RIGHT_WRITE_DAC"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_WRITE_DAC for _
SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab & "Inherited ADS_RIGHT_WRITE_DAC _
for SchemalDGuid: " & ACE.InheritedObjectType
End If.
End If End If
If (ACE.AccessMask And ADS_RIGHT_WRITE_OWNER) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Debug.Print vbTab & "ADS_RIGHT_WRITE_OWNER"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_WRITE_OWNER for _
SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab & "Inherited ADS_RIGHT_WRITE_OWNER _ for SchemalDGuid: " & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_SYNCHRONIZE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Debug.Print vbTab & "ADS_RIGHT_SYNCHRONIZE"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_SYNCHRONIZE for _
SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab & "Inherited ADS_RIGHT_SYNCHRONIZE _ for SchemalDGuid: " & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_ACCESS_SYSTEM_SECURITY) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Debug.Print vbTab & "ADS_RIGHT_ACCESS_SYSTEM_SECURITY"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_ACCESS_SYSTEM_SECURITY _
for SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab & "Inherited _
ADS_RIGHT_ACCESS_SYSTEM_SECURITY for SchemalDGuid: "
ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_GENERIC_READ) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Debug.Print vbTab & "ADS_RIGHT_GENERIC_READ"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_GENERIC_READ for
SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab & "Inherited ADS_RIGHT_GENERIC_READ _ for SchemalDGuid: " & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_GENERIC_WRITE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Debug. Print vbTab & ."ADS_RIGHT_GENERIC_WRITE"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_GENERIC_WRITE for _ SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab & "Inherited ADS_RIGHT_GENERIC_WRITE _ for SchemalDGuid: " & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_GENERIC_EXECUTE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Debug.Print vbTab & "ADS_RIGHT_GENERIC_EXECUTE"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_GENERIC_EXECUTE for
SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab S "Inherited ADS_RIGHT_GENERIC_EXECUTE _ for SchemalDGuid: " & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_GENERIC_ALL) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Debug.Print vbTab & "ADS_RIGHT_GENERIC_ALL"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_GENERIC_ALL for _
SchemalDGuid: " & ACE.ObjectType
Else
Debug. Print vbTab & "Inherited ADS_RIGHT_GENERIC_ALL _ for SchemalDGuid: " & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_CREATE_CHILD) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Debug.Print vbTab & "ADS_RIGHT_DS_CREATE_CHILD"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_DS_CREATE_CHILD for _
SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab S "Inherited ADS_RIGHT_DS_CREATE_CHILD _ for SchemalDGuid: " & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_DELETE_CHILD) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Debug.Print vbTab & "ADS_RIGHT_DS_DELETE_CHILD"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab S "ADS_RIGHT_DS_DELETE_CHILD for _
SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab & "Inherited ADS_RIGHT_DS_DELETE_CHILD _
for SchemalDGuid: " & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_ACTRL_DS_LIST) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Debug.Print vbTab & "ADS_RIGHT_ACTRL_DS_LIST"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_ACTRL_DS_LIST for _
SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab & "Inherited ADS_RIGHT_ACTRL_DS_LIST _ for SchemalDGuid: ” & ACE.InheritedObjectType
End If
End If -
End If
If (ACE.AccessMask And ADS_RIGHT_DS_SELF) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Debug.Print vbTab & "ADS_RIGHT_DS_SELF"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_DS_SELF for
SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab & "Inherited ADS_RIGHT_DS_SELF for _
SchemalDGuid: " & ACE.InheritedObjectType
^End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_READ_PROP) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Debug.Print vbTab & "ADS_RIGHT_DS_READ_PROP"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_DS_READ_PROP for _
SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab & "Inherited ADS_RIGHT_DS_READ_PROP _ for SchemalDGuid: " & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_WRITE_PROP) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Debug.Print vbTab & "ADS_RIGHT_DS_WRITE_PROP"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab & "ADS_RIGHT_DS_WRITE_PROP for _
SchemalDGuid: " & ACE.ObjectType
Else
Debug.Print vbTab & "Inherited ADS_RIGHT_DS_WRITE_PROP _ for SchemalDGuid: " & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_DELETE_TREE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Debug.Print vbTab S "ADS_RIGHT_DS_DELETE_TREE"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab S "ADS_RIGHT_DS_DELETE_TREE for _ SchemalDGuid: " s ACE.ObjectType
Else
Debug.Print vbTab s "Inherited ADS_RIGHT_DS_DELETE_TREE _ for SchemalDGuid: " s ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_LIST_OBJECT) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Debug.Print vbTab S "ADS_RIGHT_DS_LIST_OBJECT"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab S "ADS_RIGHT_DS_LIST_OBJECT for _ SchemalDGuid: " s ACE.ObjectType
Else
Debug.Print vbTab s "Inherited ADS_RIGHT_DS_LIST_OBJECT _ for SchemalDGuid: " s ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_CONTROL_ACCESS) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Debug.Print vbTab S "ADS_RIGHT_DS_CONTROL_ACCESS"
Else
If ACE.InheritedObjectType = "" Then
Debug.Print vbTab S "ADS_RIGHT_DS_CONTROL_ACCESS for _ SchemalDGuid: " s ACE.ObjectType
Else
Debug.Print vbTab S "Inherited ADS_RIGHT_DS_CONTROL_ACCESS for SchemalDGuid: " s ACE.InheritedObjectType
End If
End If
End If
Next
Добавление АСЕ к списку ACL Active Directory с помощью Visual Basic
Для добавления новой записи АСЕ к списку ACL дескриптора безопасности объекта воспользуйтесь следующим кодом (для установки верных значений флагов АСЕ обратитесь к приведенным выше таблицам):
Dim Obj As IADs
Dim SecurityDescriptor As lADsSecurityDescriptor
Dim ACE As AccessControlEntry
Dim DACL As AccessControlList
Set Obj = GetObject("LDAP://ou=Admins,dc=eCommerce2000,dc=com")
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject("AccessControlEntry")
АСЕ.AccessMask = ADS_RIGHT_DELETE Or ADS_RIGHT_GENERIC_READ _
Or ADS_RIGHT_GENERIC_WRITE
ACE.AceFlags = ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE
ACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED
ACE.Trustee = "eCommerce2000\DMZAdmin"
DACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor) Obj.Setinfo
Удаление АСЕ из списка ACL Active Directory с помощью Visual Basic
Для удаления всех записей АСЕ определенного владельца используйте код
Dim Obj As IADs
Dim ACE As AccessControlEntry
Dim DACL As AccessControlList
Dim SecurityDescriptor As lADsSecurityDescriptor
Set Obj = GetObject("LDAP://cn=Guest,ou=users, _ dc=eCommerce2000,dc=com")
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
For Each ACE In DACL
If UCase(ACE.Trustee) = "ECOMMERCE2000\GUEST" Then DACL.RemoveAce ACE
End If
Next
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor)
Obj.Setinfo
Совет
В приведенном фрагменте кода удаляется АСЕ на основе имени, но можно использовать условие для удаления на основе констант ObjectType или AccessMask.
Дополнительные возможности управления безопасностью Active Directory
Самой существенной возможностью Active Directory является создание ACL для дескрипторов безопасности на уровне атрибута и делегирование административных привилегий объектам в каталоге.
Ключевой элемент процесса создания модели делегирования для Active Directory — наследование. Подобно распространению ACL для всех элементов файловой структуры в файловой системе, Active Directory позволяет определять разрешения для родительских объектов, а затем наследовать их дочерними объектами.
Устанавливая константу ads_aceflag_inherit_ace полю AceFlag в АСЕ, можно разрешить или запретить наследование дочерними объектами разрешений, установленных родительскому объекту.
Для того чтобы установить модель делегирования, можно назначить доверенным лицам возможность создавать и удалять дочерние объекты или даже определенные типы объектов. Для эффективного выполнения такой задачи обычно назначают разрешения контейнеру (например, ои), чтобы впоследствии иметь возможность управлять дочерними элементами каталога.
Помните, что Active Directory Windows 2000 позволяет устанавливать разрешения на уровне атрибутов и вы даже можете указывать определенные атрибуты объекта, которыми можно управлять.
Добавление АСЕ к списку ACL контейнера OU Active Directory с наследованием всех дочерних объектов с помощью Visual Basic
Установив соответствующее значение поля AceFlag, можно позволить дочерним объектам наследовать разрешения, установленные для родительских объектов в каталоге. Для этого воспользуйтесь следующим кодом
Dim Obj As IADs
Dim SecurityDescriptor As lADsSecurityDescriptor
Dim ACE As AccessControlEntry
Dim DACL As AccessControlList
Set Obj = GetObject("LDAP://ou=Admins,dc=eCommerce2000,dc=com")
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject("AccessControlEntry")
ACE.AccessMask = ADS_RIGHT_GENERIC_READ
ACE.AceFlags = ADS_ACEFLAG_INHERIT_ACE
ACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED
ACE. Trustee = "eCorrcr.erce2000\DMZAdinin"
DACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor)
Obj.Setinfo
Добавление АСЕ к списку ACL контейнера ou Active Directory с наследованием отдельного класса дочерних объектов с помощью Visual Basic
Чтобы разрешить пользователю управлять частью классов объекта, можно определить соответствующий класс объекта в АСЕ списка АСЕ дескриптора безопасности для контейнера ои.
Например, если пользователю необходимо создавать и удалять объекты, принадлежащие только классу объектов Group, установите запись контроля доступа на основе определения класса объекта. В этом сценарии выбранный пользователь может создавать и удалять только группы в контейнере ои, а не другие объекты.
Устанавливая значение schema! DGuid желаемого класса объекта полю ObjectType в АСЕ и флаг ads_flag_object_type_present нолю Flags в АСЕ, можно определить необходимый класса объекта.
Параметр schemalDGuid определяется в схеме контейнера каталога; однако для использования GUID в поле objectType строка должна создаваться в виде {хххххххх-хххх-хххх-хххх-хххххххххххх}.■
После получения и форматирования соответствующего GU1D класса объекта (обычно ЭТО ВЫПОЛНЯеТСЯ В комбинации С ВЫЗОВОМ API StringFromGUID2) можно ис-
пользовать следующий код Visual Basic для создания приложения, ограниченного только одним классом объекта:
Dim Obj As IADs
Dim SecurityDescriptor As lADsSecurityDescriptor
Dim ACE As AccessControlEntry
Dim DACL As AccessControlList
Set Obj = GetObject("LDAP://ou=Admins,dc=eCommerce2000,dc=com")
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject("AccessControlEntry")
ACE.AccessMask = ADS_RIGHT_DS_DELETE_TREE
ACE.AceFlags = ADS_ACEFLAG_INHERIT_ACE
ACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
ACE.Flags = ADS_FLAG_OBJECT_TYPE_PRESENT
ACE.ObjectType = "{BF967A9C-0DE6-11D0-A285-00AA003049E2}"
ACE. Trustee = "eCommerce2000\DMZAdmir."
DACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor).
Obj.Setinfo
Примечание
Значение GUID в фрагменте кода приведено для группы объектов. Старайтесь не использовать в своих приложениях '‘жесткого ” кодирования GUID.
Удаление АСЕ из списка ACL контейнера ои Active Directory с наследованием отдельного класса дочерних объектов с помощью Visual Basic
Для удаления АСЕ, который назначен для ограничения управления объектом определенного класса, просто используйте проверку соответствия полей obj ectType и Trustee в процессе перечисления, как показано в приведенном ниже фрагменте кода.
Dim Obj As IADs
Dim ACE As AccessControlEntry
Dim DACL As AccessControlList
Dim SecurityDescriptor As Variant
Set Obj = GetObject("LDAP://ou=Admins, dc=eCommerce2000,dc=com")
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
For Each ACE In DACL
If ((UCase(ACE.Trustee) = "ECOMMERCE2000\DMZADMIN") and _
(ACE.ObjectType = "{BF967A9C-0DE6-11D0-A285-00AA003049E2}")) Then DACL.RemoveAce ACE
End If
Next
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor) Obj.Setinfo
Добавление АСЕ к списку ACL контейнера ои Active Directory с наследованием отдельного свойства класса объектов с помощью Visual Basic
Аналогично процессу ограничения манипулирования объектами на основе класса объекта, можно также определить, с помощью каких атрибутов пользователю предоставляются права считывания и модификации. Для этого необходимо присвоить значение schemalDGuid нужного свойства полю ObjectType и флаг ads_right_ds_read_ PROP ИЛИ ADS_RIGHT_DS_WRITE_PROP ПОЛЮ AccessMask.
В приведенном ниже фрагменте кода пользователю разрешается записывать его собственный атрибут telephoneNumber в контейнер Users.
Dim Obj As IADs
Dim SecurityDescriptor As lADsSecurityDescriptor
Dim ACE As AccessControlEntry
Dim DACL As AccessControlList
Set Obj = GetObject(«LDAP://ou=Admins,dc=eCommerce2000,dc=com»)
Set SecurityDescriptor = Obj.Get(«ntSecurityDescriptor»)
Set DACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject(«AccessControlEntry»)
ACE.AccessMask = ADS_RIGHT_DS_READ_PROP Or ADS_RIGHT_DS_WRITE_PROP
ACE.AceFlags = ADS_ACEFLAG_INHERIT_ACE
ACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
ACE.ObjectType = «{BF967A49-0DE6-11D0-A285-00AA003049E2}»
ACE.Trustee = «NT AUTHORITY\SELF»
DACL.AddAce ACE-
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put «ntSecurityDescriptor», Array(SecurityDescriptor)
Obj.Setinfo
Создание модуля класса
ADObj ectManagement
В этом разделе приводится пример создания приложения СОМ-сервера
ADAdmin.DLL.
Совет
Код этого проекта, а также скомпилированную его версию можно найти по адресу: http://www.williamspublishing.сот.
Упражнение 12.1. Создание ADAdmin.DLL: управление Active Directory
Откройте новый проект Visual Basic ActiveX DLL.
Установите ссылку на библиотеку Active DS Type Library, воспользовавшись диалоговым окном References, доступ к которому осуществляется с помощью команды Project1* References.
Переименуйте новый проект в ADAdmin.
Переименуйте модуль класса в ADObjectManagement.
Введите следующий код в раздел общих объявлений модуля класса:
Public Function RootDSEntries(ByVai PropertyName As String) _ As Variant
On Error Resume Next
Dim RootDSE As IADs
Dim Retval As Variant
Dim RetArray () As Variant
Dim i As Long
Set RootDSE = GetObject("LDAP://RootDSE")
RetVal = RootDSE.Get(PropertyName)
If IsArray(Retval) Then
For Each Item In Retval
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = PropertyName s ":" s Item
Next
RootDSEntries = RetArray
Else
RootDSEntries = PropertyName s ":" s RootDSE.Get(PropertyName) End If
End Function
Public Function EnumerateContainer(Byval Objectclass As String, _
ByVai RelativePathToObject As String) As Variant
On Error Resume Next
Dim RootDSE As IADs
Dim UserContainer As lADsContainer
Dim User As IADs
Dim RetArrayf) As Variant
Dim i As Long
Dim Obj As Variant
Set RootDSE = GetObject("LDAP://RootDSE")
Set UserContainer = GetObject("LDAP://" & RelativePathToObject _
S RootDSE.Get("DefaultNamingContext"))
UserContainer.Filter = Array(Objectclass)
For Each Obj In UserContainer
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = Obj.Name
Next
EnumerateContainer = RetArray
End Function
Public Function RemoveADObject(ByVai RelativePathToObject As _ String, ByVai Objectclass As String, ByVai ObjectRelativeName _ As String) As Boolean
Dim RootDSE As IADs
Dim Container As lADsContainer
Set RootDSE = GetObject("LDAP://RootDSE")
Set Container = GetObject("LDAP://" S RelativePathToObject _
S RootDSE.Get("DefaultNamingContext"))
Call Container.Delete(Objectclass, ObjectRelativeName)
If Err.Number = 0 Then RemoveADObject = True
End Function
Public Function MoveRenameADObject(ByVai RelativePathToNewLocation
As String, Byval OriginalObjectRelativePath As String, Optional _ Byval NewObjectName As String) As Boolean
Dim RootDSE As IADs
Dim Container As lADsContainer
Set RootDSE = GetObject("LDAP://RootDSE")
Set Container = GetObject("LDAP://" S RelativePathToNewLocation _
RootDSE.Get("DefaultNamingContext"))
If NewObjectName = "" Then NewObjectName = vbNullString
Call Container.MoveHere(OriginalObjectRelativePath, NewObjectName) If Err.Number = 0 Then MoveRenameADObject = True
End Function
Public Function RemoveADACE(ByVai RelativeObjectPath As String, _ ByVai TrusteeToRemove As String) As Boolean
Dim Obj As IADs
Dim ACE As AccessControlEntry
Dim DACL As AccessControlList
Dim SecurityDescriptor As Variant
Dim RootDSE As IADs
Set RootDSE = GetObject("LDAP://RootDSE")
Set Obj = GetObject("LDAP://" & RelativeObjectPath _
RootDSE.Get("DefaultNamingContext"))
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
For Each ACE In DACL
If Ucase(ACE.Trustee) = Ucase(TrusteeToRemove) Then
DACL.RemoveAce ACE
End If
Next
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor)
Obj.Setinfo
If Err.Number = 0 Then-RemoveADACE = True
End Function
Public Function EnumerateAclAces(ByVai RelativeObjectPath _
As String) As Variant
On Error Resume Next
Dim Obj As I-ADs
Dim RootDSE As IADs
Dim ACE As AccessControlEntry
Dim DiscretionaryACL As AccessControlList
Dim SecurityDescriptor As Variant
Dim ObjectDistinguishedName As String
Dim RetArrayt) As Variant
Dim i As Long
Set RootDSE = GetObject("LDAP://RootDSE")
Set Obj = GetObject("LDAP://" & RelativeObjectPath _
RootDSE.Get("DefaultNamingContext"))
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL i = 1
For Each ACE In DiscretionaryACL
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = ACE.Trustee
If (ACE.AccessMask And ADS_RIGHT DELETE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = ”") Then i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DELETE"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArrayti) = vbTab & "ADS_RIGHT_DELETE for _ SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited ADS_RIGHT_DELETE _ for SchemalDGuid:" & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_READ_CONTROL) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = ”") Then i = Ubound(RetArray) + 1■
ReDim Preserve RetArray(i).
RetArray(i) = vbTab & "ADS_RIGHT_READ_CONTROL"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_READ_CONTROL _ for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1 ’ ReDim Preserve RetArray(i) RetArray(i) = vbTab & "Inherited ADS_RIGHT_READ_CONTROL _ for SchemalDGuid:" & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_WRITE_DAC) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_WRITE_DAC"
Else
If ACE.InheritedObjectType = "" Then i = Ubound(RetArray) + 1 . ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_WRITE_DAC for _ SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited ADS_RIGHT_WRITE_DAC _ for SchemalDGuid:" & ACE.InheritedObjectType
End If
End If-
End If
If (ACE.AccessMask And ADS_RIGHT_WRITE_OWNER) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_WRITE_OWNER"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_WRITE_OWNER for _ SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited ADS_RIGHT_WRITE_OWNER _
for SchemalDGuid:" & ACE.InheritedObjectType End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_SYNCHRONIZE) <> 0 Then
If (ACE.ObjectType = ”" And ACE.InheritedObjectType = "") Then i = Ubound(RetArray) + 1 ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_SYNCHRONIZE"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_SYNCHRONIZE for _ SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited ADS_RIGHT_SYNCHRONIZE _ for SchemalDGuid:" & ACE.InheritedObjectType
End If
End If
End If'
If (ACE.AccessMask And ADS_RIGHT_ACCESS_SYSTEM_SECURITY) _
<> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_ACCESS_SYSTEM_SECURITY"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_ACCESS_SYSTEM_SECURITY _ for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited _
ADS_RIGHT_ACCESS_SYSTEM_SECURITY for SchemalDGuid:" _
& ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_GENERIC_READ) <> 0 Then
If (ACE.ObjectType = ”" And ACE.InheritedObjectType = ”") Then i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_GENERIC_READ"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_GENERIC_READ _
for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited ADS_RIGHT_GENERIC_READ _ for SchemalDGuid:" & ACE.InheritedObjectType
End If
End If
End If.
If (ACE.AccessMask And ADS_RIGHT_GENERIC_WRITE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then i = Ubound(RetArray) + 1 ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_GENERIC_WRITE"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_GENERIC_WRITE _ for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited ADS_RIGHT_GENERIC_WRITE _ for SchemalDGuid:" & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_GENERIC_EXECUTE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then i = Ubound(RetArray) + 1 ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_GENERIC_EXECUTE"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_GENERIC_EXECUTE _ for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited _ ADS_RIGHT_GENERIC_EXECUTE for SchemalDGuid:" _ & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_GENERIC_ALL) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_GENERIC_ALL"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_GENERIC_ALL _
for SchemalDGuid:" & ACE.ObjectType
Else'
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited ADS_RIGHT_GENERIC_ALL _ for SchemalDGuid:" & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_CREATE_CHILD) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_CREATE_CHILD"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_CREATE_CHILD _
for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited _ ADS_RIGHT_DS_CREATE_CHILD for SchemalDGuid:" & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_DELETE_CHILD) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_DELETE_CHILD"
Else
If ACE.InheritedObjectType = ”" Then
i = Ubound(RetArray) + 1
ReDim Preserve ’RetArray(i)
RetArray(i) = vbTab & ”ADS_RIGHT_DS_DELETE_CHILD _
for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited _
ADS_RIGHT_DS_DELETE_CHILD for SchemalDGuid:" _
ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_ACTRL_DS_LIST) о 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_ACTRL_DS_LIST"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_ACTRL_DS_LIST
for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited _
ADS_RIGHT_ACTRL_DS_LIST for SchemalDGuid:" _
ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_SELF) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_SELF"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_SELF _ for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited ADS_RIGHT_DS_SELF _ for SchemalDGuid:" & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_READ_PROP) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then i = Ubound(RetArray) + 1 ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_READ_PROP"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_READ_PROP for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited _
ADS_RIGHT_DS_READ_PROP for SchemalDGuid:" _
ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_WRITE_PROP) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then i = Ubound(RetArray) + 1 ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_WRITE_PROP"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_WR1TE_PROP _
for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited _ ADS_RIGHT_DS_WRITE_PROP for SchemalDGuid:" & ACE.InheritedObjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_DELETE_TREE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & ”ADS_RIGHT_DS_DELETE_TREE"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_DELETE_TREE for SchemalDGuid:" & ACE.ObjectType
Else
= Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited _ ADS_RIGHT_DS_DELETE_TREE for SchemalDGuid:" _ & ACE.InheritedobjectType
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_LIST_OBJECT) <> 0 Then
If (ACE.ObjectType = "" And ACE. InheritedobjectType = "") Then.
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIsHT_DS_LIST_OBJECT"
Else
If ACE.InheritedobjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_LIST_OBJECT for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited _ ADS_RIGHT_DS_LIST_OBJECT for SchemalDGuid:" & ACE.InheritedobjectType
End If ■
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_CONTROL_ACCESS) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_CONTROL_ACCESS"
Else
If ACE.InheritedObjectType = "" Then
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "ADS_RIGHT_DS_CONTROL_ACCESS for SchemalDGuid:" & ACE.ObjectType
Else
i = Ubound(RetArray) + 1
ReDim Preserve RetArray(i)
RetArray(i) = vbTab & "Inherited _ ADS_RIGHT_DS_CONTROL_ACCESS for SchemalDGuid:" & ACE.InheritedObjectType
End If
End If
End If
Next
EnumerateAclAces = RetArray
End Function
Public Function CreateGenericADObject(ByVai RelativePathToObject _
Аз String, ByVai Objectclass As String, ByVai ObjectRelativeName _ As String, Optional ByVai MandatoryPropertyName As String, _ Optional ByVai MandatoryPropertyValue As Variant, Optional ByVai _ MandatoryPropertyName2 As String, Optional ByVai _ MandatoryPropertyValue2 As Variant, Optional ByVai _ MandatoryPropertyNameS As String, Optional ByVai _ MandatoryPropertyValue3 As Variant, Optional ByVai _ MandatoryPropertyName4 As String, Optional ByVai _ MandatoryPropertyValue4 As Variant, Optional ByVai _ MandatoryPropertyName5 As String, Optional ByVai _ MandatoryPropertyValue5 As Variant, Optional ByVai _ MandatoryPropertyName6 As String, Optional ByVai _ MandatoryPropertyValue6 As Variant, Optional ByVai _ MandatoryPropertyName? As String, Optional ByVai _ MandatoryPropertyValue? As Variant, Optional ByVai _ MandatoryPropertyName8 As String, Optional ByVai _ MandatoryPropertyValue8 As Variant) As Boolean
Dim RootDSE As IADs
Dim Container As TADsContainer
Set RootDSE = GetObject("LDAP://RootDSE")
Set Container - GetObject("LDAP://" & RelativePathToObject _
& RootDSE.Get("DefaultNamingContext"))
Set NewObject = Container.Create(Objectclass, ObjectRelativeName) If MandatoryPropertyName <> "" Then
Call NewObject.Put(MandatoryPropertyName, _ MandatoryPropertyValue) End If
If MandatoryPropertyName2 <> "" Then
Call NewObject.Put(MandatoryPropertyName2, _ MandatoryPropertyValue2)
End If
If MandatoryPropertyName3 <> "" Then
Call NewObject.Put(MandatoryPropertyName3, _ MandatoryPropertyValue3)
End If
If MandatoryPropertyName4 <> "" Then
Call NewObject.Put(MandatoryPropertyName4, _ MandatoryPropertyValue4) End If
If MandatoryPropertyNameS <> "" Then
Call NewObject.Put(MandatoryPropertyNameS, _ MandatoryPropertyValue5)
End If
If MandatoryPropertyName6 <> "" Then
Call NewObject.Put(MandatoryPropertyName6, _ MandatoryPropertyValue6)
End If
If MandatoryPropertyName? <> "" Then
Call NewObject.Put(MandatoryPropertyName?, _ MandatoryPropertyValue?)
End If
If MandatoryPropertyNameS <> "" Then
Call NewObject.Put(MandatoryPropertyNameS, _ MandatoryPropertyValue8) End If
NewObject.Setinfo
If Err.Number = 0 Then CreateADObject = True End Function
Public Function SetOptionalProperty(ObjectRelativeName As _ String, OptionalPropertyName As String, OptionalPropertyValue _
As Variant) As Boolean Dim RootDSE As IADs Dim Obj As IADs Set RootDSE = GetObject("LDAP://RootDSE") Set Obj = GetObject("LDAP://" & ObjectRelatlveName _ & RootDSE.Get("DefaultNamingContext")) Call Obj.Put(OptionalPropertyName, OptionalPropertyValue) Obj.Setinfo
If Err.Number = 0 Then SetOptionalProperty = True End Function
Public Function ADSObjectSecurity(ByVai RelativeObjectPath As _ String, ByVai TrusteeName As String, ByVai AllowAccess As Boolean, ByVai InheritenceType As String, Optional ByVai SchemalDGuid __ As String = "ALL", Optional ByVai Generic_All As Boolean, _ Optional ByVai Generic_Read As Boolean, Optional ByVai _ Generic_Write As Boolean, Optional ByVai DS_Create_Child _ As Boolean, Optional ByVai DS_Delete_Child As Boolean, _ Optional ByVai Delete As Boolean, Optional ByVai Read_Control _ As Boolean, Optional ByVai Write_DAC As Boolean, Optional _ ByVai Write_Owner As Boolean, Optional ByVai Synchronize As _ Boolean, Optional ByVai Access_System_Security As Boolean, _ Optional ByVai Actrl_DS_List As Boolean, Optional ByVai _ DS_Self As Boolean, Optional ByVai DS_Read_Prop As Boolean, _ Optional ByVai DS_Write_Prop As Boolean, Optional ByVai _ DS_Delete_Tree As Boolean, Optional ByVai DS_List_Object _ As Boolean, Optional ByVai DS_Control_Access As Boolean) _ As Boolean
Dim Obj As IADs
Dim SecurityDescriptor As Variant
Dim ACE As AccessControlEntry Dim DACL As AccessControlList Dim RootDSE As IADs
Dim AccessMask As Long
Set RootDSE = GetObject("LDAP://RootDSE")
Set Obj = GetObject("LDAP://" & RelativeObjectPath _ & RootDSE.Get("DefaultNamingContext"))
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject("AccessControlEntry") If FullControl = True Then
AccessMask = -1
End If
If Delete = True Then
AccessMask = AccessMask Or ADS_RIGHT_DELETE End If
If Read_Control = True Then
AccessMask = AccessMask Or ADS_RIGHT_READ_CONTROL End If
If Write_DAC = True Then'
AccessMask = AccessMask Or ADS_RIGHT_WRITE_DAC End If
If Write_Owner = True Then
AccessMask = AccessMask Or ADS_RIGHT_WRITE_OWNER End If
If Synchronize = True Then
AccessMask = AccessMask Or ADS_RIGHT_SYNCHRONIZE End If
If Access_System_Security = True Then
AccessMask = AccessMask Or ADS_RIGHT_ACCESS_SYSTEM_SECURITY End If
If Generic_Read = True Then
AccessMask = AccessMask Or ADS_RIGHT_GENERIC_READ
End If
If Generic_Write = True Then
AccessMask = AccessMask Or ADS_RIGHT_GENERIC_WRITE
End If
If Generic_All = True Then
AccessMask = AccessMask Or ADS_RIGHT_GENERIC_ALL
End If
If DS_Create_Child = True Then
AccessMask = AccessMask Or ADS_RIGHT_DS_CREATE_CHILD End If
If DS_Delete_Child = True Then
AccessMask = AccessMask Or ADS_RIGHT_DS_DELETE_CHILD End If
If Actrl_DS_List = True Then
AccessMask = AccessMask Or ADS_RIGHT_ACTRL_DS_LIST
End If
If DS_Self = True Then
AccessMask = AccessMask Or ADS_RIGHT_DS_SELF
End If
If DS_Read_Prop = True Then
AccessMask = AccessMask Or ADS_RIGHT_DS_READ_PROP
End If
If DS_Write_Prop = True Then
AccessMask = AccessMask Or ADS_RIGHT_DS_WRITE_PROP
End If
If DS_Delete_Tree = True Then
AccessMask = AccessMask Or ADS_RIGHT_DS_DELETE_TREE End If
If DS_List_Object = True Then
AccessMask = AccessMask Or ADS_RIGHT_DS_LIST_OBJECT End If
If DS_Control_Access = True Then
AccessMask = AccessMask Or ADS_RIGHT_DS_CONTROL_ACCESS End If
ACE.AccessMask = AccessMask
Select Case Ucase(InheritenceType)
Case "NONE"
Case "INHERIT"
ACE.AceFlags = ADS_ACEFLAG_INHERIT_ACE
Case "INHERIT_ONLY"
ACE.AceFlags = ADS_ACEFLAG_INHERIT_ONLY_ACE
Case "NO_PROPAGATE"
ACE.AceFlags = ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE End Select
If AllowAccess = True Then
If Ucase(SchemalDGuid) = "ALL" Then
ACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED
Else
ACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
ACE.ObjectType = SchemalDGuid
ACE.Flags = ADS_FLAG_OBJECT_TYPE_PRESENT
End If
Else
If Ucase(SchemalDGuid) = "ALL" Then
ACE.AceType = ADS_ACETYPE_ACCESS_DENIED
Else
ACE.AceType = ADS_ACETYPE_ACCESS_DENIED_OBJECT
ACE.ObjectType = SchemalDGuid
ACE.Flags = ADS_FLAG_OBJECT_TYPE_PRESENT
End If
End If
ACE.Trustee = Ucase(TrusteeName)
DACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor)
Obj.Setinfo
If Err.Number = 0 Then ADSObjectSecurity = True
End Function
Скомпилируйте код в виде ADAdmin.DLL.
Сохраните и закройте проект ADAdmin.
Использование функций модуля ADObj ectManagement
После создания модуля класса ADObj ectManagement можно использовать его функции практически из любого языка программирования, который поддерживает автоматизацию OLE, например Visual Basic, VBScript или JavaScript.
Совет
Создание экземпляра объекта и необходимый синтаксис приведены в главе 3, “Методы перечисления контейнера и программное управление политикой учетных записей домена”. Не забудьте изменить имя DLL на ADAdmin и имя класса на ADObjectManagement, где это необходимо.
табл. 12.6 приведен синтаксис каждого метода интерфейса ADObj ectManagement.
Таблица 12.6. Синтаксис методов интерфейса ADObjectManagement
ДействиеСинтаксис
Просмотр свойств RootDSE Debug. Print RootDSEntries ("CurrentTime")
Debug.Print RootDSEntries("SubSchemaSubEntry")
Debug.Print RootDSEntries("DsServiceName")
For Each Element In RootDSEntries( "NamingContexts")
Debug.Print Element
Next
Debug.Print RootDSEntries("DefaultNamingContext")
Debug.Print RootDSEntries("SchemaNamingContext")
Debug.Print RootDSEntries ( "ConfigurationNamingContext")
Debug.Print RootDSEntries("RootDomainNamingContext")
For Each Element In RootDSEntries ( "SupportedControl")
Debug.Print Element
Next
For Each Element In RootDSEntries ("SupportedLDAPVersion")
Debug.Print Element
Next
Действие
Синтаксис
Debug. Print RootDSEntries ("HighestCommittedCJSN")
For Each. Element In RootDSEn
tries ("SupportedSASLMechanisms")
Debug.Print Element
Next
Debug.Print RootDSEntries("DnsHostName")
Debug.Print RootDSEntries("LdapServiceName")
Debug.Print RootDSEntries("ServerName")
Перечисление элементов контейнера
For Each Element In EnumerateContainer("user", "CN=Users,")
Debug.Print Element
Next
Удаление объекта Active Directory
Удаление ветви Active Directory
Перемещение объекта Active Directory
Debug.Print RemoveADOb-.
ject("cn=Users,","user","cn=IWAM_SERVERNAME")
Debug.Print DeleteADBranch("ou=Printer_Queues,")
Debug.Print
MoveRenameADObject("ou=DelegatedAdmins,", "LDAP://cn=Adminl,cn=Users,dc=crash,dc=burn")
Переименование объекта Active Directory
Debug.Print
MoveRenameADObject("ou=DelegatedAdmins,",•
"LDAP://cn=Adminl,cn=users,dc=crash,dc=burn", "cn=DMZAdmin")"
Удаление АСЕ Active Directory
Debug.Print RemoveAD-
ACE("cn=Junkobject,ou=DelegatedAdmins,", "Crash\Guest")
Перечисление АСЕ в ACL Active Directory
Создание объекта Active Directory
Заполнение атрибутов объекта Active Directory
For Each ACE In EnumerateAclAces("cn=Users,") Debug. Print ACENext
Debug.Print CreateADObject("ou=TestOU,", "user", "cn=TestUsrl", "sAMAccountName", "testUsrl")
Debug.Print
SetOptionalProperty("cn=TEck,ou=Users,", "sn", "Eck")
Установка полного доступа для объекта Active Directory
Разрешение доверителю создавать пользовательские объекты в контейнере
Debug.Print ADSObjectSecurity("ou=Users,", "Crash\OUAdmin", False, "Inherit", "all", True)
Debug.Print ADSObjectSecurity("ou=Users,", "Crash\UserAdmin", True, "Inherit", "{BF967ABA- 0DE6-11D0-A285-00AA003049E2}", False, False, False, True, True)
Резюме
С помощью провайдера ADSI LDAP можно программно управлять объектами Active Directory, атрибутами и дескрипторами безопасности в Windows 2000.
При создании строки связывания, используйте корневую запись RootDSE, которая позволяет определять контекст имен по умолчанию для текущей пользователь-
ской сессии. Такую операцию можно выполнять, даже не имея административных полномочий.
С помощью интерфейса TADsOpenDSObjpct можно связывать Active Directory с альтернативными полномочиями и определять используемый тип аутентификации. Это позволяет управлять доменами в других лесах или временно передавать привилегии другому пользователю.
Для увеличения производительности в среде больших компаний Windows 2000- поддерживает частичную репликацию данных в общий каталог. Связывая общий каталог, можно выполнять поиск в лесу и описывать данные напрямую из общего каталога. Если разыскиваемого атрибута нет в общем каталоге, можно также описать оригинальное расположение реплицируемого объекта, используемого каталогом.
Изменяя класс объекта в коде общего создания объекта, в каталоге можно создавать записи любого типа. При этом следует назначить все необходимые атрибуты перед записью объекта в каталог. Класс объекта также позволяет использовать свойство Filter интерфейса TADsContainer для возврата определенного поднабора объектов, разыскиваемых в каталоге.
С помощью интерфейса TADsDeleteOps можно “подрезать" целые ветви структуры каталога. Если вы предпочитаете не удалять объект, а перемещать его в новое положение, можете использовать метод MoveHere интерфейса TADsContainer для перемещения или переименования объекта в каталоге.
И наконец, ADSI позволяет управлять дескриптором безопасности для объектов в Active Directory, устанавливая безопасность отдельного объекта или АСЕ для всех дочерних объектов. Модифицируя дескриптор безопасности контейнера OU и позволяя объектам с определенными значениями параметра schemalDGuid наследовать родительскую запись АСЕ, можно реализовать модель делегирования, которая перемещает администрирование на уровень атрибута.
Комбинируя провайдеры WinNT:, IIS: и LDAP:, можно программно управлять практически каждым элементом пространства имен в естественном или смешанном режиме домена Windows 2000.
Неважно, пытаетесь ли вы децентрализовать администрирование, внедрить специальные стандарты или просто облегчаете себе работу, программное управление Active Directory и соответствующих пространств имен освободит вас от ежедневного выполнения рутинных задач.
Часть V
Приложения
X. Справочник по коду VBScript
Б. Справочник по программированию ADSI 2.5
В. Дополнительные источники информации
Справочник по коду VBScript
В некоторых случаях использовать распределенные приложения на основе модели СОМ невозможно. В этом приложении фрагменты кода Visual Basic преобразованы в код VBScript, который можно выполнять в среде Internet Information Server Active Server Page.
Электронную версию этого приложения можно найти по адресу: http://www.williamspublishing.com.
Глава 3. Код VBScript Active Server Page для управления контейнером
Перечисление доменов
Dim NameSpace
Dim Domain
Set NameSpace = GetObject("WinNT:")
For Each Domain in Namespace
Response.Write Domain.Name & "<BR>"
Next
Просмотр значения свойства AutoUnlocklntreval
Dim Domain
Dim DomainName
DomainName = "Domain_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)
Response.Write Domain.AutoUnlockinterval'
Установка нового значения свойства
AutoUnlocklntreval
Dim Domain
Dim DomainName
Dim NewValue
DomainName = "Domain_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)
NewValue = 3600
Domain.AutoUnlockinterval = NewValue
Domain.Setinfo
Response.Write Err.Number
Просмотр значения свойства Lockoutobservationinterval
Dim Domain
Dim DomainName
DomainName = "Domain_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName) Response.Write Domain.LockoutObservationinterval
Установка нового значения свойства
Lockoutobservationinterval
Dim Domain .
Dim DomainName
Dim NewValue
DomainName = "Domain_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)
NewValue = 1800
Domain.Lockoutobservationinterval = NewValue
Domain. Setlr.fo
Просмотр значения свойства MaxBadPasswordsAllowed
Dim Domain
Dim DomainName
DomainName = "Domain_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)
Response.Write Domain.MaxBadPasswordsAllowed
Установка нового значения свойства MaxBadPasswordsAllowed
Dim Domain
Dim DomainName
Dim NewValue
DomainName = "Domain_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)
NewValue = 5
Domain.MaxBadPasswordsAllowed = NewValue
Domain.Setinfo
Просмотр значения свойства MaxPasswordAge
Dim Domain
Dim DomainName
DomainName = "Domain_To_Manage" Set Domain = GetObject("WinNT://" & DomainName)
Response.Write ((Domain.MaxPasswordAge) / 86400)
Установка нового значения свойства MaxPasswordAge
Dim Domain
Dim DomainName
Dim NewValue
Свойство
IIsFTPServerIIsFTPVirtualDir
AnonymousPasswordSync
AnonymousUserName AnonymousUserPass ConnectionTimeout
+-
+-
+-
DefaultLogonDomain
+-
DontLog ExitMessage GreetingMessage IPSecurity
++
+-
+-
++
LogAnonymous
LogExtFileBytesRecv
LogExtFileBytesSent LogExtFileClientlp
LogExtFileComputerName
LogExtFileCookie
LogExtFileDate
LogExtFileFlags
LogExtFileHttpStatus
LogExtFi1eMethod
LogExtFileProtocolVersion
LogExtFileReferer
LogExtFileServerIp
LogExtFileServerPort
LogExtFileSiteName
LogExtFileTime
LogExtFileTimeTaken
LogExtFileUriQuery
LogExtFileUriStem
LogExtFileUserAgent
LogExtFileUserName
LogExtFileWin32Status LogFileDirectory LogFilePeriod
LogFileTruncateSize
+ - + - + - + - + - + - + - + - + - + - + - + - + - + - + -
+ - + - + - + - + -
+ - + - + - + - + —
LogNonAnonymous LogOdbcDataSource LogOdbcPassword LogOdbcTableName LogOdbcUserName
+-
+-
+-
+-
+-
296
Часть III. Исследование провайдеров ADSI: IIS
Установка нового значения свойства
PasswordHistoryLength
Dim Domain
Dim DomainName
Dim NewValue
DomainName = "Domain_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName) NewValue = 3
Domain.PasswordHistoryLength = NewValue
Domain.Setinfo
Перечисление общего контейнера
Dim Container
Dim ContainerName
Dim LeafObject
ContainerName = "Container_Name"
Set Container = GetObject("WinNT://" & ContainerName)
For Each Leafobject in Container
Response.Write Leafobject.Name & "<BR>" Next
Перечисление учетных записей пользователей
Dim Container
Dim ContainerName
Dim User
ContainerName = "Domain_To_Manage"
Set Container = GetObject("WinNT://" & ContainerName) Container.Filter = Array("User") For Each User in Container
Response.Write User.Name & "<BR>" Next
Перечисление учетных записей компьютеров
Dim Container
Dim ContainerName
Dim Computer
ContainerName = "Domain_To_Manage"
Set Container = GetObject("WinNT://" & ContainerName) Container.Filter = Array("Computer")
For Each Computer in Container
Response.Write Computer.Name & "<BR>"
Next
Перечисление групп
Dim Container
Dim ContainerName
Dim Group
ContainerName = "Domain_To_Manage"
Set Container = GetObject("WinNT://" & ContainerName) Container.Filter = Array("Group")
For Each Group in Container
Response.Write Group.Name & "<BR>"
Next
Добавление новой учетной записи компьютера
Dim Container
Dim ContainerName
Dim ComputerAccount
Dim Computer
Dim NewComputer
ContainerName = "Domain_To_Manage"
Set Container = GetObject("WinNT://" S ContainerName)
NewComputer = "Computer_Account_To_Create"
Set Computer = Container.Create("Computer", UCase(NewComputer))
Computer.Set Info
Set ComputerAccount = GetObject("WinNT://" & ContainerName & "/" & NewComputer s "$,user")
ComputerAccount.Put "UserFlags", (ComputerAccount.Get("UserFlags") Or &H1000)
ComputerAccount.SetPassword (LCase(NewComputer))
ComputerAccount.SetInfo
Удаление учетной записи компьютера
Dim Container
Dim ContainerName
Dim ComputerToRemove
ContainerName = "Domain_To_Manage"
Set Container = GetObject("WinNT://" & ContainerName)
ComputerToRemove = "Computer_To_Remove"
Call Container.Delete("Computer", ComputerToRemove)
Добавление новой учетной записи пользователя
Dim Container
Dim ContainerName
Dim User
Dim NewUser
ContainerName = "Domain_To_Manage"
NewUser = "User_Account_To_Create”
Set Container = GetObject("WinNT:// " & ContainerName)
Set User = Container.Create("User", NewUser)
User.Setinfo
Удаление учетной записи пользователя
Dim Container
Dim ContainerName
Dim UserToRemove •
ContainerName = "Domain_To_Manage"
UserToRemove = "User_Account_To_Remove"
Set Container = GetObject("WinNT://" & ContainerName)
Call Container.Delete("User", UserToRemove)
Переименование учетной записи пользователя
Dim Container
Dim ContainerName
Dim OldName
Dim User
Dim NewUser
Dim NewName
OldName = "Old Account Name"
NewName = "New_Account_Name"
ContainerName = "Domain_To_Manage"
Set Container = GetObject("WinNT://" S ContainerName)
Set User = GetObject("WinNT://" & ContainerName S "/" S OldName & ",user")
Set NewUser = Container.MoveHere(User.ADsPath, NewName)
Set User = Nothing
Добавление новой локальной группы
Dim Container
Dim ContainerName
Dim Group
Dim NewGroup
ContainerName = "Domain_To_Manage"
NewGroup = "Requested_Groupname"
Set Container = GetObject("WinNT:// " & ContainerName)
Set Group = Container.Create("Group", NewGroup)
Group.Put "groupType”, ADS_GROUP_TYPE_LOCAL_GROUP
Group.Setlnfo
Добавление новой глобальной группы
Dim Container
Dim ContainerName
Dim Group
Dim NewGroup
ContainerName = "Domain_To_Manage"
NewGroup = "Requested_Groupname".
Set Container = GetObject("WinNT://" & ContainerName)
Set Group = Container.Create("Group", NewGroup)
Group.Put "groupType", ADS_GROUP_TYPE_GLOBAL_GROUP
Group.Set Infо
Удаление группы
Dim Container
Dim ContainerName
Dim GroupToRemove
ContainerName = "Domain_To_Manage"
GroupToRemove = "Group_To_Remove"
Set Container = GetObject("WinNT://" & ContainerName)
Call Container.Delete("Group", GroupToRemove)
Глава 4. Код VBScript Active Server Page для управления учетной записью пользователя
Просмотр значения свойства FullName
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Donain_To_Manage
UserName = "Target_User_Name"
Set User = GetObject("WinNT:// " & UserDomain & "/" & UserName & ".user") Response.Write User.Fullname
Установка нового значения свойства FullName
Dim User
Dim UserName
Dim UserDomain
Dim NewFullName
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
NewFullName = "New_Value_For_Full_Name_Field"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ".user") User.Fullname = NewFullname
User.Setinfo
Просмотр значения свойства Description
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Dornain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ".user") Response.Write User.Description
Установка нового значения свойства Description
Dim User
Dim UserName
Dim UserDomain
Dim NewDescription
UserDomain = "Dornain_To_Manage"
UserName = "Target_User_Name"
NewDescription = "New_Value_For_Description_Field"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ".user")
User.Description = NewDescription
User.Setinfo
Просмотр отдельных элементов поля Description
Dim User
Dim UserName
Dim UserDomain
Dim Delimiter
Dim RetVal
Dim FirstDelim
Dim DescriptionLength
Dim ParsedElement
Dim Terminalcondition
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Delimiter = "I"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ".user") RetVal = User.Description StartPosition = 1
While Terminalcondition <> True FirstDelim = InStr(1, RetVal, Delimiter) If FirstDelim = 0 Then
Terminalcondition = True
Else
DescriptionLength = Len(RetVal)
ParsedElement = Left(RetVal, FirstDelim - 1)
Response.Write Trim(ParsedElement) & "<BR>"
RetVal = Right(RetVal, (DescriptionLength - FirstDelim)) End If
Wend
Установка нового значения пароля пользователя
Dim User
Dim UserName
Dim UserDomain
Dim NewPassword
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
NewPassword = "Superm@n99"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user") Call User.Setpassword(NewPassword)
User.Setinfo
Изменение пароля пользователя
Dim User
Dim UserName
Dim UserDomain
Dim NewPassword
Dim OldPassword
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
NewPassword = "Superm@n26"
OldPassword = "B@tm@n74!”
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user")
Call User.Changepassword (OldPassword, NewPassword)—
User.Setinfo
Просмотр значения пользовательского флага
Dim User
Dim UserName
Dim UserDomain
Dim Flags
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user") Flags = User.Get("UserFlags")
If (Flags And &H10000) <> 0 Then
Response.Write "The specified user account is configured so that the password never expires."
End If’'
Изменение значения пользовательского флага
Dim User
Dim UserName
Dim UserDomain
Dim Flags
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" 4 UserDomain 4 "/" 4 UserName 4 ",user") Flags = User.Get("UserFlags")
User.Put "UserFlags", (Flags Xor 4H10000)
User.Setinfo
Просмотр значения флага User Must Change Password at Next Logon
Dim User
Dim UserName
Dim UserDomain
Dim PasswordExpired
UserDomain = "Dornain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" s UserDomain 4 "/" 4 UserName s ".user")
-PasswordExpired= User.Get("PasswordExpired")
If PasswordExpired = 1 Then
Response.Write "The user account is configured so that the password must be changed on next logon." Else
Response.Write "The user will NOT be required to change the account password on next logon." End If
Установка нового значения флага User Must Change Password at Next Logon
Dim User
Dim UserName
Dim UserDomain
Dim PasswordExpired
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain 4 "/" 4 UserName 4 ",user")
User.Put "PasswordExpired", 1
User.Setinfo•
Просмотр значения флага User Cannot Change Password
Dim User
Dim UserName
Dim UserDomain
Dim Flags
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" 4 UserDomain 4 "/" 4 UserName 4 ",user") Flags = User.Get("UserFlags")
If (Flags And 4H00040) <> 0 Then
Response.Write "The specified user account is configured so that the password cannot be changed." End If
Установка нового значения флага User Cannot Change Password.
Dim User
Dim UserName
Dim UserDomain
Dim Flags.
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" s UserDomain S "/" S UserName S ",user") Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags OR SH00040
User.Setinfo
Изменение значения флага User Cannot Change Password
Dim User
Dim UserName
Dim UserDomain
Dim Flags
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain S "/" S UserName S ",user") Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags XOR SH00040
User.Setlnfe
Просмотр значения флага Password Never Expires
Dim User
Dim UserName
Dim UserDomain
Dim Flags
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" s UserDomain S "/" s UserName S ",user") Flags = User.Get("UserFlags")
If (Flags And &H10000) <> 0 Then
Response.Write "The specified user account is configured so that the password never expires." End If
Установка нового значения флага Password Never Expires
Dim User
Dim UserName
Dim UserDomain
Dim Flags
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" s UserDomain S "/" S UserName S ",user")
Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags OR SH10000
User.Setinfo
Изменение значения флага Password Never Expires
Dim User
Dim UserName
Dim UserDomain
Dim Flags
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" S UserDomain & "/" S UserName S ",user") Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags XOR SH10000
User.Setinfo
Просмотр значения флага Account Disabled
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain S "/" S UserName S ",user")
Response.Write User.AccountDisabled
Установка нового значения флага Account Disabled
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" S UserDomain S "/" S UserName S ",user") User.AccountDisabled = True User.Setinfo
Перечисление всех отключенных учетных записей домена
Dim Domain
Dim DomainName
Dim UserAccount
Dim Counter
Counter = 0
DomainName = "Domain_To_Manage"
Set Domain = GetObject("WinNT://" & DomainName)
Domain.Filter = Array("User")
Response.Write "The following accounts are disabled in domain: " s Domain.Name s "<BR>" For Each UserAccount In Domain
If UserAccount.AccountDisabled = True Then
Response.Write UserAccount.Name s "<BR>"
Counter = Counter + 1
End If
Next
If Counter = 1 Then
Response.Write "Only 1 user account in the " s Domain.Name s " domain is disabled." S "<BR>" Else
Response.Write Counter s " user accounts are disabled in the " s Domain.Name s "domain." & "<BR>" End If
Просмотр значения флага Account Locked Out и свойства IsAccountLocked
Dim User
Dim UserName Dim UserDomain UserDomain = "Domain_To_Manage" UserName = "Target_User_Name" Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user") Response.Write User.IsAccountLocked \
Снятие блокировки учетной записи и изменение значения свойства I sAccountLocked
Dim User.
Dim UserName Dim UserDomain UserDomain = "Domain_To_Manage" UserName = "Target_User_Name" Set User = GetObject("WinNT://" S UserDomain & "/" S UserName & ",user") If User.IsAccountLocked = True Then User.IsAccountLocked = False User.Setinfo
End If.
Снятие блокировки всех учетных записей домена
Dim Domain
Dim UserAccount Dim Counter Dim DomainName Counter = 0,
DomainName = "Domain_To_Manage" Set Domain = GetObject("WinNT://" & DomainName) Domain.Filter = Array("User") For Each UserAccount In Domain If UserAccount.IsAccountLocked = True Then Response.Write UserAccount.Name S "<BR>" UserAccount.IsAccountLocked = False UserAccount.Set Info4
Counter = Counter + 1 End If Next If Counter = 1 Then
Response.Write "Only 1 user account in the " s Domain.Name & " domain was unlocked." & "<BR>" Else
Response.Write Counter & " user accounts were unlocked in the " & Domain.Name & " domain." & "<BR>" End If
Просмотр текущего местоположения пользовательского профайла
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user") Response.Write User.Profile
Установка нового местоположения пользовательского профайла
Dim User
Dim UserName
Dim UserDomain
Dim NewValue
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
NewValue = "New_User_Profile_Path"
Set User = GetObject("WinNT://j & UserDomain & "/" S UserName & ",user") User.Profile = NewValue
User.Setinfo
Просмотр значения свойства Loginscript
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user") Response.Write User.LoginScript
Установка нового значения свойства LoginScript
Dim User
Dim UserName
Dim UserDomain
Dim NewValue
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" S UserDomain & "/" & UserName & ",user")
NewValue = "NewLoginScript.CMD"
User.LoginScript = NewValue
User.Setinfo
Просмотр текущего местоположения личного каталога пользователя
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" S UserName & ",user") Response.Write User.HomeDirectory
Установка нового местоположения личного каталога пользователя
Dim User
Dim UserName
Dim UserDomain
Dim NewValue
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
NewValue = "New_Home_Directory_Path_Value"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user")
User.HomeDirectory = NewValue
User.Setinfo
Просмотр текущего значения подключения личного каталога пользователя
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"\
Set User = GetObject("WinNT://" s UserDomain & "/" s UserName s ",user") Response.Write User.Get("HomeDirDrive")
Установка нового значения подключения личного каталога пользователя
Dim User
Dim UserName
Dim UserDomain
Dim NewValue
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
NewValue = "New_Value_For_Home_Directory_Drive"
Set User = GetObject("WinNT://" s UserDomain & "/" & UserName s ",user") User.Put("HomeDirDrive"), NewValue
User.Setinfo
Просмотр времени пользовательской регистрации
Dim User
Dim UserName Dim UserDomain Dim TimeEntry Dim Restriction UserDomain = "Domain_To_Manage" UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user") For Each TimeEntry In User.LoginHours
If TimeEntry < 255 Then Restriction = 1 Next If Restriction = 1 Then
Response.Write "User account " & UserDomain & "V & UserName s " has time
restrictions placed upon it."
Else
Response.Write "There are no' time restrictions affecting user account " & UserDomain & "\" & UserName & "." End If
Просмотр регистрации рабочих станций
On Error Resume Next
Dim User
Dim UserName
Dim UserDomain
Dim Workstation
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user")
If User.Loginworkstations = "" then
For Each Workstation in User.Loginworkstations
Response.Write Workstation & "<BR>"
Next
Else
Response.Write User.Loginworkstations & "<BR>".
End If
Добавление новой регистрации рабочей станции
к свойству Loginworkstations
On Error Resume Next
Dim User
Dim UserName
Dim UserDomain
Dim Workstation
Dim NewElement ()
Dim i
Dim NewValue
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
NewValue = "New_Machine_To_Add"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user")
If User.Loginworkstations = "" Then
For Each Workstation In User.Loginworkstations
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = Workstation
Next
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = NewValue
User.Loginworkstations = NewElement
User.Setinfo
Else
User.Loginworkstations = Array(NewValue)
User.Setinfo
End If
Удаление существующей регистрации рабочей станции из свойства Loginworkstations
On Error Resume Next
Dim User
Dim UserName
Dim UserDomain
Dim Workstation
Dim NewElement()
Dim i
Dim NewValue
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
NewValue = "Machine_To_Remove"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user") If User.Loginworkstations = "" Then
For Each Workstation In User.Loginworkstations If NewValue <> Workstation Then
i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = Workstation End If
Next
User.Loginworkstations = NewElement
User.Setinfo
Else
If NewValue <> User.Loginworkstations Then
User.Loginworkstations = Array(NewValue)
Else
User.Loginworkstations = ArrayC")
End If
User.Setinfo
End If
Просмотр срока действия учетной записи
On Error Resume Next
Dim User
Dim UserName
Dim UserDomain
Dim AccountExpirationDate
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user")
AccountExpirationDate = User.AccountExpirationDate
Response.Write AccountExpirationDate
Установка срока действия учетной записи
Dim User
Dim UserName
Dim UserDomain
Dim AccountExpirationDate
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user")
AccountExpirationDate = #mm/dd/yyyy#
User.AccountExpirationDate = AccountExpirationDate
User.Setinfo
Просмотр типа учетной записи
Dim User
Dim UserName
Dim UserDomain
Dim Flags
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" S UserDomain & "/" & UserName & ",user") Flags = User.Get("UserFlags")
If (Flags And &H100) <> 0 Then
Response.Write "Local Account"
Else
Response.Write "Global Account"
End If
Преобразование глобальной учетной записи в локальную
Dim User
Dim UserName
Dim UserDomain
Dim Flags
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" S UserDomain S "/" & UserName & ",user")
Flags = User.Get("UserFlags")
If (Flags And SH200) <> 0 Then
User.Put "UserFlags", Flags Xor SH200
User.Setinfo
Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags Xor &H100
User.Setinfo
End If
Преобразование локальной учетной записи в глобальную
Dim User
Dim UserName
Dim UserDomain
Dim Flags
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" S UserDomain & "/" S UserName & ",user") Flags = User.Get("UserFlags")
If (Flags And SH1OO) <> 0 Then
User.Put "UserFlags", Flags Xor SH1OO
User.Setinfo
Flags = User.Get("UserFlags")
User.Put "UserFlags", Flags Xor &H200
User.Setinfo
End If
Просмотр значения свойства BadLoginCount
On Error Resume Next
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain s "/" s UserName s ",user")
Response.Write User.BadLoginCount
Просмотр значения свойства LastLogin для выбранного компьютера
On Error Resume Next•
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user") Response.Write User.LastLogin
Просмотр значения свойства LastLogoff для выбранного компьютера
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name" '
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName S ",user") Response.Write User.LastLogoff
Просмотр значения свойства PasswordMinimumLength учетной записи пользователя
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain S "/" s UserName S ",user") Response.Write User.PasswordMinimumLength
Просмотр значения свойства PasswordRequired учетной записи пользователя
Dim User
Dim UserName
Dim UserDomain
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" s UserDomain s "/" S UserName s ",user") Response.Write User.PasswordRequired
Установка значения свойства PasswordRequired учетной записи пользователя
Dim User
Dim UserName
Dim UserDomain
Dim NewValue,
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user")
NewValue = New_Boolean_Value_For_PasswordRequired
User.PasswordRequired = NewValue
User.Setinfo
Просмотр срока действия пароля пользователя
Dim Group
Dim GroupName
Dim GroupDomain
Dim User
GroupDomain = "Domain_To_Manage"
GroupName = "Domain Admins"
Set Group = GetObject("WinNT://" & GroupDomain & "/" & GroupName & ",group") For Each Member In Group.Members
Set User = GetObject("WinNT://" & GroupDomain & "/" & Member.Name & ",user")
If User.Get("PasswordAge") > 2592000 Then
If (User.Get("UserFlags") And SH10000) = 0 Then
Response.Write Member.Name S "<BR>"
'Если необходимо лишь просмотреть срок действия пароля, то закомментируйте следующие две строки:
User.Put "PasswordExpired", CLng(l)
User.Setinfo End If End If
Next
Определение имен компьютеров, которые больше
не входят в домен
Dim Container
Dim TargetDomain
Dim Member
Dim Computer
TargetDomain = "Domain_In_Which_To_Find_01d_Machine_Accounts"
Set Container = GetObject("WinNT://" & TargetDomain)
Container.Filter = Array("Computer")
For Each Member In Container
Set Computer = GetObject("WinNT://" & TargetDomain & "/" & Member.Name & "$,user")
If Computer.Get("PasswordAge") > 15552000 Then Response.Write Computer.ADsPath & " " & Computer.Get("PasswordAge") & "<BR>"
End If
Next
Глава 5. Код VBScript Active Server Page для управления группой
Добавление пользователей в группу
Dim Group
Dim GroupName
Dim GroupDomain
Dim User
Dim UserName
Dim UserDomain
GroupName = "Target_Group_Name"
GroupDomain = "Target_Group_Domain"
UserName = "Target_User_Name"
UserDomain = "Target User Domain"
Set User = GetObject("WinNT://" S UserDomain & "/" & UserName & ",user")
Set Group = GetObject("WinNT://" & GroupDomain s "/" 6 GroupName & ",group")
Group.Add(User.ADsPath)
Group.Setinfo
Удаление пользователей из группы
Dim Group
Dim GroupName
Dim GroupDomain
Dim User
Dim UserName
Dim UserDomain.
GroupName = "Target_Group_Name"
GroupDomain = "Target_Group_Domain"
UserName = "Target_User_Name"
UserDomain = "Target User Domain"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ",user")
Set Group = GetObject("WinNT://" & GroupDomain & "/" & GroupName & ",group")
Group.Remove(User.ADsPath)
Group.Setinfo
Перечисление членов группы
Dim Group
Dim GroupName
Dim GroupDomain
GroupName = "Target_Group_Name"
GroupDomain = "Target_Group_Domain"
Set Group = GetObject("WinNT://" & GroupDomain & "/" S GroupName & ",group")
For Each Member in Group.Members
Response.Write Member.Name & "<BR>"
Next,
Просмотр группы, к которой принадлежит пользователь
Dim Group
Dim GroupName
Dim GroupDomain
Dim User
Dim UserName
Dim UserDomain
GroupName = "Target_Group_Name"
GroupDomain = "Target_Group_Domain"
UserName = "Target_User_Name"
UserDomain = "Domain_To_Manage"
Set User = GetObject("WinNT://" & UserDomain 6 "/" 6 UserName & ".user")
Set Group = GetObject("WinNT://" & GroupDomain 6 "/" 6 GroupName & ".group")
Response.Write Group.IsMember(User. ADsPath)
Просмотр значения поля описания группы
Dim Group
Dim GroupName
Dim GroupDomain
GroupDomain = "Target_Group_Domain"
GroupName = "Target_Group_Name"
Set Group = GetObject("WinNT://" & GroupDomain & "/" 6 GroupName & ".group") Response.Write Group.Description
Установка нового значения поля описания группы
Dim Group
Dim GroupName
Dim GroupDomain
GroupDomain = "Target_Group_Domain"
GroupName = "Target_Group_Name"
GroupDescription = "Target_Group_Description"
Set Group = GetObject("WinNT://" & GroupDomain & "/" 6 GroupName & ".group")
Group.Description = GroupDescription
Group.Setinfo
Перечисление групп, членом которых является пользователь
Dim User
Dim Group
Dim UserDomain•
Dim UserName
UserDomain = "Domain_To_Manage"
UserName = "Target_User_Name"
Set User = GetObject("WinNT://" & UserDomain & "/" & UserName & ".user")
For Each Group in User.Groups
Response.Write Group.Name & "<BR>"
Next
Глава 6. Код VBScript Active Server Page для управления компьютером и службами
Просмотр владельца компьютера
Dim Computer
Dim ComputerName
Dim ComputerDomain
ComputerDomain = ''Domain_To_Manage"
ComputerName = "Target_Computer_Name"■
Set Computer3 GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ", computer")
Response.Write Computer.Owner
Просмотр организации, на которую зарегистрирован компьютер
Dim Computer
Dim ComputerName
Dim ComputerDomain
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer3 GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ", computer") .
Response.Write Computer.Division
Просмотр операционной системы, установленной на компьютере
Dim Computer
Dim ComputerName
Dim ComputerDomain
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer3 GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ", computer")
Response.Write Computer.OperatingSystem
Просмотр версии операционной системы, установленной
на компьютере
Dim Computer
Dim ComputerName
Dim ComputerDomain
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer3 GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ",computer")
Response.Write Computer.OperatingSystemVersion
Просмотр типа процессора
Dim Computer
Dim ComputerName'
Dim ComputerDomain
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer3 GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ",computer")
Response.Write Computer.Processor
Просмотр установленного HAL в Windows NT
Dim Computer
Dim ComputerName
Dim ComputerDomain
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer= GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ", computer")
Response.Write Computer.Processorcount
Перечисление служб, установленных на выбранном компьютере
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" 6 ComputerDomain & "/" & ComputerName & ",computer")
Computer.Filter = Array("service")
For Each Service In Computer
Response.Write Service.Name & "<BR>"
Next
Просмотр зависимостей службы
On Error Resume Next
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ",computer")
Set Service = Computer.GetObject("service", Targetservice)
If IsArray(Service.Dependencies) = True Then
Dim Entry
For Each Entry In Service.Dependencies
Response.Write Entry & "<BR>"
Next
Else
Response.Write Service.Dependencies & "<BR>"
End If
Установка новой зависимой службы
On Error Resume Next
Dim Computer
Dim Service
Dim NewElementQ
Dim i
Dim EmptyArray
Dim DependencyAlreadyExists
Dim ComputerDomain
Dim Targetcomputer
Dim Targetservice
Dim NewDependency
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
Targetcomputer = "Target_Computer_Name"
NewDependency = "mssqlserver"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & Targetcomputer & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
If IsArray(Service.Dependencies) = True Then
Dim Entry.
For Each Entry In Service.Dependencies
i = UBound(NewElement) + 1
ReDim Preserve NewElement(i)
NewElement(i) = Entry
If Entry = "" Then EmptyArray = 1
If Entry = NewDependency Then DependencyAlreadyExists = 1
Next
If EmptyArray = 1 Then
Service.Dependencies = Array(NewDependency) Service.SetInfo
Else
If DependencyAlreadyExists о 1 Then i = UBound(NewElement) + 1 ReDim Preserve NewElement(i) NewElement(i) = NewDependency Service.Dependencies = NewElement Service.Setinfo
End If
End If
Else
If Service.Dependencies <> NewDependency Then
Service.Dependencies = Array(Service.Dependencies, NewDependency) Service.Setinfo■
End If End If
Просмотр отображаемого имени службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice) Response.Write Service.DisplayName
Определение программного имени службы на основе отображаемого
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim StringToFind
Dim Service
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
StringToFind = "Display_Name_To_Find"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ",computer")
Computer.Filter = Array("service")
For Each Service In Computer
If InStr(Service.DisplayName, StringToFind) <> 0 Then
Response.Write Service.Name; " = "; Service.DisplayName & "<BR>"
End If
Next
Установка нового отображаемого имени службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Dim NewDisplayName
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
NewDisplayName = "New_Service_Display_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
Service.DisplayName = NewDisplayName
Service.Setinfo
Просмотр имени компьютера, на котором запущена служба
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ",computer")
Set Service = Computer.GetObject("service", Targetservice)
Response.Write Service.Hostcomputer
Просмотр исполняемого пути службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
Response.Write Service.Path
Установка нового исполняемого пути службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Dim NewServicePath
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
NewServicePath = "New_Path_To_Executable"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ".computer")
Set Service = Computer.GetObject("service", Targetservice)
Service.Path = NewServicePath
Service.Setinfo
Просмотр имени учетной записи службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
Response.Write Service.ServiceAccountName
Просмотр типа запуска службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ",computer")
Set Service = Computer.GetObject("service", Targetservice)
Select Case Service.StartType
Case 0
Response.Write "BOOT"
Case 1
Response.Write "SYSTEM"
Case 2
Response.Write "AUTOMATIC"
Case 3
Response.Write "MANUAL"
Case 4
Response.Write "DISABLED"
End Select
Установка типа запуска службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice) 'Используйте 4 для отключения службы, 3 - для ручного запуска и 2 - для автозапуска
Service.StartType = 4
Service.Setinfo
Просмотр состояния службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Servicestatus
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ",computer")
Computer.Filter = Array("service")
For Each Service In Computer
Select Case Service.Status
Servicestatus = "Stopped"
Servicestatus = "Start Pending"
Servicestatus = "Stop Pending"
Servicestatus = "Running"
Servicestatus = "Continue_Pending"
Servicestatus = "Pause_Pending"
Servicestatus = "Paused"
Servicestatus = "Error"
End Select
Response.Write Service.Name & Servicestatus & "<BR>"
Next
Запуск службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" 6 ComputerDomain 6 "/" & ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
If Service.Status = 1 Then
Service.Start
Response.Write "The " & Service.Name & " service has been started." & "<BR>" Else
If Service.Status = 4 Then
Response.Write "The " & Service.Name & " service is already started." & "<BR>"
Else
Response.Write "The " & Service.Name 6 " service couild not be started." & "<BR>"
End If
End If
Остановка службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName S ", computer")
Set Service = Computer.GetObject("service", Targetservice)
If Service.Status = 4 Then
Service.Stop
Response.Write "The " & Service.Name & " service has been stopped." & "<BR>"
Else
If Service.Status = 1 then
Response.Write "The " & Service.Name & " service is already stopped." & "<BR>"
Else
Response .Write "The " & Service. Name & " service could not be stopped.1' & "<BR>"
End If
End If
Приостановка службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ", computer")
Set Service = Computer.GetObject("service", Targetservice)
If Service.Status = 4 Then
Service.Pause
Response.Write "The " & Service.Name & " service has been paused." & "<BR>" Else
If Service.Status = 7 Then
Response.Write "The " & Service.Name & " service is already paused." & "<BR>"
Else
Response.Write "The " & Service.Name & " service could not be paused." & "<BR>"
End If
End If
Продолжение выполнения приостановленной службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Targetservice = "Target_Service_Name"
ComputerDomain = "Dornain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ".computer")
Set Service = Computer.GetObject("service", Targetservice)
If Service.Status = 7 Then
Service.Continue
Response.Write "The " & Service.Name & " service has been unpaused." & "<BR>" Else
If Service.Status = 4 Then
Response.Write "The " & Service.Name & " service is already running." & "<BR>" End If End If
Установка нового пароля службы
Dim Computer
Dim ComputerName
Dim ComputerDomain
Dim Service
Dim Targetservice
Dim NewPassword
Targetservice = "Target_Service_Name"
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
NewPassword = "New_Password"
Set Computer = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & ".computer")
Set Service = Computer.GetObject("service", Targetservice)
Service.SetPassword(NewPassword)
Service.Setinfo
Глава 7. Код VBScript Active Server Page для управления файловыми ресурсами и ресурсами печати
Перечисление совместно используемых ресурсов системы
Dim FileService
Dim FileShare
Dim ComputerName
Dim ComputerDomain
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set FileService = GetObject("WinNT://" & ComputerDomain s "/" & ComputerName & "/LanmanServer")
For Each FileShare In FileService
Response.Write FileShare.Name & "<BR>"
Next
Связывание определенного файлового совместно используемого ресурса
Dim FileShare
Dim ComputerName
Dim ComputerDomain
Dim ShareName
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
ShareName = "Target_Share_Name"
Set FileShare = GetObject("WinNT://" S ComputerDomain & "/" & ComputerName & "/LanmanServer/" & ShareName)
Просмотр числа пользователей, использующих . общий ресурс
Dim FileShare
Dim ComputerName
Dim ComputerDomain
Dim ShareName
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
ShareName = "Target_Share_Name"
Set FileShare = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName S "/LanmanServer/" & ShareName)
Response.Write FileShare.CurrentUserCount
Просмотр описания (поля комментария) совместно используемого ресурса
Dim FileShare
Dim ComputerName
Dim ComputerDomain
Dim ShareName
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
ShareName = "Target_Share_Name"
Set Fileshare = GetObject("WinNT://" & ComputerDemain & "/" & ComputerName & "/LanmanServer/" & ShareName)
Response.Write Fileshare.Description
Установка нового описания совместно
используемого ресурса
Dim FileShare'
Dim ComputerName
Dim ComputerDomain
Dim ShareName
Dim NewFileShareDescription
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
ShareName = "Target_Share_Name"
NewFileShareDescription = "New_File_Share_Description"
Set FileShare = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/LanmanServer/" & ShareName)
FileShare.Descript ion = NewFileShareDescription
FileShare.SetInfo
Просмотр имени компьютера, на котором расположен совместно используемый ресурс
Dim FileShare
Dim ComputerName
Dim ComputerDomain
Dim ShareName
ComputerDomain = "Dornain_To_Manage"
ComputerName = "Target_Computer_Name"
ShareName = "Target_Share_Name" Set FileShare = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/LanmanServer/" & ShareName) Response.Write FileShare.Hostcomputer
Просмотр максимального числа пользователей, подключенных к совместно используемому ресурсу Dim FileShare Dim ComputerName Dim ComputerDomain Dim ShareName
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
ShareName = "Target_Share_Name"
Set FileShare = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/LanmanServer/" & ShareName) Response.Write FileShare.MaxUserCount
Установка нового максимального числа пользователей, подключенных к совместно используемому ресурсу
Dim FileShare Dim ComputerName
Dim ComputerDomain
Dim ShareName
Dim NewFileShareMaximumUsers
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
ShareName = "Target_Share_Name"
NewFileShareMaximumUsers = Maximum_Users_Value
Set FileShare = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/LanmanServer/" & ShareName) FileShare.MaxUserCount = NewFileShareMaximumUsers FileShare.Setinfo
Просмотр пути расположения совместно используемого ресурса
Dim FileShare
Dim ComputerName Dim ComputerDomain Dim ShareName ComputerDomain = "Domain_To_Manage" ComputerName = "Target_Computer_Name" ShareName = "Target_Share_Name"
Set FileShare = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/LanmanServer/" & ShareName) Response.Write FileShare.Path
Программное создание совместно используемого ресурса
Dim Container Dim FileShare Dim ComputerName Dim ComputerDomain Dim ShareName Dim NewFileSharePath Dim NewFileShareDescription ComputerDomain = "Domain_To_Manage" ComputerName = "Target_Computer_Name" ShareName = "Target_Share_Name" NewFileSharePath = "Path_To_Share" NewFileShareDescription = "File_Share_Comment" Set Container = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/LanmanServe r") Set FileShare = Container.Create("fileshare", ShareName) FileShare.Path = NewFileSharePath FileShare.Description = NewFileShareDescription FileShare.MaxUserCount = -1 FileShare.SetInfо
Удаление совместно используемого ресурса
Dim Container
Dim ComputerName Dim ComputerDomain Dim ShareName
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name" ShareName = "Target_Share_Name"
Set Container = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName &
"/LanmanServer")
Call Container.Delete("fileshare", ShareName)
Перечисление пользовательских сессий
Dim FileService
Dim ComputerName
Dim ComputerDomain
Dim Session
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set FileService = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName
"/LanmanServer")
For Each Session In FileService.Sessions
Response.write "Session Name:" & Session.Name & " established by user: "
Session.User & _
" from Computer: " & Session.Computer & " Connect Time: " & Ses
sion. ConnectTime & _
" Idle Time: " & Session.IdleTime & "<BR>"
Next
Управление отдельными сессиями
Dim FileService
Dim ComputerName
Dim ComputerDomain
Dim Session
Dim Collection
Dim UserSessionName
Dim UserSession
ComputerDomain = "Domain_Td_Manage"
ComputerName = "Target_Computer_Name"
UserSessionName = "Target_Session"
Set FileService = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName
& "/LanmanServer")
Set Collection = FileService.Sessions
Set UserSession = Collection.GetObject(UserSessionName)
Отключение отдельной пользовательской сессии
Dim FileService
Dim ComputerName
Dim ComputerDomain
Dim Session
Dim Collection
Dim UserSessionName
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
UserSessionName = "Target_Session"
Set FileService = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName
& "/LanmanServer")
Set Collection = FileService.Sessions
Collection.Remove (UserSessionName)
Отключение всех пользовательских сессий
Dim FileService
Dim ComputerName
Dim ComputerDomain
Dim Session
Dim Collection
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set FileService = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/LanmanServer") Set Collection = FileService.Sessions For Each Session In Collection■
Collection.Remove (Session.Name) Next
Перечисление открытых ресурсов.
Dim FileService
Dim ComputerName
Dim ComputerDomain■
Dim Resource
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set FileService = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName s "/LanmanServer") For Each Resource In FileService.Resources
Response.Write "ResourcelD: " & Resource.Name & " Resource: " & Resource. Path & " Opened by: " & _ Resource.User & " Lock Count: " & Resource.LockCount & "<BR>" Next
Тестирование свойств одного открытого ресурса
Dim FileService
Dim ComputerName
Dim ComputerDomain
Dim Resourceuser
Dim Resourcepath
Dim Resource
Dim Collection
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Resourceuser = "Target_Username"
Set FileService = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName s "/LanmanServer")
Set Collection = FileService.Resources
Response.Write "User " & Resourceuser & " has the following resources open:" & "<BR>" For Each Resource In Collection
If Resource.User = Resourceuser Then Response.Write Resource.Path & ”<BR>" End If
Next
Перечисление очередей печати
Dim ComputerName
Dim ComputerDomain
Dim Container
Dim PrintQueue
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
Set Container = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName)
Container.Filter = Array("PrintQueue")
For Each PrintQueue In Container
Response.Write PrintQueue.Name & "<BR>"
Next
Связывание определенной очереди печати
Dim ComputeгName
Dim ComputerDomain
Dim PrintQueueName
Dim PrintQueue
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
PrintQueueName = "Target_Print_Queue"
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName. & "/" & PrintQueueName)
Просмотр однозначного свойства очереди печати
Dim ComputerName
Dim ComputerDomain
Dim PrintQueueName
Dim PrintQueue
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
PrintQueueName = "Target_Print_Queue"
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName s "/" s PrintQueueName)
Response.Write PrintQueue.Model
Просмотр многозначного свойства очереди печати
Dim ComputerName
Dim ComputerDomain
Dim PrintQueueName
Dim PrintQueue
Dim Item
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
PrintQueueName = "Target_Print_Queue"
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/" & PrintQueueName)
If IsArray(PrintQueue.PrintDevices) Then
For Each Item In PrintQueue.PrintDevices
Response.Write Item & "<BR>"
Next
Else
Response.Write PrintQueue.PrintDevices & "<BR>"
End If
Просмотр состояния очереди печати .
Dim PrintQueue
Dim ComputerName
Dim ComputerDomain
Dim PrintQueueName
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
PrintQueueName = "Target_Print_Queue"
Set PrintQueue = GetObject("WinNT://" "/" & PrintQueueName)
Response.Write PrintQueue.Status
& ComputerDomain & "/" & ComputerName &
Приостановка очереди печати
Dim PrintQueue
Dim ComputerName
Dim ComputerDomain
Dim PrintQueueName
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
& ComputerName && ComputerName &PrintQueueName = "Target_Print_Queue"
& ComputerName &
& ComputerName &
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" "/" & PrintQueueName)
PrintQueue.Pause
Возобновление очереди печати
Dim PrintQueue
Dim ComputerName
Dim ComputerDomain
Dim PrintQueueName
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
PrintQueueName = "Target_Print_Queue"
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/" & PrintQueueName)
PrintQueue.Resume
Перечисление заданий печати в очереди
Dim PrintQueue
Dim ComputerName
Dim ComputerDomain
Dim PrintQueueName
Dim PrintJob
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name"
PrintQueueName = "Target_Print_Queue"
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/" & PrintQueueName)
For Each PrintJob in PrintQueue.PrintJobs
Response.Write PrintJob.Name & " " & Printjob.Description & " " &
PrintJob.User & " " & PrintJob.TotalPages & "<BR>"
Next
Изменение приоритета задания печати для определенного пользователя
Dim PrintQueue
Dim ComputerName
Dim ComputerDomain
Dim PrintQueueName
Dim PrintJob
Dim UserToPrioritize
ComputerDomain = "Domain_To_Manage"
ComputerName = "Target_Computer_Name" PrintQueueName = "Target_Print_Queue" UserToPrioritize = "User_To_Elevate_Priority" Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/" & PrintQueueName) For Each PrintJob in PrintQueue.PrintJobs If PrintJob.User = UserToPrioritize Then PrintJob.Priority = 99 PrintJob.SetInfо End If
Next
Удаление задания из очереди печати
Dim PrintQueue Dim Printjob Dim ComputerName Dim ComputerDomain Dim PrintQueueName.
Dim Collection Dim UserToRemove. ComputerDomain = "Domain_To_Manage" ComputerName = "Target_Computer_Name" PrintQueueName = "Target_Print_Queue" UserToRemove = "User_To_Remove_From_Queue"
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" & ComputerName & "/" & PrintQueueName) Set Collection = PrintQueue.PrintJobs For Each PrintJob In PrintQueue.PrintJobs If PrintJob.User = UserToRemove Then Collection.Remove (CStr(PrintJob.Name))
End If Next
Очистка очереди печати
Dim PrintQueue Dim ComputerName Dim ComputerDomain Dim PrintQueueName ComputerDomain = "Domain_To_Manage" ComputerName = "Target_Computer_Name" PrintQueueName = "Target_Print_Queue"
Set PrintQueue = GetObject("WinNT://" & ComputerDomain & "/" s ComputerName & "/" & PrintQueueName) PrintQueue.Purge
Глава 8. Код VBScript Active Server Page для управления узлом IIS
Резервное копирование метабазы IIS
Dim lisComputer
Dim Flags
Dim Targetcomputer
Targetcomputer = "Target_Server_Name"
Flags = (MD_BACKUP_SAVE_FIRST Or MD_BACKUP_FORCE_BACKUP)
Set IlsComputer = GetObject("IIS://" S Targetcomputer)
IlsComputer.Backup "MyBackuplO", MD_BACKUP_NEXT_VERSION, Flags
Перечисление существующих резервных копий
On Error Resume Next
Dim IlsComputer
Dim Targetcomputer
Dim Version
Dim Index•
Dim TermCond
Dim Location
Dim UTCDate1
Targetcomputer = "Target_Server_Name"
Set IlsComputer = GetObject("IIS://" S Targetcomputer)
Do While TermCond о 1
IlsComputer.EnumBackups "", Index, Version, Location, UTCDate
If Err.Number <> 0 Then
Exit Do
End If
Response.Write Location & " Version: " & Version S " " & UTCDate & "<BR>" Index = Index + 1
Loop
Восстановление метабазы из резервной копии
Dim IlsComputer
Dim Targetcomputer
Dim BackupLocation
Targetcomputer = "Target_Server_Name"
BackupLocation = "Backup_Location_On_Target_Server"
Set IlsComputer = GetObject("IIS://" & Targetcomputer)
IlsComputer.Restore BackupLocation, MD_BACKUP_HIGHEST_VERSION, 0
Удаление существующей резервной копии метабазы
Dim IlsComputer
Dim Targetcomputer
Dim BackupLocation
Targetcomputer = "Target_Server_Name"
BackupLocation = "Backup_Location"
Set IlsComputer = GetObject("IIS://" & Targetcomputer)
IlsComputer.DeleteBackup BackupLocation, MD_BACKUP_HIGHEST_VERSION
Просмотр значения свойства MaxBandwidth
Dim IlsComputer
Dim Targetcomputer
Dim RetVal
Targetcomputer = "Target_Server_Name"
Set IlsComputer = GetObject("IIS://" S Targetcomputer)
Response.Write IlsComputer.MaxBandwidth
Установка нового значения свойства MaxBandwidth
Dim IlsComputer
Dim Targetcomputer
Dim NewValue
Targetcomputer = "Target_Server_Name"
NewValue = New_Throttle_Value_In_Bytes
Set IlsComputer = GetObject("IIS://" & Targetcomputer)
IlsComputer.MaxBandwidth = NewValue
IlsComputer.Setlnfо
Просмотр списка определенных на сервере типов MIME
Dim IlsComputer
Dim Targetcomputer
Dim MimeMapping
Targetcomputer = "Target_Server_Name"
Set IlsComputer = GetObject("IIS://" & Targetcomputer & "/MimeMap")
Response.Write "Registered File Types:" & "<BR>"
For Each MimeMapping in IlsComputer.MimeMap
Response.Write "Extension: " & MimeMapping.Extension & " MIME Content Type: " & MimeMapping.MimeType & "<BR>" Next
Добавление нового определенного на сервере типа MIME
Dim IlsComputer
Dim Targetcomputer
Dim MimeMapping
Dim NewMimeMapping
Dim MimeExtension
Dim MimeType
Dim i
Targetcomputer = "Target_Server_Name"
MimeExtension = "New_MIME_Extension"
MimeType = "New_MIME_Type"
Set IlsComputer = GetObject("IIS://" & Targetcomputer & "/MimeMap") NewMimeMapping = IlsComputer.GetEx("MimeMap") i = UBound(NewMimeMapping) + 1 ReDim Preserve NewMimeMapping(i)
Set NewMimeMapping(i) = CreateObject("MimeMap")
NewMimeMapping(i).MimeType = MimeType
NewMimeMapping(i).Extension = MimeExtension
IlsComputer.PutEx ADS_PROPERTY_UPDATE, "MimeMap", NewMimeMapping
IlsComputer.SetInfo
Удаление определенного на сервере типа MIME
Dim IlsComputer
Dim Targetcomputer
Dim MimeMapping
Dim MapToDelete
Dim NewMimeMapping
Dim i
MapToDelete = "Extension_To_Delete_From_MIME_Map"
Targetcomputer = "Target_Server_Name"
Set IlsComputer = GetObject("IIS://" & Targetcomputer & "/MimeMap") NewMimeMapping = IlsComputer.MimeMap
For Each MimeMapping In IlsComputer.MimeMap
If MimeMapping.Extension <> MapToDelete Then
ReDim Preserve NewMimeMapping(i)
Set NewMimeMapping(i) = CreateObject("MimeMap") NewMimeMapping(i).MimeType = MimeMapping.MimeType NewMimeMapping(i).Extension = MimeMapping.Extension i = i + 1
End If
Next
Dim MimeItem
For Each Mimeitem In NewMimeMapping
Response.Write Mimeitem.MimeType & "<BR>"
Next
IIsComputer.PutEx ADS_PROPERTY_UPDATE, "MimeMap", NewMimeMapping 'IlsComputer.Setinfo
Просмотр текущего состояния журнала
Dim Site
Dim ServerName Dim Siteindex ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Response.Write Site.LogType
Установка текущего состояния журнала
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Site.LogType = 1
Site. 'Setinfo
Просмотр формата активного журнала
Dim Site
Dim Log
Dim ServerName
Dim Siteindex
ServerName = ”IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Set Log = GetObject("IIS://" & ServerName & "/logging") For Each Item In Log
If Site.LogPluginCLSID = Item.LogModulelD Then Response.Write Item.Name & "<BR>"
End If
Next
Установка формата активного журнала
Dim Site
Dim Log
Dim ServerName
Dim Siteindex
Dim NewLogFormatName
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
NewLogFormatName = "NCSA Common Log File Format"
'NewLogFormatName = "ODBC Logging"
’NewLogFormatName = "Microsoft IIS Log File Format"
'NewLogFormatName = "W3C Extended Log File Format"
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Set Log = GetObject("IIS://" & ServerName & "/logging")
For Each Item In Log
If Item.Name = NewLogFormatName Then
Site.LogPluginCLSID = Item.LogModulelD
Site.Setinfo
End If
Next
Просмотр временного периода регистрации журнала
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Response.Write Site.LogFilePeriod
Установка нового временного периода регистрации журнала
Dim Site
Dim ServerName
Dim Siteindex
Dim NewLogFilePeriod
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
NewLogFilePeriod = 1
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Site.LogFilePeriod = NewLogFilePeriod
Site.Setinfo
Просмотр максимального размера файла журнала
Dim Site
Dim ServerName
Dim SiteIndex'
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Response.Write Site.LogFileTruncateSize
Установка максимального размера файла журнала
Dim Site ■
Dim ServerName
Dim Siteindex
Dim NewLogFileSize
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
NewLogFileSize = 1048576
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Site.LogFileTruncateSize = NewLogFileSize
Site.Setinfo
Просмотр дополнительных параметров ведения журнала
Dim Site Dim ServerName Dim Siteindex ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value Set Site = GetObject("IIS://" & ServerName S "/W3SVC/" & Siteindex) Response.Write "Log Date: " & Site.LogExtFileDate & "<BR>" Response.Write "Log Time: " S Site.LogExtFileTime & "<BR>" Response.Write "Log Client IP Address: " & Site.LogExtFileClientlp & "<BR>" Response.Write "Log User Name: " & Site.LogExtFileUserName & "<BR>" Response.Write "Log Service Name: " & Site.LogExtFileSiteName & "<BR>" Response.Write "Log Server Name: " & Site.LogExtFileComputerName & "<BR>" Response.Write "Log Server IP: " & Site.LogExtFileServerlp & "<BR>" Response.Write "Log Server Port: " & Site.LogExtFileServerPort & "<BR>" Response.Write "Log Method: " & Site.LogExtFileMethod & "<BR>" Response.Write "Log URI Stem: " & Site.LogExtFileUriStem & "<BR>" Response.Write "Log URI Query: " & Site.LogExtFileUriQuery & "<BR>" Response.Write "Log Http Status: " & Site.LogExtFileHttpStatus & "<BR>" Response.Write "Log Win32 Status: " & Site.LogExtFileWin32Status & "<BR>" Response.Write "Log Bytes Sent: " & Site.LogExtFileBytesSent & "<BR>" Response.Write "Log Bytes Received: " s Site.LogExtFileBytesRecv & "<BR>" Response.Write "Log Time Taken: " & Site.LogExtFileTimeTaken & "<BR>" Response.Write "Log Protocol Version: " & Site.LogExtFileProtocolVersion & "<BR>" Response.Write "Log User Agent: " & Site.LogExtFileUserAgent & "<BR>" Response.Write "Log Cookie: " & Site.LogExtFileCookie & "<BR>" Response.Write "Log Referrer: " & Site.LogExtFileReferer & "<BR>"
Установка дополнительных параметров ведения журнала
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Site.LogExtFileDate = True
Site.LogExtFileTime = True
Site.LogExtFileClientlp = True
Site.LogExtFileUserName = True
Site.LogExtFileSiteName = True
Site.LogExtFileComputerName = True
Site.LogExtFileServerlp = True
Site.LogExtFileServerPort = True
Site.LogExtFileMethod = True
Site.LogExtFileUriStem = True
Site.LogExtFileUriQuery = True
Site.LogExtFileHttpStatus = True
Site.LogExtFileWin32Status = True
Site.LogExtFileBytesSent = True
Site.LogExtFileBytesRecv = True
Site.LogExtFileTimeTaken = True
Site.LogExtFileProtocolVersion = True
Site.LogExtFileUserAgent = True
Site.LogExtFileCookie = True Site.LogExtFileReferer = True Site.Setinfo
Просмотр параметров журнала ODBC■
Dim Site
Dim ServerName Dim Siteindex ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Response.Write Site.LogOdbcDataSource & "<BR>" Response.Write Site.LogOdbcPassword & "<BR>" Response.Write Site.LogOdbcTableName & "<BR>" Response.Write Site.LogOdbcUserName & "<BR>"
Установка параметров журнала ODBC
Dim Site
Dim ServerName
Dim Siteindex
Dim ODBC_DSN'
Dim DBPassword Dim TableName Dim UserName
ODBC_DSN = "Name_of_Data_Source_to_Use_With_ODBC_Logging" DBPassword = "DB_Access_Credential" TableName = "Logging_Table_in_DB" UserName = "DB_Access_Credential" ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Site.LogOdbcDataSource = ODBC_DSN Site.LogOdbcPassword = DBPassword Site.LogOdbcTableName = TableName Site.LogOdbcUserName = UserName Site.Setinfo
Перечисление виртуальных узлов WWW на сервере IIS
Dim Parent Dim Child Dim ServerName ServerName = "IIS_Server_Name" Set Parent = GetObject("IIS://" & ServerName & "/W3SVC") For Each Child In Parent
If IsNumeric(Child.Name) then Response.Write "ProgrammaticID: " & Child.Name & "Friendly Name: " & Child.Servercomment & "<BR>"
End If Next
Перечисление виртуальных узлов FTP на сервере IIS
Dim Parent
Dim Child
Dim ServerName
ServerName = "IIS Server Name"
Set Parent = GetObject("IIS://" & ServerName & "/MSFTPSVC") For Each Child In Parent
If IsNumeric(Child.Name) Then
Response.Write Child.Name & " - " & Child.Servercomment & "<BR>" End If
Next
Поиск числового индекса узла на основе свойства ServerComment
Dim Sites
Dim Site
Dim SearchTerm
Dim Counter
Dim IndexValue
Dim ServerName
SearchTerm = "Site_Description_String"
ServerName = "IIS_Server_Name"
Counter = 0
Set Sites = GetObject("IIS:\\" & ServerName & "\w3svc")
For Each Site In Sites•
If IsNumeric(Site.Name) Then
If LCase(Site.ServerComment) = LCase(SearchTerm) Then Counter = Counter + 1 IndexValue = Site.Name
End If
End If
Next
Select Case Counter
Case 0
Response.Write "The referenced site could not be found. Please enter a new search term." & "<BR>"•
' Case 1
Response-Write "The index value for site "’ & SearchTerm & "' is " & IndexValue & "<BR>"
Case Is > 1
Response-Write "More than one site uses the value '" & SearchTerm & "' for the &" ; "Servercomments property. Assure all values are unique before continuing." & "<BR>" End Select
Создание нового Web-узла
On Error Resume Next
Dim Parent
Dim Child
Dim NewSite
Dim NewRoot
Dim ServerName
Dim Index
Dim SiteName
Dim SitePath
SiteName = "Friendly_Site_Name"
ServerName = "IIS_Server_Name"
SitePath = "Site_Path"
Set Parent = GetObject("IIS://" & ServerName & "/W3SVC") For Each Child In Parent
If IsNumeric(Child.Name) Then
If Index < Child.Name Then
Index = Child.Name
End If
End If
Next
Index = Index + 1
Set NewSite = Parent.Create("IlsWebServer", Index)
NewSite.ServerCoiriment = SiteName■
NewSite.SetInfо
Set NewRoot = NewSite.Create("IIsWebVirtualDir", "Root")
NewRoot.Path = SitePath
NewRoot.Setinfo
Создание нового FTP-узла
Dim Parent
Dim Child
Dim NewSite
Dim NewRoot
Dim ServerName
Dim Index
Dim SiteName
Dim SitePath
Dim SitelPAddress
Dim SiteTCPPort
SiteName = "Friendly_Site_Name"
ServerName = "IIS_Server_Name"
SitePath = "Site_Path"
SitelPAddress = ""
SiteTCPPort = "21" 'SitelPAddress = "xxx.xxx.xxx.xxx" 'SiteTCPPort = "TCP_Port_for_Server" Set Parent = GetObject("IIS://" & ServerName & "/MSFTPSVC") For Each Child In Parent■
If IsNumeric(Child.Name) Then If Index < Child.Name Then Index = Child.Name
End If
End If
Next
Index = Index + 1
Set NewSite = Parent.Create("IIsFTPServer", Index)
NewSite.ServerCoiriment = SiteName
NewSite.ServerBindings = Array(SitelPAddress & ":" & SiteTCPPort & ":") NewSite.SetInfо
Set NewRoot = NewSite.Create("IIsFTPVirtualDir", "Root")
NewRoot.Path = SitePath
NewRoot.Setinfo
Удаление узла на основе свойства Servercomment
Dim Sites
Dim Site
Dim SearchTerm
Dim Counter
Dim IndexValue
Dim ServerName
SearchTerm = "Site_Description_String"
ServerName = "IIS_Server_Name"
Counter = 0
Set Sites = GetObject("IIS:\\" & ServerName & "\w3svc")
For Each Site In Sites
If IsNumeric(Site.Name) Then
If LCase(Site.Servercomment) = LCase(SearchTerm) Then Counter = Counter + 1 IndexValue = Site.Name End If End If Next Select Case Counter
Case 0
Response.Write "The referenced site could not be found. Please enter a new search term."
Case 1
Call Sites.Delete("IlsWebServer", IndexValue) Set Sites = Nothing
Response.Write "Site "’ & SearchTerm & "' was deleted successfully." Case Is > 1
Response.Write "More than one site uses the value '" & SearchTerm & "' for the " ; "Servercomments property. Assure all values are unique before continuing."■
End Select
Удаление FTP-узла
Dim Sites Dim Site Dim SearchTerm Dim Counter Dim IndexValue Dim ServerName SearchTerm = "Site_Description_String" ServerName = "IIS_Server_Name" Counter = 0
Set Sites = GetObject("IIS:\\" & ServerName & "\MSFTPSVC") For Each Site In Sites
If IsNumeric(Site.Name) Then
If LCase(Site.Servercomment) = LCase(SearchTerm) Then Counter = Counter + 1 IndexValue = Site.Name End If
End If Next Select Case Counter
Case 0
Response.Write "The referenced site could not be found. Please enter a new search term."
Case 1
Call Sites.Delete("IIsFTPServer", IndexValue) Set Sites = Nothing
Response.Write "Site '" & SearchTerm & '" was deleted successfully." Case Is > 1
Response.Write "More than one site uses the value '" & SearchTerm & "' for the " & Servercomments & " property. Assure all values are unique before continuing." End Select
Создание нового виртуального каталога
Dim Parent Dim NewVDir
Dim ServerName
Dim VDirPath
Dim VDirName Dim Index ServerName = "IIS_Server_Name" VDirPath = "Path_for_New_Virtual_Directory" VDirName = "Name_For_Virtual_Directory" Index = Site_Index_Integer
Set Parent = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT") Set NewVDir = Parent.Create("IIsWebVirtualDir", VDirName) NewVDir.Setinfo NewVDir.Path = VDirPath NewVDir.SetInfо
Создание нового виртуального каталога FTP
Dim Parent
Dim NewVDir
Dim ServerName
Dim VDirPath
Dim VDirName
Dim Index
ServerName = "IIS_Server_Name"
VDirPath = "Path_for_New_Virtual_Directory"
VDirName = "Name_For_Virtual_Directory"
Index = Site_Index_Integer
Set Parent = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Index & "/ROOT")
Set NewVDir = Parent.Create("IIsFTPVirtualDir", VDirName)
NewVDir.Setinfo
NewVDir.Path = VDirPath•
NewVDir.Setlnfо
Удаление существующего виртуального каталога
Dim Parent
Dim ServerName.
Dim VDirName Dim Index ServerName = "IIS_Server_Name" VDirName = "Name_For_Virtual_Directory" Index = Site_Index_Value
Set Parent = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT") Call Parent.Delete("IIsWebVirtualDir", VDirName) Set Parent = Nothing
Удаление существующего виртуального каталога FTP
Dim Parent Dim ServerName Dim VDirName'
Dim Index ServerName = "IIS_Server_Name" VDirName = "Name_For_Virtual_Directory" Index = Site_Index_Value
Set Parent = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Index & "/ROOT")
Call Parent.Delete("IIsFTPVirtualDir", VDirName)
Управление каталогами и файлами Web
Dim VirtualDirectory Dim ServerName Dim Index
ServerName = "IIS_Server_Name" Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT")
For Each Item In VirtualDirectory
Response.Write Item.Name & "<BR>" Next
Добавление записи в метабазу для каталога файловой системы
Dim VirtualDirectory
Dim WebDir
Dim ServerName Dim FileName Dim Index
Dim VirtualDirectoryName
ServerName = "IIS_Server_Name"
DirName = "Directory_Name_To_Enter"
Index = Site_Index
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT")
Set WebDir = VirtualDirectory.Create("IIsWebDirectory", DirName) WebDir.Setinfo
Добавление записи в метабазу для файла файловой системы
Dim VirtualDirectory
Dim WebFile
Dim ServerName Dim FileName Dim Index Dim VirtualDirectoryName ServerName = "IIS_Server_Name" FileName = "File_Name_To_Enter" Index = Site_Index
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT")
Set WebFile = VirtualDirectory.Create("IIsWebFile", FileName) WebFile.Setinfo
Просмотр состояния узла
Dim Site
Dim ServerName Dim Index ServerName = "IIS_Server_Name" Index = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index) Select Case Site.Serverstate
Case 1
Response.Write "Starting"
Case 2
Response.Write "Started"
Case 3
Response.Write "Stopping"
Case 4
Response.Write "Stopped"
Case 5
Response.Write "Pausing"
Case 6
Response.Write "Paused"
Case 7
Response.Write "Continuing"
End Select
Запуск узла
Dim Site
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name"’
Index = Site_Index_Value
Set'Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index)
If Site.Serverstate = 4 or Site.Serverstate = 3 Then
Site.Start
Response.Write "Request to start site " & Site.Servercomment & " was issued." End If
Остановка узла
Dim Site
Dim ServerName'
Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index)
If Site.Serverstate = 2 or Site.Serverstate = 1 Then
Site.Stop
Response.Write "Request to stop site " & Site.Servercomment & " was issued." End If
Приостановка узла
Dim Site
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index)
If Site.Serverstate = 1 or Site.Serverstate = 2 Then
Site.Pause
Response.Write "Request to pause site " & Site.Servercomment & " was issued."’
End If
Возобновление работы узла
Dim Site
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name" Index = Site_lndex_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index) If Site.Serverstate = 6 or Site.ServerState = 5 Then
Site.Continue
Response.Write "Request to continue paused site " & Site.ServerComment & " was issued." End If
Глава 9. Код VBScript Active Server Page для управления Web-узлом
Просмотр значения свойства Servercomment
Dim Site
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name"
Index = Site_lndex_lnteger •
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index) Response.Write Site.ServerComment
Установка нового значения свойства ServerComment
Dim Site
Dim ServerName
Dim Index
Dim NewServerComment
ServerName = "IIS_Server_Name"
Index = Site_Index_Integer
NewServerComment = "New_Server_Comment_String"
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index) Site.ServerComment = NewServerComment Site.Setinfo
Просмотр значения свойства ServerBindings
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name",
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
For Each Binding In Site.ServerBindings Response.Write Binding & "<BR>"
Next
Установка нового значения свойства ServerBindings
Dim Site
Dim ServerName
Dim Siteindex
Dim NewBindingArray
Dim ServerBindingStringl
Dim ServerBindingString2
Dim ServerBindingString3
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
ServerBindingStringl = "IP_Address:TCP_Port:Hostname"
ServerBindingString2 = "IP_Address:TCP_Port:Hostname"
ServerBindingString3 = "IP_Address:TCP_Port:Hostname"
NewBindingArray = Array(ServerBindingStringl, ServerBindingString2, Server-
BindingString3)
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Site.ServerBindings = NewBindingArray
Site.Setinfo
Просмотр значения свойства SecureBindings
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IlS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
For Each Binding- In Site.SecureBindings Response.Write Binding & "<BR>"
Next
Установка нового значения свойства SecureBindings
Dim Site
Dim ServerName
Dim Siteindex
Dim NewBindingArray
Dim ServerBindingStringl
Dim ServerBindingString2
Dim ServerBindingString3
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
ServerBindingStringl = "IP_Address:TCP_Port:Hostname"
ServerBindingString2 = "IP_Address:TCP_Port:Hostname"
ServerBindingString3 = "IP_Address:TCP_Port:Hostname"
NewBindingArray = Array(ServerBindingStringl, ServerBindingString2, Server-
BindingString3)
Set Site = GetObject("IIS://" & ServerName S "/W3SVC/" & Siteindex)
Site.SecureBindings = NewBindingArray
Site.Setinfo
Просмотр значения свойства MaxConnections
Dim Site
Dim ServerName
Dim Index
Dim Retval■
ServerName = "IIS_Server_Name"
Index = Site_Index
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index)
RetVal = Site.Maxconnections
Response.Write Retval
Установка нового значения свойства MaxConnections
Dim Site.
Dim ServerName
Dim Index
Dim NewMaxConnections
ServerName = "IIS_Server_Name"
Index = Site_Index
NewMaxConnections = Maximum_Number_of_Connections
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index)
Site.Maxconnections = NewMaxConnections
Site.Setinfo
Просмотр значения свойства ConnectionTimeout
Dim Site Dim ServerName Dim Index Dim Retval ServerName = "IIS_Server_Name" Index = Site_Index
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index) Retval = Site.ConnectionTimeout Response.Write Retval
Установка нового значения свойства ConnectionTimeout,
Dim Site
Dim ServerName■
Dim Index Dim ConnectionTimeout ServerName = "IIS_Server_Name" Index = Site_Index_Value
NewConnectionTimeout = Connection_Timeout_in_Seconds
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Index) Site.ConnectionTimeout = NewConnectionTimeout Site.Setinfo
Просмотр операторов Web-узла
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Set SecurityDescriptor = Site.AdminAcl
Set DiscretionaryAcl = SecurityDescriptor.DiscretionaryAcl
For Each Item In DiscretionaryAcl
If Item.AccessMask = 11 Or Item.AccessMask = 262315 Then Response.Write Item.Trustee & "<BR>"
End If
Next
Добавление нового оператора Web-узла
Dim Site
Dim ACE
Dim DiscretionaryACL
Dim ServerName
Dim Siteindex
Dim NewOperator
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
NewOperator = "New_Operator_in_Format_Domain\Username"
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex)
Set SecurityDescriptor = Site.AdminACL
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject("AccessControlEntry")
ACE.Trustee = NewOperator
ACE.AccessMask = 11
DiscretionaryACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DiscretionaryACL
Site.AdminACL = SecurityDescriptor
Site.Setlnfo
Удаление оператора Web-узла
Dim Site
Dim ACE
Dim DiscretionaryACL
Dim ServerName
Dim Sitelndex
Dim OperatorToRemove
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
OperatorToRemove = "User_Name_to_Remove"
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" s Siteindex)
Set SecurityDescriptor = Site.AdminACL
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject("AccessControlEntry")
ACE.Trustee = OperatorToRemove
ACE.AccessMask = 11
DiscretionaryACL.RemoveAce ACE
SecurityDescriptor.DiscretionaryACL = DiscretionaryACL
Site.AdminACL = SecurityDescriptor
Site.Setlnfo
Просмотр значения свойства Serversize
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Response.Write Site.ServerSize
Установка нового значения свойства ServerSize
Dim Site Dim ServerName Dim Siteindex Dim NewServerSize ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value NewServerSize = 0
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Site.ServerSize = NewServerSize Site.Setinfo
Просмотр максимальной полосы пропускания узла
Dim Site
Dim ServerName Dim Siteindex ServerName = "HS_Server_Name" Siteindex = Site_Index_value Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Response.Write Site.MaxBandwidth
Установка максимальной полосы пропускания узла
Dim Site
Dim ServerName■
Dim Siteindex'
Dim NewMaxBandwidth ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value
NewMaxBandwidth = Value_in_Bytes Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Site.MaxBandwidth = NewMaxBandwidth Site.Setinfo
Просмотр состояния сохранения соединения HTTP
Dim Site Dim ServerName Dim Siteindex ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Response.Write Site.AllowKeepAlive
Установка нового состояния сохранения соединения НИР
Dim Site Dim ServerName Dim Siteindex Dim AllowKeepAlive ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value AllowKeepAlive = True
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex) Site.AllowKeepAlive = AllowKeepAlive Site.Setinfo
Просмотр локального пути корневого виртуального каталога
Dim VirtualDirectory
Dim ServerName
Dim Index Dim RetVal.
ServerName = "IIS_Server_Name" Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT")
RetVal = VirtualDirectory.Path Response.Write RetVal
Модификация локального пути корневого виртуального каталога
Dim VirtualDirectory
Dim ServerName
Dim Index
Dim NewvirtualDirPath
ServerName = "IIS_Server_Name"
Index = Site_Index_value
NewvirtualDirPath = "New_Path_for_Site"
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT")
VirtualDirectory.Path = NewvirtualDirPath
VirtualDirectory.Setinfo
Просмотр удаленного пути корневого виртуального каталога и информации о соединении
Dim VirtualDirectory
Dim ServerName
Dim Index
Dim RetVal
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT")
Response.Write VirtualDirectory.Path & "<BR>"
Response.Write VirtualDirectory.UNCUserName & "<BR>"
Response.Write VirtualDirectory.UNCPassword
Модификация удаленного пути корневого виртуального каталога и информации о соединении
Dim VirtualDirectory
Dim ServerName
Dim Index
Dim NewvirtualDirPath
Dim NewVirtualDirUser
Dim NewVirtualDirPassword
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
NewvirtualDirPath = "New Path for Site"
NewVirtualDirUser = "UNC_Credentials_Used_To_Establish_Connection"
NewvirtualDirPassword = "UNC_Credentials_Used_To_Establish_Connection"
Set VirtualDirectory = Getobject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT") VirtualDirectory.Path = NewVirtualDirPath VirtualDirectory.UNCUsername = NewVirtualDirUser VirtualDirectory.UNCPassword = NewVirtualDirPassword VirtualDirectory.Setinfo
Настройка разрешений доступа и управления содержимым локальных и удаленных личных каталогов Dim VirtualDirectory■
Dim ServerName Dim Index ServerName = "HS_Server_Name" Index = Site_Index_Value Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT") Response.Write "Read:" & virtualDirectory.AccessRead & "<BR>" Response.Write "Write:" & VirtualDirectory.AccessWrite & "<BR>" Response.Write "Logging Disabled: " & VirtualDirectory.DontLog & "<BR>" Response.Write "Dir Browsing: " & VirtualDirectory.EnableDirBrowsing & "<BR>" Response.Write "Index Content: " & VirtualDirectory.Contentlndexed & "<BR>" Set VirtualDirectory = GetObject("IIS://" & ServerName & "/W3SVC/" & Index) Response.Write "Frontpage Web:" & VirtualDirectory.FrontPageWeb
Просмотр конфигурации приложения
Dim Application
Dim ServerName,
Dim Index ServerName = "IIS_Server_Name" • Index = Site_Index_Value Set Application = Getobject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT") Response.Write "Friendly Name:" & Application.AppFriendlyName & "<BR>" Response.Write "Application Root:" & Application.AppRoot & "<BR>" Response.Write "Isolated Process:" & Application.Applsolated & "<BR>" Response.Write "Read:" & Application.AccessRead & "<BR>" Response.Write "Execute:" & Application.AccessExecute
Установка конфигурации приложения
Dim Application Dim ServerName Dim Index Dim ApplicationName Dim Isolated Dim Read Dim Execute ServerName = "IIS_Server_Name" Index = Site_Index_Value ApplicationName = "Application_Name" Isolated = True Read = True Execute = True .
Set Application = Getobject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT")
Application.AppRoot = Replace(Application.ADsPath, "IIS://" & ServerName, "/LM")
Application.AppFriendlyName = ApplicationName
Application.Applsolated = Isolated
Application.AccessRead = Read
Application.AccessExecute = Execute
Application.Setinfo'
Настройка параметров приложения
Dim Application
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Application = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT")
Response.Write "Session Timeout:" & Application.AspSessionTimeout & "<BR>"
Response.Write "Buffering:" & Application.AspBufferingOn & "<BR>"
Response.Write "Parent Paths:" & Application.AspEnableParentPaths & "<BR>" Response.Write "Script Language:" & Application.AspScriptLanguage & "<BR>" Response.Write "Script Timeout:" & Application.AspScriptTimeout
Управление параметрами процесса
Dim Application
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Application = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT")
Response.Write "NT Event Logging:" & Application.AspLogErrorRequests & "<BR>"
Response.Write."Debug Exceptions:" & Application.AspExceptionCatchEnable & "<BR>"
Response.Write "Script Engines Cached:" & Application.AspScriptEngineCacheMax & "<BR>"
Response.Write "Script File Cache:" & Application.AspScriptFileCacheSize & "<BR>"
Set Application - GetObject("IIS://" & ServerName & "/W3SVC/" & Index) Response.Write "CGI Script Timeout:" & Application.CGITimeout
Управление параметрами отладки ASP
Dim Application
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Application = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT")■
Response.Write "ASP Server-Side Debugging:" & Application.AppAllowDebugging & "<BR>"
Response.Write "ASP Client-Side' Debugging:" & Application.AppAllowClientDebug & "<BR>"
Response.Write "Detailed Client Error Messages:" & Applica
tion. AspScriptErrorSentToBrowser & "<BR>"
If Application.AspScriptErrorSentToBrowser = False then
Response.Write "Error Message Text's" & Application.AspScriptErrorMessage & "<BR>" End If
Просмотр текущего состояния перенаправления
Dim Resource
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Index S "/ROOT") Response.Write Resource.HttpRedirect
Установка нового ресурса перенаправления
Dim Resource
Dim ServerName
Dim Siteindex
Dim HttpRedirectString
ServerName = "HS_Server_Name"
Siteindex = Site_Index_Value
HttpRedirectString = "http://www.sitename.com,FLAG,"
Set Resource = GetObject("IIS://" & ServerName & "/W3SvC/" & Siteindex & "/ROOT")
Resource.HttpRedirect = HttpRedirectString
Resource.Set Info
Просмотр значения свойства EnableDefaultDoc
Dim Resource
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT") Response.Write Resource.EnableDefaultDoc
Установка значения свойства EnableDefaultDoc
Dim Resource
Dim ServerName.
Dim Siteindex
Dim EnableDefaultDocument
ServerName = "IlS_Server_Name"
Siteindex = Site_lndex_Value
EnableDefaultDocument = True
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex & "/ROOT") Resource.EnableDefaultDoc = EnableDefaultDocument
Resource.Setinfo
Просмотр значения свойства DefaultDoc
Dim Resource
Dim ServerName
Dim Index
ServerName = "IIS Server Name"
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT") Response.Write Resource.DefaultDoc
Установка значения свойства DefaultDoc
Dim Resource
Dim ServerName
Dim Siteindex
Dim DefaultDocument
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
DefaultDocument = "default.asp, default.htm,index.html"
Set Resource = GetObject("IIS:/7" & ServerName & "/W3SVC/" & Siteindex & "/ROOT")
Resource.DefaultDoc = DefaultDocument
Resource.Setinfo
Просмотр значения свойства DefaultDocFooter
Dim Resource
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" s Index & "/ROOT") Response.Write Resource.DefaultDocFooter
Установка значения свойства DefaultDocFooter
Dim Resource
Dim ServerName
Dim Siteindex
Dim DefaultDocumentFooter
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
DefaultDocumentFooter = "c:\legal_footers\copyright.htm"
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex & "/ROOT")
Resource.DefaultDocFooter = DefaultDocumentFooter
Resource.Setinfo
Просмотр значения свойства EnableDocFooter
Dim Resource
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Resource = GetObjectC'IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT") Response.Write Resource.EnableDocFooter
Установка значения свойства EnableDocFooter
Dim Resource
Dim ServerName
Dim Siteindex
Dim EnableDocumentFooter
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
EnableDocumentFooter = True"
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex & "/ROOT")
Resource.EnableDocFooter = EnableDocumentFooter
Resource.Setinfo.
Просмотр методов аутентификации выбранного ресурса
Dim Resource
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex & "/ROOT")
Response.Write "Authentication Methods for " s Resource.ADsPath & ":"
Response.Write "<BR>"
Response.Write "Anonymous Access:" & Resource.AuthAnonymous & "<BR>"
If Resource.AuthAnonymous = True Then
Response.Write "Anonymous User Account Name:" & _
Resource.AnonymousUsername & "<BR>"
Response.Write "Anonymous User Account Password:" & _
Resource.AnonymousUserPass & "<BR>"
Response.Write "Anonymous User Password Synchronization:" & Re
source .AnonymousPasswordSync & "<BR>"
End If
Response.Write "Basic Authentication:" & Resource.AuthBasic & "<BR>"
If Resource.AuthBasic = True Then
Response.Write "Default Authentication Domain: " & _
Resource.DefaultLogonDomain & "<BR>"
End If
Response.Write "NTLM Authentication:" & Resource.AuthNTLM
Активизация анонимного доступа
Dim Resource
Dim ServerName
Dim Siteindex
Dim EnableAnonymousAccess
Dim AnonUserName
Dim AnonUserPassword.
Dim AnonPasswordSync
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
EnableAnonymousAccess = True
AnonUserName = "Username_for_Anonymous_Access"
AnonUserPassword = "Password_for_Anonymous_Access_Account"
AnonPasswordSync = True
Set Resource = GetObject("IIS://" & ServerName s "/W3SVC/" & Siteindex & "/ROOT")
Resource.AuthAnonymous = EnableAnonymousAccess
Resource.AnonymousUsername = AnonUserName
Resource.AnonymousUserPass = AnonUserPassword"
Resource.AnonymousPasswordSync = AnonPasswordSync
Resource.Setinfo
Активизация базового метода аутентификации
Dim Resource Dim ServerName Dim Siteindex Dim EnableBasicAuth Dim DefaultLogonDomain'
ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value EnableBasicAuth = True
DefaultLogonDomain = "Domain_Used_for_Authentication"
Set Resource = GetObject("IIS://" s ServerName & "/W3SVC/" & Siteindex & "/ROOT") Resource.AuthBasic= EnableBasicAuth Resource.DefaultLogonDomain = DefaultLogonDomain Resource.Setinfo
Активизация аутентификации NTLM
Dim Resource Dim ServerName Dim Siteindex Dim EnableBasicAuth.
Dim DefaultLogonDomain ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value EnableBasicAuth = True DefaultLogonDomain = "Domain_Used_for_Authentication" Set Resource = GetObject("IIS://" S ServerName & "/W3SVC/" S Siteindex & "/ROOT") Resource.AuthBasic= EnableBasicAuth•
Resource.DefaultLogonDomain = DefaultLogonDomain Resource.Setinfo
Просмотр конфигурации безопасного подключения
Dim Resource Dim ServerName Dim Siteindex ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex & "/ROOT") Response.Write "Require SSL:" & Resource.AccessSSL & "<BR>"
Response.Write "Require 128-bit SSL:" & Resource.AccessSSL128 & "<BR>" Response.Write "Map Client Certificates to NT UserIDs:" & Resource. AccessSSLMapCert & "<BR>" Response.Write "Negotiate Client Certificates:" & Resource. AccessSSLNegotiateCert & "<BR>"
Response.Write "Require-Client Certificates:" & Resource.AccessSSLRequireCert & "<BR>"
Установка новой конфигурации безопасного подключения
Dim Resource Dim ServerName Dim Siteindex ServerName = "IIS_Server_Name" Siteindex = Site Index Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex & "/ROOT"):
Resource.AccessSSL = True Resource.AccessSSL128 = True Resource.AccessSSLMapCert = True Resource.AccessSSLNegotiateCert = True Resource.AccessSSLRequireCert = True Resource.Setinfo
Просмотр адресов IP, которым запрещен доступ к ресурсам
Dim Site
Dim ServerName
Dim Siteindex
Dim IPSecurity
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/W3SVC/" & Siteindex & "/ROOT") Set IPSecurity = Site.IPSecurity If IPSecurity.GrantByDefault Then
Response.Write "All addresses will be allowed, except as follows:" & "<BR>" For Each Entry In IPSecurity.IPDeny
If InStrd, Entry, "255.255.255.255") Then
Response.Write "Denied IP: " & Replace(Entry, ", 255.255.255.255", "") & "<BR>" Else
Response.Write "Denied Subnet: " & Entry & "<BR>"
End If.
Next For Each Entry In IPSecurity.DomainDeny
Response.Write "Denied Domain: " & Entry & "<BR>" Next Else
Response.Write "All addresses will be blocked, except as follows:" & "<BR>" For Each Entry In IPSecurity.IPGrant
If InStrfl, Entry, "255.255.255.255") Then
Response.Write "Allowed IP: " & Replace(Entry, ", 255.255.255.255", "") S "<BR>" Else
Response.Write "Allowed Subnet: " & Entry & "<BR>" End If
Next
For Each Entry In IPSecurity.DomainGrant
Response.Write "Allowed Domain: " & Entry & "<BR>"
Next End If
Установка новых адресов IP, которым запрещен доступ к ресурсам
Dim Site
Dim ServerName
Dim Siteindex
Dim IPSecurity
Dim IPAddress
Dim IPSubnet Dim Domain
Dim ActionType
ServerName = "HS_Server_Name" Siteindex = Site_Index_Value IPAddress = "xxx.xxx.xxx.xxx" IPSubnet = "xxx.xxx.xxx.xxx" Domain = "DNS_Domain.Name" ActionType = "GRANTIP" 'ActionType = "GRANTSUBNET" 'ActionType = "GRANTDOMAIN" 'ActionType = "DENYIP" 'ActionType = "DENYSUBNET" 'ActionType = "DENYDOMAIN" Set Site = GetObject("IIS://" s ServerName & "/W3SVC/" s Siteindex s "/ROOT") Select Case ActionType
Case "GRANTIP"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False Site.IPSecurity = IPSecurity Site.Setinfo
IPSecurity.IPGrant = Array(IPAddress & ", 255.255.255.255") Site.IPSecurity = IPSecurity Site.Setinfo
Case "GRANTSUBNET"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False IPSecurity.IPGrant = Array(IPAddress & ", " & IPSubnet) Site.IPSecurity = IPSecurity Site.Setinfo Case "GRANTDOMAIN"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False IPSecurity.DomainGrant = Array(Domain) Site.IPSecurity = IPSecurity Site.Setinfo Case "DENYIP"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = True IPSecurity.IPDeny = Array(IPAddress & ", 255.255.255.255") Site.IPSecurity = IPSecurity Site.Setinfo
Case "DENYSUBNET"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = True IPSecurity.IPDeny = Array(IPAddress & ", " s IPSubnet) Site.IPSecurity = IPSecurity Site.Setinfo Case "DENYDOMAIN"
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = True IPSecurity.DomainDeny = Array(Domain) Site.IPSecurity = IPSecurity Site.Setinfo End Select
Просмотр текущего значения даты истечения срока содержимого
Dim Resource Dim ServerName Dim Index
ServerName = "IIS_Server_Name" Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" S Index S "/ROOT") Response.Write Resource.HttpExpires
Активизация даты истечения срока содержимого
Dim Resource Dim ServerName Dim Siteindex Dim ContentExpiration ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value ContentExpiration = "D, 0"
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" S Siteindex S "/ROOT")
Resource.HttpExpires = ContentExpiration Resource.Setlnfо
Просмотр конфигурации пользовательского заголовка HTTP
Dim Resource Dim ServerName Dim Index ServerName = "IIS_Server_Name" Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" S Index S "/ROOT") For Each HeaderEntry in Resource.HttpCustomHeaders
Response.Write HeaderEntry & "<BR>" Next
Создание пользовательского заголовка HTTP
Dim Resource Dim ServerName Dim Index Dim NewHeaderArray ServerName = "IIS_Server_Name" Index = Site_Index_Value
NewHeaderArray = Array("HeaderName: Headervalue")
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" S Index & "/ROOT") Resource.HttpCustomHeaders = NewHeaderArray Resource.Setinfo
Просмотр уровней RSACi ресурса
Dim Resource Dim ServerName Dim Index Dim Entry ServerName = "IIS_Server_Name" Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" S Index s "/ROOT") For Each Entry In Resource.HttpPics
Response.Write Entry & "<BR>" Next
Установка уровня RSACi ресурса
Dim Resource
Dim ServerName
Dim Index
Dim PICSLabel
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
PICSLabel = "PICS_Format_String"
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" s Index & "/ROOT") Resource.HttpPics = PICSLabel Resource.Setinfo
. Просмотр определений типов MIME ресурса
Dim Resource Dim ServerName Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT") Response.Write "Registered File Types:" s "<BR>" For Each MimeMapping in Resource.MimeMap
Response.Write "Extension: " & MimeMapping.Extension & " MIME Content Type: " & MimeMapping.MimeType & "<BR>" Next
Установки новых типов MIME ресурса
Dim Resource
Dim ServerName
Dim Index
Dim MimeMapping
Dim NewMimeMapping
Dim MimeExtension
Dim MimeType Dim i
MimeExtension = "New_MIME_Extension"
MimeType = "New_MIME_Type"
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set Resource = GetObject("IIS://" & ServerName & "/W3SVC/" & Index & "/ROOT") NewMimeMapping = Resource.GetEx("MimeMap")
i = UBound(NewMimeMapping) + 1
ReDim Preserve NewMimeMapping(i)
Set NewMimeMapping(i) = CreateObject("MimeMap")
NewMimeMapping(i).MimeType = MimeType
NewMimeMapping(i).Extension = MimeExtension
Resource.PutEx ADS_PROPERTY_UPDATE, "MimeMap", NewMimeMapping Resource.Setinfo
Глава 10. Код VBScript Active Server Page для управления FTP-узлом
Просмотр значения свойства Servercomment
Dim Site
Dim ServerName
Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Integer
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Index) Response.Write Site.Servercomment
Установка нового значения свойства Servercomment
Dim Site
Dim ServerName
Dim Index
Dim NewServerComment
ServerName = "IIS_Server_Name"
Index = Site_Index_Integer
NewServerComment = "New_Server_Comment_String"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Index)
Site.ServerComment = NewServerComment
Site.Setinfo
Просмотр значения свойства ServerBindings
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" s ServerName & "/MSFTPSVC/" & Siteindex)
For Each Binding In Site.ServerBindings
Response.Write Binding s "<BR>"
Next
Установка нового значения свойства ServerBindings
Dim Site
Dim ServerName
Dim SiteIndex
Dim NewBindingArray
Dim IPAddress
Dim TCPPort
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
IPAddress = "xxx.xxx.xxx.xxx"
TCPPort = TCP_Port_Number
NewBindingArray = Array(IPAddress & ":" s TCPPort s ":")
Set Site = GetObject("IIS://" s ServerName & "/MSFTPSVC/" s Siteindex) Site.ServerBindings = NewBindingArray
Site.Setinfo
Просмотр максимального числа подключений
Dim Site
Dim ServerName
Dim Index
Dim RetVal
ServerName = "IIS_Server_Name"
Index = Site_Index
Set Site = GetObject("IIS://" s ServerName s "/MSFTPSVC/" s Index) RetVal = Site.MaxConnections
Response.Write RetVal
Установка максимального числа подключений
Dim Sit6■
Dim ServerName
Dim Index
Dim NewMaxConnections
ServerName = "IIS_Server_Name"
Index = Site_Index
NewMaxConnections = Maximum_Number_of_Connections
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" s Index)
Site.MaxConnections = NewMaxConnections
Site.Setinfo
Просмотр значения времени ожидания
Dim Site
Dim ServerName
Dim Index
Dim RetVal
ServerName = "IIS_Server_Name"
Index = Site_Index
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Index) RetVal = Site.ConnectionTimeout
Response.Write RetVal
Установка нового значения времени ожидания
Dim Site
Dim ServerName
Dim Index
Dim ConnectionTimeout
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
NewConnectionTimeout = Connection_Timeout_in_Seconds
Set Site = GetObject("IIS://" & ServerName s "/MSFTPSVC/" s Index)
Site.ConnectionTimeout = NewConnectionTimeout
Site.Setinfo
Просмотр значения свойства AllowAnonymous
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Siteindex) Response.Write Site.AllowAnonymous1
Установка нового значения свойства AllowAnonymous
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName s "/MSFTPSVC/" & Siteindex) Site.AllowAnonymous = False Site.Setinfo
Просмотр значений параметров учетной записи анонимного пользователя
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" s ServerName s "/MSFTPSVC/" & Siteindex)
Response.Write Site.AnonymousUsername & "<BR>"
Response.Write Site.AnonymousUserPass & "<BR>"
Response.Write Site.AnonymousPasswordSync
Установка новых значений параметров учетной записи анонимного пользователя
Dim Site
Dim ServerName
Dim Siteindex
Dim AnonymousUserName
Dim AnonymousUserPassword
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
AnonymousUserName = "Username_for_Anonymous_FTP_Access"
AnonymousUserPassword = "Password_for_Anonymous_User_Account"
Set Site = GetObject("IIS://" s ServerName & "/MSFTPSVC/" & Siteindex)
Site.AnonymousUsername = AnonymousUserName
Site. AnonymousUserPass = AnonymousUserPassword
Site.AnonymousPasswordSync = True
Site.Setlnfc
Просмотр значения свойства AnonymousOnly
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Siteindex) Response.Write Site.AnonymousOnly
Установка нового значения свойства AnonymousOnly
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Siteindex) Site.AnonymousOnly = True Site.Setinfo
Просмотр операторов FTP-узла
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Siteindex) Set SecurityDescriptor = Site.AdminAcl
Set DiscretionaryAcl = SecurityDescriptor.DiscretionaryAcl
For Each Item In DiscretionaryAcl
If Item.AccessMask = 11 Or Item.AccessMask = 262315 Then Response.Write Item.Trustee 4 "<BR>"
End If Next
Создание нового оператора FTP-узла
Dim Site
Dim ACE
Dim DiscretionaryACL
Dim ServerName
Dim Siteindex
Dim NewOperator
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
NewOperator = "New_Operator_in_Format_Domain\Username"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Siteindex) Set SecurityDescriptor = Site.AdminACL Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL Set ACE = CreateObject("AccessControlEntry") ACE.Trustee = NewOperator ACE.AccessMask = 11 DiscretionaryACL.AddAce ACE SecurityDescriptor.DiscretionaryACL = DiscretionaryACL Site.AdminACL = SecurityDescriptor Site.Setinfo
Просмотр текущего сообщения-приветствия
Dim Site
Dim ServerName
Dim Siteindex
ServerName - "IIS_Server_Name" Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" 4 ServerName & "/MSFTPSVC/" 4 Siteindex) For Each MessageLine in Site.GreetingMessage
Response.Write MessageLine & "<BR>".
Next■’^
Установка нового текущего сообщения-приветствия
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name"■
Siteindex = Site_lndex_Value
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Siteindex) Site.GreetingMessage = Array ("Greet ing_Line_l", "Greeting_Line_2","Greeting_Line_3") Site.Setinfo
Просмотр текущего сообщения о выходе
Dim Site
Dim ServerName
Dim Siteindex
ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value ' Set Site = GetObject("IIS://" s ServerName & "/MSFTPSVC/" s Siteindex) Response.Write Site.ExitMessage
Установка нового сообщения о выходе
Dim Site
Dim ServerName
Dim Siteindex
Dim NewExitMessageString
ServerName = "IIS_Server_Name"
Siteindex = Site_lndex_Value
NewExitMessageString = "FTP_Session_Termination_Text"
Set Site = GetObject("IIS://" S ServerName s "/MSFTPSVC/" & Siteindex) Site.ExitMessage = NewExitMessageString Site.Setinfo
Просмотр текущего сообщения о превышении числа подключений
Dim Site
Dim ServerName
Dim Siteindex'
ServerName = "IIS_Server_Name"
Siteindex = Site_lndex_Value
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Siteindex) Response.Write Site.MaxClientsMessage
Создание нового сообщения о превышении числа подключений
Dim Site
Dim ServerName
Dim Siteindex
Dim MaxConnectionsString
ServerName = "IIS Server Name"
Siteindex = Site_Index_Value,
MaxConnectionsString =
"String_Passed_To_Client_When_Maximum_Connections_Reached"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Siteindex)
Site.MaxClientsMessage = MaxConnectionsString
Site.Setinfo
Просмотр локального пути корневого виртуального каталога FTP-узла
Dim VirtualDirectory
Dim ServerName
Dim Index
Dim RetVal
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/MSFTPSVC/" s Index
& "/ROOT")
RetVal = VirtualDirectory.Path
Response.Write RetVal
Модификация локального пути корневого виртуального каталога FTP-узла
Dim VirtualDirectory•
Dim ServerName
Dim Index
Dim NewVirtualDirPath
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
NewVirtualDirPath = "New_Path_for_Site"
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/MSFTPSVC/" s Index
& "/ROOT")
VirtualDirectory.Path = NewVirtualDirPath
VirtualDirectory.SetInfо
Просмотр удаленного пути корневого виртуального каталога FTP-узла и аутентификационной информации
Dim VirtualDirectory
Dim ServerName
Dim Index
Dim RetVal
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Index & "/ROOT")
Response.Write VirtualDirectory.Path s "<BR>"
Response.Write VirtualDirectory.UNCUserName s "<BR>"
Response.Write VirtualDirectory.UNCPassword
Модификация удаленного пути корневого виртуального каталога FTP-узла и аутентификационной информации
Dim VirtualDirectory
Dim ServerName
Dim Index
Dim NewVirtualDirPath
Dim NewVirtualDirUser
Dim NewVirtualDirPassword
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
NewVirtualDirPath = "New_Path_for_Site"
NewVirtualDirUser = "UNC_Credentials_Used_To_Establish_Connection" NewVirtualDirPassword = "UNC_Credentials_Used_To_Establish_Connection" Set VirtualDirectory = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Index & "/ROOT")
VirtualDirectory.Path = NewVirtualDirPath
VirtualDirectory.UNCUserName = NewVirtualDirUser
VirtualDirectory.UNCPassword = NewVirtualDirPassword
VirtualDirectory.Setinfo
Просмотр разрешений на доступ к каталогу и состояния журнала
Dim VirtualDirectory
Dim ServerName
Dim Index
Dim RetVal
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Index & "/ROOT")
Response.Write "Read:" & VirtualDirectory.AccessRead & "<BR>"
Response.Write "Write:" & VirtualDirectory.AccessWrite & "<BR>"
Response.Write "Logging Disabled: " & VirtualDirectory.DontLog
Установка разрешений на доступ к каталогу
и параметров журнала
Dim VirtualDirectory
Dim ServerName
Dim Index
Dim RetVal
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Index & "/ROOT")
VirtualDirectory.AccessRead = True
VirtualDirectory.AccessWrite = True
VirtualDirectory.DontLog = False
VirtualDirectory.Set Info
Просмотр стиля отображения списка содержимого каталога
Dim VirtualDirectory
Dim ServerName Dim Index
ServerName = "IIS_Server_Name";
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Index)
Response.Write VirtualDirectory.MSDOSDirOutput
Установка стиля отображения списка содержимого каталога
Dim VirtualDirectory
Dim ServerName Dim Index
ServerName = "IIS_Server_Name"
Index = Site_Index_Value
Set VirtualDirectory = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Index)
VirtualDirectory.MSDOSDirOutput = False
VirtualDirectory.Setinfo
Просмотр текущих ограничений адресов IP
Dim Site
Dim ServerName
Dim Siteindex
Dim IPSecurity
ServerName = "IIS_Server_Name"
Siteindex = Site_Index_Value
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Siteindex & "/ROOT")
Set IPSecurity = Site.IPSecurity
If IPSecurity.GrantByDefault Then
Response.Write "All addresses will be allowed, except as follows:" & "<BR>" For Each Entry In IPSecurity.IPDeny
If InStr(l, Entry, "255.255.255.255") Then
Response.Write "Denied IP: " & Replace(Entry, ", 255.255.255.255", "") & "<BR>"
Else
Response.Write "Denied Subnet: " & Entry & "<BR>" End If
Next
For Each Entry In IPSecurity.DomainDeny
Response.Write "Denied Domain: " & Entry & "<BR>" Next Else
Response.Write "All addresses will be blocked, except as follows:" & "<BR>" For Each Entry In IPSecurity.IPGrant
If InStrd, Entry, "255.255.255.255") Then
Response.Write "Allowed IP: " & Replace(Entry, ", 255.255.255.255", "") & "<BR>"
Else
Response.Write "Allowed Subnet: " & Entry & "<BR>" End If
Next.
For Each Entry In IPSecurity.DomainGrant'
Response.Write "Allowed Domain: " & Entry $ "<BR>"'•
Next End If
Установка новых ограничений адресов IP
Dim Site Dim ServerName Dim Siteindex Dim IPSecurity Dim IPAddress Dim IPSubnet Dim Domain'
Dim ActionType •
ServerName = "IIS_Server_Name" Siteindex = Site_Index_Value IPAddress = "xxx.xxx.xxx.xxx" IPSubnet = "xxx.xxx.xxx.xxx" Domain = "DNS_Domain.Name" ActionType = "GRANTIP" 'ActionType = "GRANTSUBNET" 'ActionType = "GRANTDOMAIN" 'ActionType = "DENYIP"•
'ActionType = "DENYSUBNET" 'ActionType = "DENYDOMAIN" Select Case ActionType
Case "GRANTIP"
Set Site = GetObject("IIS://" $ ServerName $ "/MSFTPSVC/" $ Siteindex 6 "/ROOT")
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False Site.IPSecurity = IPSecurity Site.Setinfo
IPSecurity.IPGrant = Array(IPAddress s ", 255.255.255.255") Site.IPSecurity = IPSecurity Site.Setlnfo
Case "GRANTSUBNET"
Set Site = GetObject("IIS://" $ ServerName s "/MSFTPSVC/" $ Siteindex s "/ROOT")
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False IPSecurity.IPGrant = Array(IPAddress $ ", " & IPSubnet) Site.IPSecurity = IPSecurity Site.Setlnfo Case "GRANTDOMAIN"
Set Site = GetObject("IIS://" & ServerName s "/MSFTPSVC/" & Siteindex & "/ROOT")
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = False IPSecurity.DomainGrant = Array(Domain) Site.IPSecurity = IPSecurity Site.Setlnfo Case "DENYIP"
Set Site = GetObject("IIS://" $ ServerName $ "/MSFTPSVC/" & Siteindex s "/ROOT")
Set IPSecurity = Site.IPSecurity IPSecurity.GrantByDefault = True IPSecurity.IPDeny = Array(IPAddress & ", 255.255.255.255")
Site.IPSecurity = IPSecurity
Site.Setinfo
Case "DENYSUBNET"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" s Siteindex & "/ROOT")
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = True
IPSecurity.IPDeny = Array(IPAddress & ", " & IPSubnet)
Site.IPSecurity = IPSecurity
Site.Setinfo
Case "DENYDOMAIN"
Set Site = GetObject("IIS://" & ServerName & "/MSFTPSVC/" & Siteindex & "/ROOT")
Set IPSecurity = Site.IPSecurity
IPSecurity.GrantByDefault = True
IPSecurity.DomainDeny = Array(Domain)
Site.IPSecurity = IPSecurity
Site.Setinfo
End Select
Глава 11. Код VBScript Active Server Page для управления инфраструктурами LDAP
Просмотр архитектуры существующего каталога LDAP
Dim Container
Dim Entry
Dim StartingPoint
'StartingPoint = "/ou=People"
Set Container = GetObject("LDAP://LDAP_SERVER/o=airius.com" & StartingPoint)
For Each Entry In Container
Response.Write "Entry Name: " & Entry.Name & "Class: " & Entry.Class & "<BR>" Next
Просмотр атрибутов записи с помощью ADSI, используя анонимный доступ в VBScript Active Server Page
On Error Resume Next
Dim Container
Dim User
Set Container = GetObject("LDAP://LDAP_SERVER/o=airius.com/ou=People") For Each User In Container
Response.Write "UserID: " & User.Get("uid") & "Common Name: " &
User.Get("cn") & "Surname: " & User.Get("sn") & "<BR>" Next
Просмотр атрибутов записи с помощью ADSI, используя разделяемый доступ в VBScript Active Server Page
On Error Resume Next
Dim dso■
Dim Container Dim User
Set dso = GetObject("LDAP:")
Set Container = dso.OpenDSObject("LDAP://LDAP_SERVER/o=airius.com/ou=People", "cn=Directory Manager", "l@undrym@tl974”, 0)
For Each User In Container
Response.Write "UserID: " & User.Get("uid") & "Common Name: " &
User.Get("on") & "Surname: " & User.Get("sn") & "<BR>" Next
Модификация атрибутов записи с помощью ADSI в VBScript Active Server Page
Dim dso
Dim Container
Dim User
Set dso = GetObject("LDAP:")
Set Container = dso.OpenDSObject("LDAP://LDAP_SERVER/o=airius.com/ou=People", "cn=Directory Manager", "l@undrym@tl974", 0)
Set User = Container.GetObject("inetorgperson", "uid=aknutson") User.Put "sn", "McNally"
User.Setinfo
Создание новой записи с помощью ADSI в VBScript
Active Server Page
Dim dso
Dim Container
Dim User
Set dso = GetObject("LDAP:").
Set Container = dso.OpenDSObject("LDAP://LDAP_SERVER/o=airius.com/ou=People", "cn=Directory Manager", "l@undrym@tl974", 0)
Set User = Container.Create("inetorgperson", "uid=teck")
User.Put "cn", "Thomas Eck"
User.Put "sn", "Eck"
User.Setinfo
Удаление записи с помощью ADSI в VBScript Active Server Page
Dim dso
Dim Container
Set dso = GetObject("LDAP:")
Set Container = dso.OpenDSObject("LDAP://LDAP_SERVER/o=airius.com/ou=People", "cn=Directory Manager", "l@undrym@tl974", 0)
Call Container.Delete("inetorgperson", "uid=teck")
Использование ADO для поиска в каталоге
Dim Connection Dim RS Dim Entry Dim Index'•
Index = 0 Set Connection = New ADODB.Connection Connection.Provider = "ADsDSOObject" Connection.Open "ADSI"
Set RS = Connection.Execute("SELECT cn,telephonenumber FROM 'LDAP://LDAP_SERVER/o=airius.com/ou=people' WHERE sn='carter'")
While Not RS.EOF For i = 0 To RS.Fields.Count - 1 If RS.Fields(i).Type = adVariant And Not (IsNull(RS.Fields(i).Value)) Then
For j = LBound(RS.Fields(i).Value) To UBound(RS.Fields(i).Value) Entry = Entry & RS.Fields(i).Value(j) & vbTab
Next j
Else'
Entry = Entry $ RS.Fields(i).Value & vbTab End If
If Index = RS.Fields.Count - 1 Then Response.write Entry $ "<BR>"
End If•
Index = Index + 1
Next i Entry = "" Index = 0 RS.MoveNext Wend
Создание нового почтового ящика Exchange
Dim ExchangeServerName
Dim ExchangeServerOrganization
Dim ExchangeServerSite Dim Mailbox
Dim MailboxParentContainer Dim MailboxRelativePath Dim MailboxDisplayName Dim MailboxFirstName Dim MailboxLastName"
Dim MailboxMiddlelnitial Dim MailboxAlias Dim MTA Dim MDB Dim MailboxSMTPAddress Dim MailboxX400Address Dim MailboxCCMailAddress Dim MailboxMSMailAddress Dim NTUserAccountToAssociate Dim UserDomain Dim SID Dim Security
Dim SecurityDescriptor Dim DiscretionaryACL
Dim AccessControlEntry
ExchangeServerName = "EXCHANGE_SERVER" ExchangeServerOrganization = "ADSITest" ExchangeServerSite = "Macmillan" MailboxRelativePath = ""
MailboxDisplayName = "Eck, Thomas E."
MailboxFirstName = "Thomas"
MailboxLastName = "Eck"
MailboxMiddlelnitial = "E" MailboxAlias = "Thomas.Eck" UserDomain = "UserDomain" NTUserAccountToAssociate = "teck"
MTA = "cn=Microsoft MTA,cn=" s ExchangeServerName &
",cn=Servers,cn=Configuration,ou=" & ExchangeServerSite s ",o=" s ExchangeServerOrganization
MDB = "cn=Microsoft Private MDB,cn=" & ExchangeServerName s
",cn=Servers,cn=Configuration, ou=" & ExchangeServerSite & ",o=" s ExchangeServerOrganization
MailboxSMTPAddress = MailboxAlias & "@" s ExchangeServerSite & "." & ExchangeServerOrganization & ".com"
MailboxX400Address = "c=US;a= ;p=" s ExchangeServerOrganization & ";o=" s ExchangeServerSite & ";s=" $ MailboxLastName s ";g=" & MailboxFirstName s ";i=" s eMailboxMiddlelnitial
MailboxCCMailAddress = MailboxLastName & ", " & MailboxFirstName & " at " & ExchangeServerSite
MailboxMSMailAddress = UCase(ExchangeServerOrganization & "/" & ExchangeServerSite & "/" & MailboxAlias)
Set MailboxParentContainer = GetObject("LDAP://" & ExchangeServerName s "/o=" & ExchangeServerOrganization & "/ou=" & ExchangeServerSite & "/cn=Recipients" & MailboxRelativePath)
Set Mailbox = MailboxParentContainer.Create("organizationalPerson", "cn=" & MailboxAlias)
Mailbox.Put "mailPreferenceOption", 0
Mailbox.Put "givenName", MailboxFirstName
Mailbox.Put "sn", MailboxLastName
Mailbox.Put "cn", MailboxDisplayName
Mailbox.Put "uid", MailboxAlias
MaiIbox.Put "Home-MTA", MTA Mailbox.Put "Home-MDB", MDB Mailbox.Put "mail", MailboxSMTPAddress Mailbox.Put "MAPI-Recipient", True Mailbox.Put "rfc822Mailbox", MailboxSMTPAddress:
Mailbox.Put "textEncodedORAddress", MailboxX400Address Mailbox.PutEx ADS_PROPERTY_APPEND, "otherMailbox", Array("CCMAILS" & MailboxCCMailAddress, "MSS" & MailboxMSMailAddress)
SID.SetAs ADS_SID_wlNNT_PATH, "WinNT://" & UserDomain & "/" & NTUserAccountToAssociate & ",user" sidHex = SID.GetAs(ADS_SID_HEXSTRING) Mailbox.Put "Assoc-NT-Account", sidHex Mailbox.Setinfo
Set SecurityDescriptor = Security.GetSecurityDescriptor(Mailbox.ADsPath) Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL AccessControlEntry.AceType - ADS_ACETYPE_ACCESS_ALLOWED AccessControlEntry.Trustee = UserDomain & "\" & MailboxAlias AccessControlEntry.AccessMask = ADS_RIGHT_EXCH_MAIL_SEND_AS Or
ADS_RIGHT_EXCH_MAIL_RECEIVE_AS Or ADS_RIGHT_EXCH_MODIFY_USER_ATT
DiscretionaryACL.AddAce AccessControlEntry
SecurityDescriptor.DiscretionaryACL = DiscretionaryACL
Security.SetSecurityDescriptor SecurityDescriptor
Удаление существующего почтового ящика Exchange
Dim ExchangeServerName
Dim ExchangeServerOrganization
Dim Exchangeserversite
Dim MailboxParentContainer
Dim MailboxRelativePath
Dim MailboxToRemove.
ExchangeServerName = "EXCHANGE_SERVER"
ExchangeServerOrganization = "ADSITest"
ExchangeServerSite = "Macmillan"
MailboxRelativePath = ""
MailboxToRemove = "Thomas.Eck"
Set MailboxParentContainer = GetObject("LDAP://" & ExchangeServerName & "/o=" & ExchangeServerOrganization & "/ou=" & ExchangeServerSite & "/cn=Recipients" & MailboxRelativePath)
Call MailboxParentContainer.Delete("organizationalPerson", "cn=" & MailboxToRemove)
Добавление члена списка рассылки
Dim ExchangeServerName
Dim ExchangeServerOrganization
Dim ExchangeServerSite
Dim DistributionList
Dim DistributionListName
Dim DistributionListRelativePath
Dim DLMemberMailboxName
ExchangeServerName = "EXCHANGE_SERVER"
ExchangeServerOrganization = "ADSITest"
ExchangeServerSite = "Macmillan"
DistributionListRelativePath = ""
DistributionListName = "DL_Research_Development"
DLMemberMailboxName = "Thomas.Eck".
Set DistributionList = GetObject("LDAP://" & ExchangeServerName & "/o=" & ExchangeServerOrganization & "/ou=" & ExchangeServerSite & "/cn=Recipients" & DistributionListRelativePath & "/cn=" & DistributionListName)
DistributionList.Add ("LDAP://" & ExchangeServerName & "/o=" & ExchangeServerOrganization & "/ou=" & ExchangeServerSite & "/cn=Recipients" & "/cn=" & DLMemberMailboxName)
DistributionList.Setinfo
Удаление члена списка рассылки
Dim ExchangeServerName
Dim ExchangeServerOrganization
Dim ExchangeServerSite
Dim DistributionList
Dim DistributionListName
Dim DistributionListRelativePath
Dim DLMemberMailboxName
"ExchangeServerName = "EXCHANGE_SERVER" ExchangeServerOrganization = "ADSITest" . ExchangeServerSite = "Macmillan" DistributionListRelativePath = "" DistributionListName = "DL_Engineering" DLMemberMailboxName = "Thomas.Eck"
Set DistributionList = GetObject("LDAP://" & ExchangeServerName & "/o=" s ExchangeServerOrganization & "/ou=" & ExchangeServerSite & "/cn=Recipients" & DistributionListRelativePath & "/cn=" & DistributionListName)
DistributionList.Remove ("LDAP://" & ExchangeServerName & "/o=" & ExchangeServerOrganization & "/ou=" & ExchangeServerSite & "/cn=Recipients" & "/cn=" & DLMemberMailboxName)
DistributionList.Setinfo
Определение владельца списка рассылки
Dim ExchangeServerName
Dim ExchangeServerOrganization
Dim ExchangeServerSite
Dim DistributionList
Dim DistributionListName
Dim DistributionListRelativePath
ExchangeServerName = "EXCHANGE_SERVER"
ExchangeServerOrganization = "ADSITest"
ExchangeServerSite = "Macmillan" DistributionListRelativePath = "" DistributionListName = "DL_Senior_Management"
Set DistributionList = GetObject("LDAP://" & ExchangeServerName & "/o=" & ExchangeServerOrganization & "/ou=" & ExchangeServerSite & "/cn=Recipients" s DistributionListRelativePath & "/cn=" & DistributionListName)
Response.Write DistributionList.Owner
Глава 12. Код VBScript Active Server Page для управления Windows 2000 Active Directory
Связывание корневой записи DS (RootDSE)
Dim RootDSE
Set RootDSE = GetObject("LDAP://RootDSE")
Response.Write "Current Time: " & RootDSE.Get("CurrentTime") & "<BR>"
Response.Write "SubSchemaSubEntry: " & RootDSE.Get("SubSchemaSubEntry") & "<BR>"
Response.Write "DsServiceName: " & RootDSE.Get("DsServiceName") & "<BR>"
For Each Item In RootDSE.Get("NamingContexts") Response.Write "Naming Context: " & Item & "<BR>" Next
Response.Write "Default Naming Context: " &
RootDSE.Get("DefaultNamingContext") & "<BR>"
Response.Write "Schema Naming Context: " & RootDSE.Get("SchemaNamingContext") & "<BR>"
Response.Write "Configuration Naming Context: " & RootDSE.Get ("Conf igurationNamingContext") & "<BR>"
Response.Write "Root Domain Naming Context: " & Root
DSE.Get ("RootDomainNamingContext") & "<BR>"
For Each Item In RootDSE.Get("SupportedControl") Response.Write "Supported Control: " & Item & "<BR>"
Nexti
For Each'Item In RootDSE.GetfSupportedLDAPVersion") Response.Write "Supported LDAP Version: " & Item & "<BR>"
Next
Response.Write "Highest Committed USN: " & RootDSE.Get("HighestCommittedUSN") & "<BR>"
For Each Item In RootDSE.Get("SupportedSASLMechanisms") Response.Write "Supported SASL Mechanism: " & Item & "<BR>" Next
Response.Write "DNS Host Name: " & RootDSE.Get("DnsHostName") & "<BR>"
Response.Write "LDAP Service Name: " & RootDSE.Get("LdapServiceName") & "<BR>"
Response.Write "Server Name: " & RootDSE.Get("ServerName") & "<BR>"
Использование в VBScript Active Server Page атрибута DefaultNamingContext RootDSE для связывания объекта Active Directory с помощью текущих аутентификационных параметров
Dim DefaultDomain
Dim RootDSE
Set RootDSE = GetObject("LDAP://RootDSE")
Set DefaultDomain = GetObject("LDAP://" &
RootDSE.Get("DefaultNamingContext"))
Связывание объекта Active Directory с помощью альтернативной аутентификации
Dim DSO
Dim Obj
Dim Ads Path
Dim AlternateUser_UPN Dim AlternateUser_Password
AdsPath =
"LDAP://Server_Name.ResearchDevelopment.TestInfra/cn=Users, dc=ResearchDevelop ment,dc=TestInfra"
AlternateUser_UPN = "thomas.eck@ResearchDevelopment.Testlnfra" AlternateUser_Password = "P011tlc@l@rs0ni$t"
Set DSO = GetObjectfLDAP:")-
Set Obj = DSO.OpenDSObject(AdsPath, AlternateUser_UPN, AlternateUser_Password, ADS_SECURE_AUTHENTICATION)
Отображение атрибутов объекта, реплицируемых в общий каталог
Dim Connection Dim RS Dim Entry Dim Index Dim RootDSE Dim Schemacontainer
Index = 0 Set Connection = New ADODB.Connection Connection.Provider = "ADsDSOObject" Connection.Open "ADSI"
Set RootDSE = GetObject("LDAP://RootDSE") Set Schemacontainer = GetObjectfLDAP://" & RootDSE.Get("SchemaNamingContext"))
Set RS = Connection.Execute("SELECT cn FROM '" S Schemacontainer.AdsPath s ’" where isMemberOfPartialAttributeSet = TRUE AND objectcategory = 'attributeschema1")
While Not RS.EOF
For i = 0 To RS.Fields.Count - 1
If RS.Fields(i).Type = adVariant And Not (IsNull(RS.Fields(i).Value)) Then
For j = LBound(RS.Fields(i).Value) To UBound(RS.Fields(i).Value) Entry = Entry & RS.Fields(i).Value(j) & vbTab
Next j Else
Entry = Entry & RS.Fields(i).Value S vbTab End If
If Index = RS.Fields.Count - 1 Then Response.Write Entry & "<BR>" End If Index = Index + 1 Next i Entry = "" Index = 0 RS.MoveNext Wend
Отображение всех объектов пользователей в Active Directory
Dim RootDSE
Dim UserContainer
Dim User
Dim RelativePathFromDomainToUserContainer
RelativePathFromDomainToUserContainer = "ou=user accounts,"
Set RootDSE = GetObjeCt("LDAP://RootDSE")
Set UserContainer = GetObject("LDAP://" & RelativePathFromDomainToUserCon- tainer & RootDSE.Get("DefaultNamingContext"))
UserContainer.Filter = Array("User")
For Each User In UserContainer
Response.Write User.AdsPath & "<BR>"
Next
Отображение всех объектов групп в Active Directory
Dim RootDSE
Dim GroupContainer
Dim Group
Dim RelativePathFromDomainToGroupContainer
RelativePathFromDomainToGroupContainer = "ou=Groups,ou=Chicago,"
Set RootDSE = GetObject("LDAP://RootDSE")
Set GroupContainer = GetObject("LDAP://" & RelativePathFromDomainToGroupCon- tainer & RootDSE.Get("defaultNamingContext"))
GroupContainer.Filter = Array("Group")
For Each Group In GroupContainer
Response.Write Group.AdsPath & "<BR>"
Next
Отображение всех объектов компьютеров в Active Directory
Dim RootDSE
Dim ComputerAccountContainer
Dim ComputerAccount
Dim RelativePathFromDomainToComputerContainer
RelativePathFromDomainToComputerContainer = "ou=Workstations,ou=Computer Accounts, ou=Chicago"
Set RootDSE = GetObject("LDAP://RootDSE")
Set ComputerAccountContainer = GetObject("LDAP://" & RelativePathFromDomain- ToComputerContainer & RootDSE.Get("defaultNamingContext"))
ComputerAccountContainer.Filter = Array("Computer")
For Each ComputerAccount in ComputerAccountContainer
Response.Write ComputerAccount.AdsPath & "<BR>"
Next
Создание объектов в Active Directory
Dim RootDSE
Dim Container
Dim RelativePathToObject
Dim Objectclass
Dim ObjectName
Dim NewObject
Dim MandatoryPropertyl_Name
Dim MandatoryPropertyl_Value
'Определите другие необходимые обязательные свойства
RelativePathToObject = "ou=administrators,"
Objectclass = "user"
ObjectRelativeName = "cn=TestAdmin"(
MandatoryPropertyl_Name = "SAMAccountName"
MandatoryPropertyl_Value = "TestAdmin"
'Значения дополнительных свойств, присвойте здесь
Set RootDSE = GetObject("LDAP://RootDSE")
Set Container = GetObject("LDAP://" & RelativePathToObject & Root
DSE. Get ("def aultNamingContext") )'
Set NewObject = Container.Create(Objectclass, ObjectRelativeName)
NewObject.Put MandatoryPropertyl_Name, MandatoryPropertyl_Value 'Назначьте дополнительные свойства объекту здесь
NewObject.Setinfo
Отображение классов и ассоциированных с ними обязательных атрибутов
Dim RootDSE
Dim ObjectName
Dim Objectclass
Dim RelativePath
Dim Obj
Dim Mandatoryproperty
RelativePath = "cn=System,"
Set RootDSE = GetObject("LDAP://RootDSE")
ADsPath = "LDAP://" s RelativePath & RootDSE.Get("DefaultNamingContext")
Set ObjectName = GetObject (ADsPath)
Response.Write "Object Name: " s ObjectName.Name & "<BR>" Response.Write "Object Class: " & ObjectName.Class & "<BR>" Set Objectclass = GetObject(ObjectName.Schema)
For Each Mandatoryproperty In Objectclass.Mandatoryproperties Response.Write Mandatoryproperty & "<BR>"
Next
Удаление объектов из Active Directory
Dim RootDSE
Dim Container
Dim RelativePathToObject
Dim Objectclass
Dim ObjectName
RelativePathToObject = "ou=administrators, "
Objectclass = "user"
ObjectRelativeName = "cn=TestAdmin"
Set RootDSE = GetObject("LDAP://RootDSE")
Set Container = GetObject("LDAP://" & RelativePathToObject & Root
DSE.Get ("DefaultNamingContext"))
Call Container.Delete(Objectclass, ObjectRelativeName)
Удаление всей ветви дерева каталога
Dim RootDSE
Dim Container
Dim RelativePathToObject
RelativePathToObject = "ou=Print Queues,"
Set RootDSE = GetObject("LDAP://RootDSE")
Set Container = GetObject("LDAP://" & RelativePathToObject & Root
DSE .Get("DefaultNamingContext"))
Container.DeleteObject (0)
Переименование объектов в Active Directory .
Dim Container
Dim NewObjectName
Set Container = GetObject("LDAP://ou=Admins,dc=eCommerce2000,dc=com")
Set NewObjectName = Con
tainer.MoveHere ("LDAP://cn=Administrator,ou=Admins,dc=eCommerce2000,dc=com"," cn=DMZAdmin")
Перемещение объектов по дереву
Dim Container '
Dim NewObjectName
Set Container = GetObject("LDAP://ou=Users,dc=eCommerce2000,dc=com")
Set NewObjectName = Con
tainer .MoveHere ("LDAP://cn=DMZAdmin, ou=Admins,dc=eCommerce2000,dc=com","cn=DM
ZAdmin"),
Перечисление записей АСЕ в списке ACL Active Directory
Dim Obj
Dim ACE
Dim DiscretionaryACL
Dim SecurityDescriptor
Dim ObjectDistinguishedName
ObjectDistinguishedName = "ou=Admins, dc=eCommerce2000,dc=com"
Set Obj = GetObject("LDAP://" & ObjectDistinguishedName)
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DiscretionaryACL = SecurityDescriptor.DiscretionaryACL
For Each ACE In DiscretionaryACL
Response.Write ACE.Trustee & "<BR>"
If (ACE.AccessMask And ADS_RIGHT_DELETE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Response.Write "ADS_RIGHT_DELETE" & "<BR>" Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_DELETE for SchemalDGuid: " 4 ACE.ObjectType 4 "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_DELETE for SchemalDGuid: " 4
ACE.InheritedObjectType 4 "<BR>" End If End If
End If
If (ACE.AccessMask And ADS_RIGHT_READ_CONTROL) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Response.Write "ADS_RIGHT_READ_CONTROL" 4 "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_READ_CONTROL for SchemalDGuid: " 4 ACE.ObjectType 4 "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_READ_CONTROL for SchemalDGuid: "4 ACE.InheritedObjectType 4 "<BR>"
End If End If End If
If (ACE.AccessMask And ADS_RIGHT_WRITE_DAC) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Response.Write "ADS_RIGHT_WRITE_DAC" 4 "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_WRITE_DAC for SchemalDGuid: " 4 ACE.ObjectType 4 "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_WRITE_DAC for SchemalDGuid: " & ACE.InheritedObjectType 4 "<BR>" End If
End If End If
If (ACE.AccessMask And ADS_RIGHT_WRITE_OWNER) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Response.Write "ADS_RIGHT_WRITE_OWNER" 4 "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_WRITE_OWNER for SchemalDGuid: " 4 ACE.ObjectType 4 "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_WRITE_OWNER for SchemalDGuid: " 4 ACE.InheritedObjectType 4 "<BR>"
End If End If End If
If (ACE.AccessMask And ADS_RIGHT_SYNCHRONIZE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Response.Write "ADS_RIGHT_SYNCHRONIZE" 4 "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_SYNCHRONIZE for SchemalDGuid: " 4 ACE.ObjectType 4 "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_SYNCHRONIZE for SchemalDGuid: " & ACE.InheritedObjectType & "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_ACCESS_SYSTEM_SECURITY) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Response.Write "ADS_RIGHT_ACCESS_SYSTEM_SECURITY" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_ACCESS_SYSTEM_SECURITY for SchemalDGuid: "
& ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_ACCESS_SYSTEM_SECURITY for SchemalDGuid: " & ACE.InheritedObjectType & "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_GENERIC_READ) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Response.Write "ADS_RIGHT_GENERIC_READ" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_GENERIC_READ for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_GENERIC_READ for SchemalDGuid: "
& ACE.InheritedObjectType & "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_GENERIC_WRITE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Response.Write "ADS_RIGHT_GENERIC_WRITE" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_GENERIC_WRITE for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_GENERIC_WRITE for SchemalDGuid: " & ACE.InheritedObjectType & "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_GENERIC_EXECUTE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Response.Write "ADS_RIGHT_GENERIC_EXECUTE" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_GENERIC_EXECUTE for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_GENERIC_EXECUTE for SchemalDGuid: " & ACE.InheritedObjectType & "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_GENERIC_ALL) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Response.Write "ADS_RIGHT_GENERIC_ALL" & "<BR>"
Else
If ACE.InheritedObjectType = ”" Then
Response.Write "ADS_RIGHT_GENERIC_ALL for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_GENERIC_ALL for SchemalDGuid: " & ACE.InheritedObjectType & "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_CREATE_CHILD) <> 0 Then
If (ACE.ObjecfType = "" And ACE. InheritedObjectType = "") Then
Response.Write "ADS_RIGHT_DS_CREATE_CHILD" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_DS_CREATE_CHILD for SchemalDGuid: " &
ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_DS_CREATE_CHILD for SchemalDGuid: " 4 ACE.InheritedObjectType 4 "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_DELETE_CHILD) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Response.Write "ADS_RIGHT_DS_DELETE_CHILD" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_DS_DELETE_CHILD for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_DS_DELETE_CHILD for SchemalDGuid: " 4 ACE.InheritedObjectType & "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_ACTRL_DS_LIST) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Response.Write "ADS_RIGHT_ACTRL_DS_LIST" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_ACTRL_DS_LIST for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_ACTRL_DS_LIST for SchemalDGuid: " & ACE.InheritedObjectType & "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_SELF) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Response.Write "ADS_RIGHT_DS_SELF" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_DS_SELF for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_DS_SELF for SchemalDGuid: " & ACE.InheritedObjectType & "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_READ_PROP) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Response.Write "ADS_RIGHT_DS_READ_PROP" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_DS_READ_PROP for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_DS_READ_PROP for SchemalDGuid: "& ACE.InheritedObjectType s "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_WRITE_PROP) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Response.Write "ADS_RIGHT_DS_WRITE_PROP" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_DS_WRITE_PROP for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_DS_WRITE_PROP for SchemalDGuid: " & ACE.InheritedObjectType & "<BR>" End If
End if
End If
If (ACE.AccessMask And ADS_RIGHT_DS_DELETE_TREE) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Response.Write "ADS_RIGHT_DS_DELETE_TREE" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_DS_DELETE_TREE for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_DS_DELETE_TREE for SchemalDGuid: " & ACE.InheritedObjectType & "<BR>"
End If
End If
End If
If (ACE.AccessMask And ADS_RIGHT_DS_LIST_OBJECT) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then Response.Write "ADS_RIGHT_DS_LIST_OBJECT" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_DS_LIST_OBJECT for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_DS_LIST_OBJECT for SchemalDGuid: " & ACE.InheritedObjectType & "<BR>"
End If
End Ifi.
End If
If (ACE.AccessMask And ADS_RIGHT_DS_CONTROL_ACCESS) <> 0 Then
If (ACE.ObjectType = "" And ACE.InheritedObjectType = "") Then
Response.Write "ADS_RIGHT_DS_CONTROL_ACCESS" & "<BR>"
Else
If ACE.InheritedObjectType = "" Then
Response.Write "ADS_RIGHT_DS_CONTROL_ACCESS for SchemalDGuid: " & ACE.ObjectType & "<BR>"
Else
Response.Write "Inherited ADS_RIGHT_DS_CONTROL_ACCESS for SchemalDGuid: " & ACE.InheritedObjectType & "<BR>"
End If
End If
End If
Next
Добавление АСЕ к списку ACL Active Directory
Dim Obj
Dim SecurityDescriptor
Dim ACE
Dim DACL
Set Obj = GetObject ("LDAP://ou=ou=Admins,dc=eCorranerce2000,dc=com")
Set«SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject("AccessControlEntry")
ACE.AccessMask = ADS_RIGHT_DELETE Or ADS_RIGHT_GENERIC_READ Or
ADS_RIGHT_GENERIC_WRITE
ACE.AceFlags = ADS_ACEFLAG_NO_PROPAGATE_INHERIT_ACE
ACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED
ACE.Trustee = "eCommerce2000\DMZAdmin"
DACL.AddAce АСЁ
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor)
Obj.Setinfo
Удаление АСЕ из списка ACL Active Directory
Dim Obj
Dim ACE
Dim DACL
Dim SecurityDescriptor
Set Obj = GetObject("LDAP://cn=Guest,ou=users, dc=eCommerce2000,dc=com")
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
For Each ACE In DACL
If UCase(ACE.Trustee) = "EC0MMERCE2000\GUEST" Then
DACL.RemoveAce ACE
End If•
Next•
SecurityDescriptor.DiscretionaryACL = DACL
Obj. Put "ntSecurityDescriptor", Array(SecurityDescriptor) Obj.Setinfo
Добавление АСЕ к списку ACL контейнера OU Active Directory с наследованием всех дочерних объектов Dim Obj
Dim SecurityDescriptor
Dim ACE Dim DACL
Set Obj = GetObject("LDAP://ou=Admins,dc=eCommerce2000,dc=com")
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject("AccessControlEntry")
ACE.AccessMask = ADS_RIGHT_GENERIC_READ
ACE.AceFlags = ADS_ACEFLAG_INHERIT_ACE
ACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED
ACE.Trustee = "eCommerce2000\DMZAdmin" DACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor) Obj.Setinfo
Добавление АСЕ к списку ACL контейнера OU Active Directory с наследованием отдельного класса дочерних объектов
Dim Obj
Dim SecurityDescriptor
Dim ACE
Dim DACL
Set Obj = GetObject("LDAP://ou=Admins,dc=eCommerce2000,dc=com")
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
Set ACE = CreateObject("AccessControlEntry")
ACE.AccessMask = ADS_RIGHT_DS_DELETE_TREE
ACE.AceFlags = ADS_ACEFLAG_INHERIT_ACE
ACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
ACE.Flags = ADS_FLAG_OBJECT_TYPE_PRESENT
ACE.ObjectType = "(BF967A9C-0DE6-11D0-A285-00AA003049E2}"
ACE.Trustee = "eCommerce2000\DMZAdmin"
DACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor)
Obj.Setinfo
Удаление АСЕ из списка ACL контейнера OU Active Directory с наследованием отдельного класса дочерних объектов
Dim Obj
Dim АСЕ
Dim DACL
Dim SecurityDescriptor
Set Obj = GetObject("LDAP://ou=Admins,dc=eCommerce2000,dc=com")
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = SecurityDescriptor.DiscretionaryACL
For Each ACE In DACL'
If ((UCase(ACE.Trustee) = "ECOMMERCE2000\DMZADMIN") and (ACE.ObjectType = "{BF967A9C-0DE6-11D0-A285-00AA003049E2}")) Then
DACL.RemoveAce ACE
End If
Next
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor)
Obj.Set Infо.
Добавление АСЕ к списку ACL контейнера ои Active Directory с наследованием отдельного свойства класса объектов
Dim Obj-
Dim SecurityDescriptor
Dim ACE Dim DACL
Set Obj = GetObject("LDAP://ou=Admins,dc=eCommerce2000,dc=com")
Set SecurityDescriptor = Obj.Get("ntSecurityDescriptor")
Set DACL = 5есиг1Гу0ёзсг1рГог.DiscretionaryACL "
Set ACE = CreateObject("AccessControlEntry")
ACE-AccessMask = ADS_RIGHT_DS_READ_PROP Or ADS_RIGHT_DS_WRITE_PROP
ACE.AceFlags = ADS_ACEFLAG_INHERIT_ACE
ACE.AceType = ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
ACE.ObjectType = "(BF967A49-0DE6-11D0-A285-00AA003049E2}"
ACE.Trustее = "NT AUTHORITY\SELF" DACL.AddAce ACE
SecurityDescriptor.DiscretionaryACL = DACL
Obj.Put "ntSecurityDescriptor", Array(SecurityDescriptor) Obj.Setinfo
Б
Справочник по программированию ADSI 2.5
Следует сразу же отметить, что приведенных данных вполне достаточно для решения часто встречающихся проблем. В этом приложении описывается модель объектов, предоставляемая наиболее важными интерфейсами ADSL
Для каждого интерфейса приводится его описание, поддерживаемый провайдер, информация о свойствах только для чтения, синтаксис использования каждого метода и тип данных, возвращаемый наиболее часто используемым свойством и методом в модели объектов ADSL Кроме этого, для каждого интерфейса приведены значения необходимых флагов и констант.
Интерфейс AccessControlEntry
AccessControlEntry::AccessMask
ОписаниеОпределяет разрешения доступа
Поддерживаемый провайдерLDAP
Тип данныхLong
Только для чтенияНет
Значения флага AccessControlEntry: :AccessMask
Флаг
Значение
ADS_RIGHT_DS_CREATE_CHILD
0x1
ADS_RIGHT_DS_DELETE_CHILD
0x2
ADS_RIGHT_ACTRL_DS_LIST
0x4
ADS_RIGHT_DS_SELF■
0x8
ADS_RIGHT_DS_READ_PROP
0x10
ADS_RIGHT_DS_WRITE_PROP
0x20
ADS_RIGHT_DS_DELETE_TREE
0x40
ADS_RIGHT_DS_LIST_OBJECT
0x80
ADS_RIGHT_DS_CONTROL_ACCESS
0x100
ADS_RIGHT_DELETE
0x10000
ADS_RIGHT_READ_CONTROL
0x20000
ADS_RIGHT_WRITE_DAC
0x40000
Флаг
Значение
ADS_RIGHT_WRITE_OWNER ADS_RIGHT_SYNCHRONIZE ADS_RIGHT_ACCESS_SYSTEM_SECURITY ADS_RIGHT_GENERIC_ALL ADS_RIGHT_GENERIC_EXECUTE ADS_RIGHT_GENERIC_WRITE ADS_RIGHT_GENERIC_READ
0x80000
0x100000
0x1000000
0x10000000
0x20000000
0x40000000
0x80000000
AccessControlEntry::AceFlags
ОписаниеУказывает, какая запись АСЕ наследует или оп
ределяет тот или иной тип объекта
Поддерживаемый провайдерLDAP
Тип данныхLong
Только для чтенияНет
Значения флага AccessControlEntry: :AceFlags
Флаг
Значение
ADS_ACEFLAG_INHERIT_ACE
0x2
ADS_ACEFLAG_NO_PROPAGATE_INHER1T_ACE
0x4
ADS_ACEFLAG_INHERIT_ONLY_ACE
0x8
ADS_ACEFLAG_INHERITED_ACE
0x10
ADS_ACEFLAG_VALID_INHERIT_FLAGS
Oxlf
ADS_ACE FLAG_S UCCE SS FUL_ACCE S S
0x40
ADS_ACE FLAG_FAILED_ACCE SS
0x80
AccessControlEntry::AceType
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Указывает тип АСЕ
LDAP
Long
Нет
Значения флага AccessControlEntry:
:AceType
Флаг
Значение
ADS_ACETYPE_ACCESS_ALLOWED
0
ADS_ACETYPE_ACCESS_DENIED
0x1
ADS_ACETYPE_SYSTEM_AUDIT
0x2
ADS_ACETYPE_ACCESS_ALLOWED_OBJECT
0x5
ADS_ACETYPE_ACCESS_DENIED_OBJECT
0x6
ADS_ACETYPE_SYSTEM_AUDIT_OBJECT
0x7
AccessControlEntry::Flags'
ОписаниеУказывает использование наследованного или явно
определенного типа объекта
Поддерживаемый провайдерLDAP
Тип данныхLong
Только для чтенияНет
Значения флага AccessControlEntry: :Flags
ФлагЗначение
ADS_FLAG_OBJECT_TYPE_PRESENT0x1
ADS_FLAG_INHERITED_OBJECT_TYPE_PRESENT0x2
AccessControlEntry::InheritedObjectType
ОписаниеОписаниеПоддерживаемый провайдерТип данныхТолько для чтенияПоддерживаемый провайдерТип данныхТолько для чтенияПараметр GUID, представляюший значение sche- malDGuid для класса объекта. Это значение используется для ограничения области видимости АСЕ выбранным классом объектов. В данном случае ограничение наследуется из родительского контейнера
Описание
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP.
String
Нет
AccessControlEntry::ObjectType
Описание
Параметр GUID, представляюший значение schemalDGuid для класса объекта. Это значение используется для ограничения области видимости АСЕ выбранным классом объектов
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
Примечание
Для просмотра значения параметра schemalDGuid любого объекта, определенного в контейнере схемы, используйте следующий код Visual Basic:
Private Type GUID
Data(15) As Byte
End Type
Public Function GetSchemalDGuid(ByVai Objectclass As String) As String Dim RootDSE As IADs
Dim SchemalDGuidObject As IADs
Dim ADsPath As String ■
Dim IGuid As GUID
Dim GetGUID As String
Dim i As Byte
Dim Element As Variant
Dim GUIDStringl As String
Dim GUIDString2 As String
Dim GUIDString3 As String
Dim GUIDString4 As String
Dim GUIDString5 As String
Set RootDSE = GetObject("LDAP://RootDSE")
ADsPath = "LDAP://CN=" & Objectclass & "," & Root
DSE .Get("SchemaNamingContext")
Set SchemalDGuidObject = GetObject(ADsPath) i = 0
For Each Element In SchemalDGuidObject.Get("SchemalDGuid") IGuid.Data(i) = Element i = i + 1
Next
For i = 0 To 3
If (IGuid.Data(3 - i) < 16) Then
GUIDStringl = GUIDStringl & "0"
End If
GUIDStringl = GUIDStringl & Hex(IGuid.Data(3 - i))
Next i
For i = 0 To 1
If (IGuid. Data (5 - i) < 16) Then
GUIDStringl = GUIDString2 & "0"
End If
GUIDStringl = GUIDString2 & Hex(IGuid.Data(5 - i) )
Next i
For i = 0 To 1
If (IGuid.Data(7 - i) < 16) Then
GUIDString3 = GUIDString3 & "0"
End If
GUIDString3 = GUIDString3 & Hex(IGuid.Data(7 - i))
Next i
For i = 0 To 1
If (IGuid.Data(8 + i) < 16) Then
GUIDString4 = GUIDString4 & "0"
End If
GUIDString4 = GUIDString4 & Hex(IGuid.Data(8 + i))
Next i
For i = 0 To 5
If (IGuid.Data(10 + i) < 16) Then
GUIDString5 = GUlDString5 & "0"
End If
GUIDString5 = GUIDString5 & Hex(IGuid.Data(10 + i))
Next i
GetSchemalDGuid = "{" & GUIDStringl & "-" & GUIDString2 & "-" & GUIDString3 & "-" & GUIDString4 & "-" & GUIDStringS & "}"
End Function
Поместив приведенную процедуру в проект и передавая находящиеся в контейнере схемы имя любого класса объекта или атрибут, можно возвращать соответствующим образом отформатированную строку schemalDGuid.
AccessControlEntry::Trustee
ОписаниеАссоциирует эту запись АСЕ с объектом в каталоге
Поддерживаемый провайдерLDAP
Тип данныхstring
Только для чтенияНет
Примечание
Доверители могут быть определены в записи контроля доступа с помощью строки следующего формата: DOMAIN\Trustee_Object. Например, для добавления доверителя NBURN в домен CRASH используйте сроку CRASH\NBURN.
Можно также передать имя доверителя в виде идентификатора безопасности (SID), группы или характерного имени объекта.
Интерфейс AccessControlList
AccessControlList::AceCount
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Определяет число записей АСЕ в списке ACL
LDAP
Long
Нет
AccessControlList::AclRevision
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Определяет номер версии списка ACL
LDAP
Long
Нет
AccessControlList::AddAce
Описание
Добавляет запись контроля доступа объекта к списку ACL
Поддерживаемый провайдер Синтаксис
Тип данных
ldap
AddAce(AccessControlEntry As Object)
Нет
AccessControlList::CopyAccessList
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Копирует список ACL в другое местоположение LDAP
CopyAccessList()
Object.
AccessControlList::RemoveAce
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Удаляет запись контроля доступа из списка ACL LDAP
RemoveAce(AccessControlEntry As Object)
Нет
Интерфейс iads
IADs::ADsPath
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
IADs::Class
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
IADs::Get
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
IADs::GetEx
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
IADs::Getlnfо
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
IADs::GetlnfоЕх
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Возвращает характерное имя связанного объекта
LDAP, WinNT
String
Да
Возвращает определение класса связанного объекта
LDAP, WinNT
String
Да
Возвращает значение из пространства имен на основе имени
LDAP, WinNT
Get(Name As String)
Variant
Возвращает единичное значение из многозначного атрибута
LDAP, WinNT
GetEx(Name As String)
Variant
Загружает все значения свойства в кэш
LDAP, WinNT
Getlnfо()
Нет
Загружает определенные свойства в кэш
LDAP, WinNT
GetlnfoEx(Properties As Variant, Reserved as Long)
Нет
IADs::GUID
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
IADs::Name
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
IADs::Parent
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
IADs::Put
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
IADs::PutEx
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
IADs::Schema
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
IADs::Setinfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Возвращает значение GLJID связанного объекта
LDAP, WinNT
String
Да
Возвращает относительное имя связанного объекта
LDAP, WinNT
String
Да
Возвращает значение ADsPath родительского объекта
LDAP, WinNT
String
Да
Позволяет заполнить единичный атрибут на основе имени
LDAP, WinNT
Put(Name As String, Property As Variant)
Нет
Позволяет заполнить многозначное свойство на основе имени
LDAP, WinNT
PutEx(Controlcode As Long, Name As String, Property As Variant)
Нет
Возвращает значение ADsPath схемы класса для связанного объекта
LDAP, WinNT
String
Да
Записывает текущие значения свойств из кэша в каталог
LDAP, WinNT
Setinfo()
Нет
Интерфейс lADsCollection
lADsCollection::Add
ОписаниеДобавляет элемент в коллекцию
Поддерживаемый провайдер Не поддерживается провайдером WinNT
СинтаксисAdd(Name As String, Item As Variant)
Тип данныхНет
lADsCollection::GetObject
ОписаниеВозвращает элемент коллекции
Поддерживаемый провайдерWinNT
СинтаксисGetObject(NameAsString)
Тип данныхVariant
lADsCollection::Remove
ОписаниеУдаляет элементиз коллекции
Поддерживаемый провайдерWinNT
СинтаксисRemove(ItemToRemoved As String)
Тип данныхНет
Интерфейс TADsComputer
TADsComputer::ADsPath
ОписаниеВозвращает характерное имя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
TADsComputer::Class
ОписаниеВозвращаетопределениеклассаобъекта связанного
объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
TADsComputer::ComputerID
ОписаниеВозвращаетзначениеGU1D,используемое для
идентификации связанного компьютера
Поддерживаемый провайдер Не поддерживается провайдером WinNT
Тип данныхString
Только для чтенияДа
LADsComputer: : Department
Описание
Возвращает отдел (или манипулирует им) для связанного объекта-компьютера
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдером WinNT
String
Нет
LADsComputer::Description
Описание
Текстовое поле для описания связанного объекта- компьютера
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Нет
LADsComputer::Division
Описание
Текстовое поле для описания подразделения, ассоциированного со связанным объектом-компьютером
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдером WinNT
String
Нет
lADsComputer::Get
Описание
Возвращает значение из пространства имен на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT
Get(Name As String)
Variant
lADsComputer::GetEx
Описание
Возвращает единичное значение из многозначного атрибута
Поддерживаемый провайдер
Синтаксис
Тип данных
WinNT
GetEx(Name As String)
Variant
LADsComputer::GetInfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Загружает все значения свойства в кэш
WinNT
Getlnfo()
Нет
494
Часть V. Приложения
lADsComputer::GetlnfoEx
Описание Поддерживаемый провайдер Синтаксис
Загружает определенные свойства в кэш
WinNT
GetlnfoEx(Properties As Variant, Reserved As Long)
Тип данных
Нет
lADsComputer::GUID
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение GU1D связанного объекта
WinNT
String
Да
lADsComputer::Location
Описание
Текстовое поле, используемое для ассоциации физического расположения связанного объекта-компьютера
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдером WinNT
String
Нет
lADsComputer::MemorySize
Описание
Указывает объем оперативной памяти, установленный в системе
Поддерживаемый провайдер Тип данных
Только для чтения
Не поддерживается провайдером WinNT
String
Нет
lADsComputer::Model
Описание
Описывает производителя и модель связанного объекта-компьютера
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдером WinNT
String
Нет
lADsComputer::Name
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает относительное имя связанного объекта
WinNT
String
Да
lADsComputer::NetAddresses
Описание
Предоставляет информацию о связи для объекта- компьютера
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдером WinNT
Variant
Нет
lADsComputer::OperatingSystem
Описание
Описывает операционную систему, используемую на связанном объекте-компьютере
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Нет
lADsComputer::OperatingSystemVersion
Описание
Описывает версию операционной системы, используемой на связанном объекте-компьютере
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Нет
lADsComputer::Owner
Описание
Указывает имя лицензированного пользователя связанного объекта-компьютера
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Нет
lADsComputer::Parent
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение ADsPath родительского объекта
WinNT
String
Да
lADsComputer::PrimaryUser
Описание
Описывает основного пользователя связанного объекта-компьютера
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдером WinNT
String
Нет
lADsComputer::Processor
Описание
Указывает тип процессора, используемого в связанном объе кте - комп ьютере
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Нет
IADsСотриter::ProcessorCount
ОписаниеУказывает используемый HAL в связанном объекте-
компьютере или число установленных процессоров на компьютерах под управлением операционных систем, отличных от Windows NT/2000
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияНет
lADsComputer::Put
ОписаниеПозволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер WinNT СинтаксисPut(Name As String, Property As Variant)
Тип данныхНет
lADsComputer::PutEx
ОписаниеПозволяет заполнить многозначное свойство на осно
ве имени
Поддерживаемый провайдер WinNT
СинтаксисPutEx(Controlcode As Long, Name As String,
Property As Variant)
Тип данныхНет'
lADsComputer::Role
ОписаниеОписывает роль компьютера (рабочая станция или
сервер)
Поддерживаемый провайдер Не поддерживается провайдером WinNT
Тип данныхString
Только для чтенияНет
lADsComputer::Schema
ОписаниеВозвращаетзначениеADsPathсхемы класса объекта
для связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsComputer::Setinfo
ОписаниеЗаписывает текущие значения свойств из кэша в каталог
Поддерживаемый провайдер WinNT СинтаксисSetinfo ()
Тип данныхНет■
ZADsComputer::Site
Описание
Возвращает значение GU1D для узла, ассоциированного со связанным объектом-компьютером
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдером WinNT
String
Да
ZADsComputer::Storagecapacity
Описание
Описывает емкость диска в Мбайт для связанного ■ объекта-компьютера
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдером WinNT
String
Нет
Интерфейс ZADsContainer
ZADsContainer::CopyHere
Описание
Копирует объект в альтернативное местоположение в каталоге
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP, WinNT
CopyHere(SourceName As String, NewName As String)
Object■
ZADsContainer::Count
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает число объектов в контейнере
Не поддерживается провайдерами LDAP и WinNT
Long
Да
ZADsContainer::Create
Описание
Создает новый объект определенного класса в каталоге
Поддерживаемый провайдер Синтаксис
LDAP, WinNT
Create(ClassName As String, RelativeName As String)
Тип данных
Object
ZADsContainer::Delete
Описание
Поддерживаемый провайдер
Синтаксис
Удаляет объект из каталога
LDAP, WinNT\
Delete(ClassName As String, RelativeName As
String)
Тип данных
Нет
498
Часть V. Приложения
lADsContainer::Filter
ОписаниеУстанавливает фильтр класса объекта для функций пере
числения контейнера
Поддерживаемый провайдерLDAP, WinNT
Тип данныхVariant
Только для чтенияНет
lADsContainer::GetObject
ОписаниеУстанавливает интерфейс к определенному объекту
Поддерживаемый провайдерLDAP, WinNT
СинтаксисGetObject(ClassNameAsString,RelativeName As
String)
Тип данныхObject
lADsContainer::Hints
ОписаниеОпределяет свойства, необходимые для загрузки
Поддерживаемый провайдер LDAP
Тип данныхVariant
Только для чтенияНет
lADsContainer::MoveHere
ОписаниеПеремешает (или переименовывает) объект в каталоге
Поддерживаемый провайдер LDAP, WinNT '
СинтаксисMoveHere(SourceName As String, NewName As
String)
Тип данныхObject
Интерфейс TADsDeleteOps
ZADsDeleteOps::DeleteObject
ОписаниеУдаляет объект (и все его дочерние объекты) из каталога
Поддерживаемый провайдер LDAP СинтаксисDeleteObject(Flags As Long)
Тип данныхНет
Интерфейс lADsDomain
lADsDomain::ADsPath
ОписаниеВозвращает характерное имя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsDomain::AutoUnlockinterval
Описание
Устанавливает минимальный временной интервал перед автоматическим разблокированием учетной записи
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
Long
Нет
lADsDomain::Class
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает определение класса объекта связанного объекта WinNT
String
Да
lADsDomain::Get
Описание
Возвращает значение из пространства Имен на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT
Get(Name As String)
Variant
lADsDomain::GetEx
Описание
Возвращает единичное значение из многозначного атрибута
Поддерживаемый провайдер
Синтаксис
Тип данных
WinNT
GetEx(Name As String)
Variant
lADsDomain::GetInfo
ОписаниеЗагружает все значения свойства в кэш
Поддерживаемый провайдер WinNT
Синтаксис
Тип данных
Getlnfo() Нет
lADsDomain::GetInfoEx
Описание
Поддерживаемый провайдер
Синтаксис
Загружает определенные свойства в кэш
WinNT
GetlnfoEx(Properties As Variant, Reserved As
Long)
Тип данных
Нет
lADsDomain::GUID
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение GU1D связанного объекта
WinNT
String
Да
500
Часть V. Приложения
lADsDomain::IsWorkgroup
ОписаниеВозвращает значение типа Boolean, указывающее на
принадлежность связанного объекта рабочей группе
Поддерживаемый провайдер Не поддерживается провайдером WinNT
Тип данныхBoolean
Только для чтенияДа
LADsDomain::Lockoutobservationinterval
ОписаниеУстанавливаетвременнойпромежуток, втечениекоторого неверныепопыткирегистрациивсистемесохра
няются в соответствующем счетчике
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияНет
lADsDomain::MaxBadPasswordsAllowed
ОписаниеУстанавливает число неверных попыток регистрации в сис
теме перед тем, как учетная запись будет заблокирована
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияНет
lADsDomain: :MaxPasswordAge
ОписаниеОпределяетмаксимальныйсрок действия пароля
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияНет
lADsDomain: :MinPasswordAge
ОписаниеОпределяетминимальныйсрок действия пароля
Поддерживаемый провайдер WinNT;
Тип данныхLong
Только для чтенияНет
lADsDomain::MinPasswordLength
ОписаниеОпределяетминимальнуюдлину пароля
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияНет
lADsDomain: -.Name
ОписаниеВозвращаетотносительноеимя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsDomain::Parent
ОписаниеВозвращает значение ADsPath родительского объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsDomain::PasswordAttributes
ОписаниеУстанавливает ограничения пароля
Поддерживаемый провайдер Не поддерживается провайдером WinNT
Тип данныхLong
Только для чтенияНет
lADsDomain::PasswordHistoryLength
Описание.
Поддерживаемый провайдер Тип данных Только для чтения
Определяет число паролей, которые нельзя повторно использовать
WinNT
Long
Нет
lADsDomain::Put
Описание
Позволяет заполнить единичный атрибут на основе
имени Поддерживаемый провайдер WinNT
СинтаксисPut(Name As String, Property As Variant)
Тип данныхНет
lADsDomain::PutEx-
ОписаниеПозволяет заполнить многозначное свойство на основе
Поддерживаемый провайдер Синтаксис
имени
WinNT■
PutEx(ControlCode As Long, Name As String, Prop-
erty As Variant)
Тип данныхНет
lADsDomain::Schema
ОписаниеВозвращает значение ADsPath схемы класса объектов
для связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsDomain::Setinfo■
ОписаниеЗаписывает текущие значения свойств из кэша в каталог
Поддерживаемый провайдер WinNT
СинтаксисSetinfo ()
Тип данныхНет
Интерфейс ZADsFileService
ZADsFileService: :ADsPath
ОписаниеВозвращает характерное имя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
ZADsFileService: .-Class
ОписаниеВозвращаетопределениеклассаобъекта связанного
объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
ZADsFileService::Dependencies
ОписаниеУстанавливает имена служб или групп, которые должны
загружаться при запуске этой службы
Поддерживаемый провайдер WinNT
Тип данныхVariant
Только для чтенияНет
ZADsFileService::Description
ОписаниеУстанавливает описание файловой службы
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияНет
ZADsFileService::DisplayName
ОписаниеУстанавливаетотображаемоеимяслужбы
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияНет
ZADsFileService::ErrorControl
ОписаниеУстанавливает действия, выполняемые при неверной
работе службы
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияНет
Значения флага lADsFileService::ErrorControl
Флаг
Значение
ADS_SERVICE_ERROR_IGNORE
0x00000000
ADS SERVICE ERROR NORMAL
0x00000001'
ADS SERVICE ERROR SEVERE
0x00000002
ADS_SERVICE_ERROR_CRITICAL0x00000003
lADsFileService:
:Get
Описание.
Возвращает значение из пространства имен на основе
имени
Поддерживаемый провайдер
WinNT
Синтаксис
Get(Name As String)
Тип данных
Variant
lADsFileService:
:GetEx
Описание
Возвращает единичное значение из многозначного ат-
рибута
Поддерживаемый провайдер
WinNT
Синтаксис
GetEx(Name As String)
Тип данных
Variant
lADsFileService:
:Getlnfo
Описание
Загружает все значения свойства в кэш
Поддерживаемый провайдер
WinNT
Синтаксис
Getlnfo()
Тип данных
Нет■ ■ ' ■
lADsFileService:
:GetlnfоЕх
Описание
Загружает определенные свойства в кэш
Поддерживаемый провайдер
WinNT
Синтаксис
GetlnfoEx(Properties As variant, Reserved as
Long)
Тип данных
Нет-
lADsFileService:
:GUID'
Описание
Возвращает значение GUID связанного объекта
Поддерживаемый провайдер
WinNT
Тип данных
String
Только для чтения
Да
lADsFileService:
: Hostcomputer
Описание
Устанавливает узел текущей связанной службы
Поддерживаемый провайдер
WinNT
Тип данных
String
Только для чтения
Нет
XADsFileService: : LoadOrderGroup
ОписаниеПоддерживаемый провайдер Тип данныхТолько для чтенияXADsFileService:ОписаниеПоддерживаемый провайдерТип данныхТолько для чтенияXADsFileService:ОписаниеПоддерживаемый провайдерТип данныхТолько для чтенияXADsFileService:ОписаниеПоддерживаемый провайдер Тип данныхТолько для чтенияXADsFileService:ОписаниеПоддерживаемый провайдерТип данныхТолько для чтенияXADsFileService:ОписаниеПоддерживаемый провайдерСинтаксисТип данныхXADsFileService:ОписаниеПоддерживаемый провайдерСинтаксисТип данныхОписаниеПоддерживаемый провайдер Тип данныхТолько для чтенияXADsFileService:ОписаниеПоддерживаемый провайдерТип данныхТолько для чтенияXADsFileService:ОписаниеПоддерживаемый провайдерТип данныхТолько для чтенияXADsFileService:ОписаниеПоддерживаемый провайдер Тип данныхТолько для чтенияXADsFileService:ОписаниеПоддерживаемый провайдерТип данныхТолько для чтенияXADsFileService:ОписаниеПоддерживаемый провайдерСинтаксисТип данныхXADsFileService:ОписаниеПоддерживаемый провайдерСинтаксисТип данныхУстанавливает порядок загрузки групп, используемых с текущей связанной службой
Описание
Поддерживаемый провайдер Тип данных
Только для чтения
XADsFileService:
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
XADsFileService:
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
XADsFileService:
Описание
Поддерживаемый провайдер Тип данных
Только для чтения
XADsFileService:
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
XADsFileService:
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
XADsFileService:
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Описание
Поддерживаемый провайдер Тип данных
Только для чтения
XADsFileService:
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
XADsFileService:
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
XADsFileService:
Описание
Поддерживаемый провайдер Тип данных
Только для чтения
XADsFileService:
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
XADsFileService:
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
XADsFileService:
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
WinNT
String
Нет
:MaxUserCount
Определяет максимальное число пользователей, имеющих конкурентный доступ к службе
WinNT
Long
Нет
:Name
Возвращает относительное имя связанного1 объекта ■ WinNT
String
Да
:Parent
Возвращает значение ADsPath родительского объекта WinNT
String
Да
: Path
Устанавливает путь исполняемого файла, ассоциированного со связанной службой
WinNT
String
Нет
:Put
Позволяет заполнить единичный атрибут на основе имени
WinNT
Put(Name As String, Property As Variant)
Нет
:PutEx
Позволяет заполнить многозначное свойство на основе имени
WinNT
PutEx(Controlcode As Long, Name As String, Property As Variant)
Нет
XADsFileService: : Schema
ОписаниеВозвращает значение ADsPath схемы класса объекта
связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
XADsFileService: : ServiceAccountName
ОписаниеУстанавливает имя пользователя учетной записи,
рое используется службой
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияНет
кото-
XADsFileService::ServiceAccountPath
ОписаниеУстанавливает значение ADsPath учетной записи поль
зователя, используемое для аутентификации службы
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияНет
XADsFileService: : ServiceType
ОписаниеУстанавливает тип процесса, в котором может быть за
пущена связанная служба
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияНет
Значения флага lADsFileService:: ServiceType
ФлагЗначение
ADS_SERVICE_KERNAL_DRIVER0x00000001
ADS_SERVICE_FILE_SYSTEM_DRIVER0x00000002
ADS_SERVICE_OWN_PROCESS0x00000010
ADS_SERVICE_SHARE_PROCESS0x00000020
XADsFileService::Setinfo
ОписаниеЗаписывает текущие значения свойств из кэша в
лог
Поддерживаемый провайдер WinNT
СинтаксисSetinfo()
Тип данныхНет
ката-
ZADsFileService: : StartType
ОписаниеУстанавливает режим запуска службы
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияНет
Значения флага ZADsFileService: : StartType
Флаг
Значение
ADS_SERVICE_BOOT_START
0
ADS_SERVICE_SYSTEM_START
1
ADS_SERVICE_AUTO_START
2
ADS_SERVICE_DEMAND_START
3
ADS_SERVICE_DISABLED
4
ZADsFileService:
:Startupparameters
Описание
Устанавливает аргументы, передаваемы службе при за-
пуске
Поддерживаемый провайдер
WinNT
Тип данных
Long
Только для чтения
Нет
ZADsFileService:
: Version
Описание
Устанавливает информацию о версии службы
Поддерживаемый провайдер
WinNT
Тип данных
String
Только для чтения
Нет
Интерфейс lADsFileServiceOperations
lADsFileServiceOperations::ADsPath
ОписаниеВозвращает характерное имя связанного объекта
Поддерживаемый провайдер WinNT Тип данныхString
Только для чтенияДа
lADsFileServiceOperations::Class
ОписаниеВозвращаетопределениеклассаобъектасвязанного
объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
XADsFileServiceOperations::Continue
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Возобновляет работу приостановленной службы
WinNT
Continue()'
Нет
XADsFileServiceOperations::Get
Описание
Возвращает значение из пространства имен на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT
Get(Name As String)
Variant
XADsFileServiceOperations::GetEx
Описание
Возвращает единичное значение из многозначного атрибута
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT
GetEx(Name As String)
Variant
XADsFileServiceOperations::Getlnfо
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Загружает все значенйя свойства в кэш
WinNT
GetInfo()
Нет
XADsFileServiceOperations::GetlnfoEx
Описание
Поддерживаемый провайдер
Синтаксис
Загружает определеннее свойства в кэш
WinNT
GetlnfoEx(Properties As Variant, Reserved As Long)
Тип данных
Нет
XADsFileServiceOperations::GUID
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение GUID связанного объекта
WinNT
String
Да
XADsFileServiceOperations::Name
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает относительное имя связанного объекта
WinNT
String
Да
508
Часть V. Приложения
ZADsFileServiceOperations::Parent
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение ADsPath родительского объекта
WinNT
String
Да
ZADsFileServiceOperations::Pause
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Приостановка запущенной службы
WinNT
Pause()
Нет
ZADsFileServiceOperations::Put
Описание
Позволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер
Синтаксис
Тип данных
WinNT
Put(Name As String, Property As String)
Нет
ZADsFileServiceOperations::PutEx
Описание
Позволяет заполнить многозначное свойство на основе имени
Поддерживаемый провайдер Синтаксис
WinNT
PutEx(Controlcode As Long, Name As String, Property As Variant)
Тип данных
Нет
ZADsFileServiceOperations::Resources
Описание
Устанавливает интерфейс к коллекции объектов, представляющих собой открытые ресурсы для связанного объекта
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT
Resources() LADsCollection
ZADsFileServiceOperations::Schema
Описание
Возвращает значение AdsPath схемы класса объекта для связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Да
ZADsFileServiceOperations::Sessions
ОписаниеУстанавливает интерфейс к коллекции объектов, со
держащей открытые сессии пользователей для связанного объекта
Поддерживаемый провайдер WinNT
СинтаксисSessions ()
Тип данныхlADsCollection
ZADsFileServiceOperations::Setinfo
ОписаниеЗаписываеттекущие значения свойств из кэша в ката
лог
Поддерживаемый провайдер WinNT
СинтаксисSetinfo ()
Тип данныхНет
ZADsFileServiceOperations::SetPassword
ОписаниеУстанавливает новый пароль, используемый учетной
записью службы
Поддерживаемый провайдер WinNT
СинтаксисSetPassword(NewPassword As String)
Тип данныхНет
ZADsFileServiceOperations::Start
ОписаниеЗапуск остановленной службы
Поддерживаемый провайдер WinNT
СинтаксисStart ()
Тип данныхНет
ZADsFileServiceOperations::Status.
ОписаниеВозвращаетсостояниетекущейсвязанной службы
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияДа
Значения флага ZADsFileServiceOperations: : Status
Флаг
Значение
ADS_SERVICE_STOPPED
0x00000001
ADS_SERVICE_START_PENDING
0x00000002'
ADS_SERVICE_STOP_PENDING
0x00000003
ADS_SERVICE_RUNNING
0x00000004
ADS_SERVICE_CONTINUE_PENDING
0x00000005
ADS_SERVICE_PAUSE_PENDING
0x00000006
ADS_SERVICE_PAUSED
0x00000007
ADS_SERVICE_ERROR
0x00000008
XADsFileServiceOperations::Stop'
ОписаниеОстановка запушенной службы
Поддерживаемый провайдер WinNT
СинтаксисStop()
Тип данныхНет
Интерфейс XADsFileShare
XADsFileShare::ADsPath
ОписаниеВозвращает характерное имя связанного объекта
Поддерживаемый провайдер WinNT Тип данныхString
Только для чтенияДа
XADsFileShare::Class
ОписаниеВозвращает определение класса объекта для связанного
объекта
Поддерживаемый провайдер WinNT Тип данныхString
Только для чтенияДа
XADsFileShare::CurrentUserCount
ОписаниеВозвращаетчисло текущих пользователей
Поддерживаемый провайдер WinNT Тип данныхLong
Только для чтенияДа
XADsFileShare::Description
ОписаниеУстанавливаетописаниедля совместно используемого
ресурса Поддерживаемый провайдер WinNT Тип данныхString
Только для чтенияНет
XADsFileShare::Get
ОписаниеВозвращает значение из пространства имен на основе
имени
Поддерживаемый провайдер WinNT
СинтаксисGet(Name As String)
Тип данныхvariant
lADsFileShare::GetEx
ОписаниеВозвращает единичное значение из многозначного
атрибута
Поддерживаемый провайдер WinNT
СинтаксисGetEx(NameAsString)
Тип данныхVariant
LADsFileShare::Getlnfо
ОписаниеЗагружает всезначения свойства в кэш
Поддерживаемый провайдерWinNT
СинтаксисGetlnfо ()
Тип данныхНет
lADsFileShare::GetlnfоЕх
ОписаниеЗагружает определенные свойствав кэш
Поддерживаемый провайдерWinNT
СинтаксисGetlnfoEx(PropertiesAsVariant, Reserved As
Long)
Тип данныхНет
lADsFileShare::GUID
ОписаниеВозвращает значение GUID связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsFileShare::Hostcomputer
ОписаниеУстанавливает значение ADsPathкомпьютера, на котором находится совместноиспользуемый ресурс
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияНет
lADsFileShare::MaxUserCount
ОписаниеУстанавливает максимальное число подключений к со
вместно используемому ресурсу
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияНет
lADsFileShare::Name
ОписаниеВозвращаетотносительноеимя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
LADsFileShare::Parent
ОписаниеВозвращает значение ADsPath родительского объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
LADsFileShare::Path
ОписаниеУстанавливает путь в файловой системе совместно ис
пользуемого ресурса
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияНет
LADsFileShare::Put
ОписаниеПозволяетзаполнитьединичный атрибут на основе
имени
Поддерживаемый провайдер WinNT
СинтаксисPut(Name As String, Property As Variant)
Тип данныхНет
LADsFileShare::PutEx
ОписаниеПозволяет заполнить многозначное свойство на основе
имени
Поддерживаемый провайдер WinNT
СинтаксисPutEx(ControlCode As Long, Name As String,
Property As Variant)
Тип данныхНет
LADsFileShare::Schema
ОписаниеВозвращает значение ADsPath схемы класса объекта
для связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
LADsFileShare::Setinfo
ОписаниеЗаписывает текущие значения свойств из кэша в ката
лог
Поддерживаемый провайдер WinNT
СинтаксисSetinfo ()
Тип данныхНет
Интерфейс lADsGroup
lADsGroup::Add
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Добавляет объект каталога в связанную группу
LDAP, WinNT
Add(Newltem As String)
Нет
lADsGroup::ADsPath
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает характерное имя связанного объекта
LDAP, WinNT
String
Да
lADsGroup::Class
Описание
Возвращает определение класса объекта связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
String
Да
lADsGroup::Description
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает описание связанной группы
LDAP, WinNT
String
Нет
lADsGroup::Get
Описание
Возвращает значение из пространства имен на основе имени
Поддерживаемый провайдер
Синтаксис
Тип данных
LDAP, WinNT
Get(Name As String)
Variant
lADsGroup::GetEx
Описание
Возвращает единичное значение из многозначного атрибута
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP, WinNT
GetEx(Name As String)
Variant
lADsGroup::GetInfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Загружает все значения свойства в кэш
LDAP, WinNT
Getlnfo()
Нет
lADsGroup::GetInfoEx
Описание
Поддерживаемый провайдер
Синтаксис
Загружает определенные свойства в кэш
LDAP, WinNT
GetlnfoEx(Properties As Variant, Reserved As
Long)
Тип данных
Нет
lADsGroup::GUID
Описание
' Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение GUID связанного объекта
LDAP, WinNT
String
Да'
lADsGroup::IsMember
Описание
Определяет принадлежность объекта к связанной группе при передаче значения ADsPath объекта пользователя или группы
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP, WinNT
IsMember(Member As String)
Boolean
lADsGroup:: Members
Описание
Возвращает массив строк, представляющих членов текущей связанной группы
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP, WinNT
Members() lADsMembers
lADsGroup::Name
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает относительное имя связанного объекта
LDAP, WinNT
String
Да
lADsGroup::Parent
ОписаниеВозвращает значение ADsPath родительского объекта
Поддерживаемый провайдер LDAP, WinNT
Тип данныхString
Только для чтенияДа
lADsGroup::Put
Описание
Позволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер
Синтаксис
Тип данных
LDAP, WinNT
Put(Name As String, Property As Variant)
Нет
lADsGroup::PutEx
Описание
Позволяет заполнить многозначное свойство на основе имени
Поддерживаемый провайдер Синтаксис
LDAP, WinNT
PutEx(Controlcode As Long, Name As String, Property As Variant)
Тип данных
Нет
lADsGroup::Remove
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Удаляет объект каталога из текущей связанной группы
LDAP, WinNT
Remove(ItemToBeRemoved As String)
Нет
lADsGroup::Schema
Описание
Возвращает значение ADsPath схемы класса объекта для связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
String
Да
lADsGroup::Setinfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Записывает текущие значения свойств из кэша в каталог
LDAP, WinNT
Setinfo()
Нет
Интерфейс lADsLocality
lADsLocality::ADsPath
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает характерное имя связанного объекта
LDAP
String
Да
lADsLocality::Class
Описание
Возвращает определение класса объекта связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Да
lADsLocality::Description
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает описание объекта
LDAP
String
Нет
lADsLocality::Get
Описание
Возвращает значение из пространства имен на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP
Get(Name As String)
Variant
lADsLocality::GetEx
Описание
Возвращает единичное значение из многозначного атрибута
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP
GetEx(Name As String)
Variant
lADsLocality::Getlnfо
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Загружает все значения свойства в кэш LDAP
Getlnfo()
Нет
lADsLocality::GetlnfoEx
Описание Поддерживаемый провайдер Синтаксис
Загружает определенные свойства в кэш
LDAP
GetlnfoEx(Properties As Variant, Reserved as
Long)
Тип данных
Нет
lADsLocality::GUID
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение GUID связанного объекта
LDAP
String
Да
lADsLocality::LocalityName
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает название географического региона' LDAP
String
Нет
lADsLocality::Name
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает относительное имя связанного объекта LDAP
String
Да■
lADsLocality::Parent
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение ADsPath родительского объекта LDAP
String
Да
lADsLocality::PostalAddress
Описание
Устанавливает почтовый адрес, ассоциированный с объектом
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
lADsLocality::Put
Описание
Позволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP
Put(Name As String, Property As Variant)
Нет
lADsLocality::PutEx
Описание
Позволяет заполнить многозначное свойство на основе имени
Поддерживаемый провайдер Синтаксис
LDAP
PutEx(ControlCode As Long, Name As String, Property As Variant)
Тип данных
Нет
lADsLocality::Schema
Описание
Возвращает значение ADsPath схемы класса объекта для связанного объекта
Поддерживаемый провайдер Тип данных
Только для чтения
LDAP
String Да
518
Часть V. Приложения
lADsLocality::SeeAlso
Описание
Устанавливает список других соответствующих объектов, которые также описывают связанный объект locality
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
Variant
Нет
lADsLocality::Setinfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Запись текущих значений свойств из кэша в каталог
LDAP
Setinfo()
Нет
Интерфейс lADsMembers
lADsMembers:Count
Описание
Поддерживаемый провайдер
Возвращает число членов выделения Поддерживается только провайдером LDAP GroupCollection
Тип данных
Только для чтения
String
Да
lADsMembers:Filter
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает фильтр для выделенного элемента
LDAP, WinNT
String
Нет
Интерфейс IADsO
IADsO::ADsPath
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает характерное имя связанного объекта
LDAP
String
Да
IADsO::Class
Описание
Возвращает определение класса объекта связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Да
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
IADsO::FaxNumber
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
IADsO::Get
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
IADsO: :GetEx
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
IADsO::GetInfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
IADsO::GetInfoEx
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
IADsO::GUID
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает описание организации (чаще всего это название компании)
LDAP
String
Нет
Устанавливает номер факса организации
LDAP
String
Нет
Возвращает значение из пространства имен на основе имени
LDAP
Get(Name As String)
Variant
Возвращает единичное значение из многозначного атрибута
LDAP
GetEx(Name As String)
Variant
Загружает все значения свойства в кэш
LDAP
Getlnfot)
Нет
Загружает определенные свойства в кэш
LDAP
GetlnfoEx(Properties As Variant, Reserved as Long)
Нет
Возвращает значение GUID связанного объекта
LDAP
String
Да
IADsO::LocalityName
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает расположение организации
LDAP
String
Нет
IADsO::Name
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает относительное имя связанного объекта LDAP
String
Да
IADsO::Parent
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение ADsPath родительского объекта LDAP
String
Да
IADsO::PostalAddress
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает почтовый адрес организации
LDAP
String
Нет
IADsO::Put
Описание
Позволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP
Put(Name As String, Property As Variant)
Нет
IADsO::PutEx
Описание
Позволяет заполнить многозначное свойство на основе имени
Поддерживаемый провайдер Синтаксис
LDAP
PutEx(ControlCode As Long, Name As String, Property As Variant)
Тип данных
Нет
IADsO::Schema
Описание
Возвращает значение ADsPath схемы класса объекта для связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Да
IADsO::SeeAlso
Описание
Устанавливает список другой информации, имеющей отношение к организации
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
Variant
Нет
IADsO::Setinfo
Описание
Записывает текущие значения свойств из кэша в каталог
Поддерживаемый провайдер
Синтаксис
Тип данных
LDAP
Setinfo()
Нет
IADsO::TelephoneNumber
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает номер телефона организации
LDAP
String
Нет
Интерфейс IADsOU
IADsOU::ADsPath
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает характерное имя связанного объекта LDAP
String
Да
IADsOU::Businesscategory
Описание
Устанавливает функциональное описания для бизнес- подразделения.
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
IADsOU::Class
Описание
Возвращает определение класса объекта связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Да.
522
Часть Ж Приложения
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает описание для подразделения организации LDAP
String
Нет
IADsOU::FaxNumber
Описание
Устанавливает номер факса для подразделения организации
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
IADsOU::Get
Описание
Возвращает значение из пространства имен на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP
Get(Name As String)
Variant
IADsOU::GetEx
Описание
Возвращает единичное значение из многозначного атрибута
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP
GetEx(Name As String)
Variant
IADsOU::GetInfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Загружает все значения свойства в кэш LDAP
Getlnfo()
Нет
IADsOU::GetlnfoEx
Описание
Поддерживаемый провайдер
Синтаксис
Загружает определенные свойства в кэш
LDAP
GetlnfoEx(Properties As Variant, Reserved as
Long)
Тип данных
Нет
IADsOU::GUID
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение GUID связанного объекта LDAP
String
Да
IADsOU:: Local ityName
Описание
Устанавливает физическое расположение подразделения организации
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
IADsOU::Name
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает относительное имя связанного объекта LDAP
String
Да
IADsOU::Parent
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение ADsPath родительского объекта LDAP
String
Да
IADsOU::PostalAddress
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает почтовый адрес подразделения организации LDAP
String
Нет
IADsOU::Put
Описание
Позволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP
Put(Name As String, Property As Variant) Нет
IADsOU::PutEx
Описание
Позволяет заполнить многозначное свойство на основе имени
Поддерживаемый провайдер Синтаксис
LDAP
PutEx(Controlcode As Long, Name As String, Property As Variant)
Тип данных
Нет
IADsOU::Schema
Описание
Возвращает значение ADsPath схемы класса объекта для связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Да
524
Часть V. Приложения
IADsOU::SeeAlso
Описание
Устанавливает список другой информации, имеющей отношение к подразделению организации
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
Variant
Нет
IADsOU::Setinfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Записывает текущие значения свойств из кэша в каталог
LDAP'
Setinfo()
Нет
IADsOU::TelephoneNumber
Описание
Устанавливает номер телефона подразделения организации
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
Интерфейс ZADsOpenDSObject
lADsOpenDSObject::OpenDSObject
Описание
Позволяет использовать альтернативные полномочия при подключении к каталогу
Поддерживаемый провайдер Синтаксис
LDAP, WinNT
OpenDSObject(DnName As String, UserName As String, Password As String, Reserved As Long)
Тип данных
Object
Интерфейс ZADsPrintJob
lADsPrintJob::ADsPathi
ОписаниеВозвращает характерное имя связанного объекта
Поддерживаемый провайдер WinNT
Тип ДанныхString
Только для чтенияДа
lADsPrintJob::Class
Описание
Возвращает определение класса объекта связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Да
ZADsPrintJob::Description
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает описание задания печати
WinNT
String
Нет
ZADsPrintJob::Get
Описание
Возвращает значения из пространства имен на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT.
Get(Name As String) Variant
ZADsPrintJob::GetEx
Описание
Возвращает единичное значение из многозначного атрибута■
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT
GetEx(Name As String)
Variant
ZADsPrintJob::GetZnfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Загружает все значения свойства в кэш WinNT
Getlnfo()
Нет
ZADsPrintJob::GetZnfoEx
Описание
Позволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер Синтаксис
WinNT
GetlnfoEx(Properties As Variant, Reserved As Long)
Тип данных
Нет
ZADsPrintJob::GUZD
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение GUID связанного объекта
WinNT
String
Да
ZADsPrintJob::HostPrintQueue
Описание
Возвращает значение ADsPath, где находится очередь печати
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String Да
lADsPrintJob::Name
ОписаниеВозвращает относительное имя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияДа
lADsPrintJob::Notify
ОписаниеУстанавливает имя пользователя, которому отправляет
ся уведомление об окончании печати задания
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияНет
lADsPrintJob::NotifyPath
ОписаниеУстанавливаетзначениеADsPathобъектапользователя,
который уведомляется об окончании печати задания
Поддерживаемый провайдер WinNT
Тип данныхstring-
Только для чтенияНет
lADsPrintJob::Parent
ОписаниеВозвращает значения ADsPath родительского объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsPrintJob::Priority
ОписаниеУстанавливаетприоритетзаданияпечати
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияНет
lADsPrintJob::Put
ОписаниеПозволяетзаполнитьединичныйатрибутна основе
имени
Поддерживаемый провайдер WinNT
Синтаксис. Put(Name As String, Property As Variant)
Тип данныхНет
lADsPrintJob::PutEx
ОписаниеПозволяет заполнить многозначное свойство на осно
ве имени
Поддерживаемый провайдер WinNT
Синтаксис ■PutEx (Controlcode As Long, Name As String,
Property As Variant)
Тип данныхНет
lADsPrintJob::Schema
ОписаниеВозвращает значение ADsPath схемы класса объекта
для связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsPrintJob::Setinfo
ОписаниеЗаписывает текущие значения свойств из кэша в каталог
Поддерживаемый провайдер WinNT
СинтаксисSetinfo()
Тип данныхНет
lADsPrintJob::Size
ОписаниеВозвращает размер задания печати в байтах
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияДа
lADsPrintJob::StartTime
ОписаниеУстанавливаетближайшеевремяпечатизадания
Поддерживаемый провайдер WinNT
Тип данныхDate
Только для чтенияНет
lADsPrintJob::TimeSubmitted
ОписаниеВозвращает время постановки задания печати в очередь
Поддерживаемый провайдер WinNT
Тип данныхDate
Только для чтенияДа
lADsPrintJob::TotalPages
ОписаниеВозвращает число страниц задания печати
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияДа
lADsPrintJob::UntilTime
ОписаниеУстанавливает позднее время, позволяющее распеча
тать задание
Поддерживаемый провайдер WinNT
Тип данныхDate
Только для чтенияНет
ZADsPrintJob::User
Описание
Возвращает имя пользователя, поставившего задание печати в очередь
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Да
ZADsPrintJob::UserPath
Описание
Возвращает путь к объекту пользователя, который поставил задание печати в очередь
Поддерживаемый провайдер
• Тип данных
Только для чтения
WinNT
String
Да
Интерфейс ZADsPrintJobOperations
lADsPrintJobOperations::ADsPath
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает характерное имя связанного объекта
WinNT
String
Да
ZADsPrintJobOperations::Class
Описание
Возвращает определение класса объекта связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT ’
String
Да
ZADsPrintJobOperations::Get
Описание
Возвращает значение из пространства имен на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT
Get(Name As String)
Variant'
ZADsPrintJobOperations::GetEx
Описание
Возвращает единичное значение из многозначного атрибута
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT
GetEx(Name As String)
Variant
lADsPrintJobOperations::Getlnfо
ОписаниеЗагружает все значения свойства в кэш
Поддерживаемый провайдер WinNT
СинтаксисGetlnfoO
Тип данныхНет
IADsPrintJobOperations::GetlnfоЕх
ОписаниеЗагружает определенные значения свойств в кэш
Поддерживаемый провайдер WinNT.
СинтаксисGetlnfoEx(Properties As Variant, ReservedAs
Long)
Тип данныхНет
lADsPrintJobOperations::GUID
ОписаниеВозвращает значение GUID связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsPrintJobOperations::Name
ОписаниеВозвращает относительное имя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsPrintJobOperations::PagesPrinted
ОписаниеВозвращает общее число напечатанных страниц для
связанного задания печати
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияДа
lADsPrintJobOperations::Parent
ОписаниеВозвращает значение ADsPath родительского объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsPrintJobOperations::Pause
ОписаниеПриостанавливаетпечатьтекущего задания'
Поддерживаемый провайдер WinNT
СинтаксисPause ()
Тип данныхНет
lADsPrintJoboperations::Position
Описание
Устанавливает положение текущего задания печати в очереди
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
Long
Нет
lADsPrintJobOperations::Put
Описание
Позволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT
Put(Name As String, Property As Variant)
Нет
lADsPrintJobOperations::PutEx
Описание
Позволяет заполнить многозначное свойство на основе имени
Поддерживаемый провайдер
Синтаксис,
WinNT
PutEx(Controlcode As Long, Name as String, Property As Variant)
Тип данных
Нет
lADsPrintJobOperations::Resume
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Восстанавливает печать связанного задания печати
WinNT
Resume
Нет
lADsPrintJobOperations::Schema
Описание
Возвращает значение ADsPath схемы класса объекта для связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Да
lADsPrintJobOperations::Setinfo
Описание
Записывает текущие значения свойств из кэша в каталог
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT
Setinfo()
Нет
lADsPrintJobOperations::Status
ОписаниеВозвращает состояние текущего связанного задания
печати
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияДа
Значения флага lADsPrintJobOperations: : Status
Флаг
Значение
ADS_JOB_PAUSED
0x00000001
ADS_JOB_ERROR
0x00000002
ADS_JOB_DELETING
0x00000004
ADS_JOB_PRINTING
0x00000010■
ADS_JOB_OFFLINE
0x00000020
ADS_JOB_PAPEROUT
0x00000040
ADS_JOB_PRINTED
0x00000080
ADS_JOB_DELETED
0x00000100
lADsPrintJobOperations
::TimeElapsed
Описание
Возвращает число секунд с момента начала печати за-
дания
Поддерживаемый провайдер
WinNT
Тип данных
Long
Только для чтения
Да
Интерфейс lADsPrintQueue
lADsPrintQueue::ADsPath
ОписаниеВозвращает характерное имя связанного объекта
Поддерживаемый провайдер LDAP, WinNT
Тип данныхString
Только для чтенияДа
lADsPrintQueue::BannerPage
ОписаниеУстанавливает путь в файловой системе к файлу, ис
пользуемому в качестве разделителя страниц
Поддерживаемый провайдер LDAP, WinNT
Тип данныхString
Только для чтенияНет
ZADsPrintQueue: -.Class
ОписаниеВозвращает определение класса объекта связанного
объекта
Поддерживаемый провайдер LDAP, WinNT
Тип данныхstring
Только для чтенияДа
ZADsPrintQueue::Datatype
ОписаниеУстанавливает тип данных, выполняемых связанной
очередью печати
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияНет
ZADsPrintQueue::DefaultJobPriority
ОписаниеУстанавливает приоритет, назначенный по умолчанию
всем заданиями печати в очереди
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияНет
ZADsPrintQueue:description
ОписаниеУстанавливаетописаниеочередипечати
Поддерживаемый провайдер LDAP, WinNT
Тип данныхstring
Только для чтенияНет
ZADsPrintQueue::Get
ОписаниеВозвращает значение из пространства имен на основе
имени"
Поддерживаемый провайдер LDAP, WinNT
СинтаксисGet(Name As String) .
Тип данныхVariant
ZADsPrintQueue::GetEx
ОписаниеВозвращает единичное значение из многозначного атрибута
Поддерживаемый провайдер LDAP, WinNT
СинтаксисGetEx(Name As String)
Тир данныхVariant
ZADsPrintQueue::GetZnfo
ОписаниеЗагружает все значениясвойства в кэш
Поддерживаемый провайдер LDAP, WinNT
СинтаксисGetlnfo()
Тип данныхНет
TADsPrintQueue::GetInfoEx
ОписаниеЗагружает определенные значения свойств в кэш
Поддерживаемый провайдер LDAP, WinNT
СинтаксисGetlnfoEx(Properties As Variant, Reserved as
Long)
Тип данныхНет
TADsPrintQueue::GUID
ОписаниеВозвращает значение GUID связанного объекта
Поддерживаемый провайдер LDAP, WinNT
Тип данныхString
Только для чтенияДа
TADsPrintQueue::Location
ОписаниеУстанавливает описание физического расположения
очереди печати
Поддерживаемый провайдер LDAP, WinNT
Тип данныхstring
Только для чтенияНет
TADsPrintQueue::Model
ОписаниеУстанавливает название драйвера, ассоциированного со
связанной очередью печати
Поддерживаемый провайдер LDAP, WinNT
Тип данныхString
Только для чтенияНет
TADsPrintQueue::Name
ОписаниеВозвращает относительное имя связанного объекта
Поддерживаемый провайдер LDAP, WinNT
Тип данныхstring
Только для чтенияДа
TADsPrintQueue::NetAddresses
ОписаниеУстанавливает информацию связывания
Поддерживаемый провайдер Не поддерживается провайдерами WinNT или LDAP
Тип данныхVariant
Только для чтенияНет
TADsPrintQueue::Parent
ОписаниеВозвращает значение ADsPath родительского объекта
Поддерживаемый провайдер LDAP, WinNT
Тип данныхString
Только для чтенияДа
LADsPrintQueue::
PrintDevices
Описание
Устанавливает имя принтера, связанное с очередью и используемое для обслуживания заданий печати
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Variant
Нет
LADsPrintQueue::
PrinterPath
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает путь к принтеру
LDAP
String
Нет
TADsPrintQueue::
PrintProcessor
Описание
Устанавливает ядро процессора печати, используемое связанной очередью
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Нет
TADsPrintQueue::
Priority
Описание
Устанавливает приоритет очереди для подключенных устройств
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Long
Нет
TADsPrintQueue::
Put
Описание
Позволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер
Синтаксис
Тип данных
LDAP, WinNT
Put(Name As String, Property As Variant)
Нет
TADsPrintQueue::
PutEx
Описание
Позволяет заполнить многозначное свойство на основе имени
Поддерживаемый провайдер Синтаксис
LDAP, WinNT
PutEx(ControlCode As Long, Name As String, Property As Variant)
Тип данных
Нет
TADsPrintQueue::Schema
ОписаниеВозврашает значение ADsPath схемы класса объекта
для связанного объекта
Поддерживаемый провайдер LDAP, WinNT
Тип данныхString
Только для чтенияДа
TADsPrintQueue::Setinfo
ОписаниеЗаписывает текущие значения свойств из кэша в каталог
Поддерживаемый провайдер LDAP, WinNT СинтаксисSetinfo ()
Тип данныхНет
TADsPrintQueue::StartTime-
Описание 'Устанавливает начальное время выполнения заданий
печати из связанной очереди
Поддерживаемый провайдер LDAP, WinNT
Тип данныхDate
Только для чтенияНет
TADsPrintQueue::UntilTime
ОписаниеУстанавливает окончательное время выполнения зада
ний печати из связанной очереди
Поддерживаемый провайдер LDAP, WinNT
Тип данныхDate
Только для чтенияНет
Интерфейс lADsPrintQueueOperations
TADsPrintQueueOperations::ADsPath
ОписаниеВозвращает характерное имя связанного объекта
Поддерживаемый провайдер LDAP, WinNT Тип данныхstring
Только для чтенияДа
TADsPrintQueueOperations::Class
Описание. Возвращает определение класса объекта связанного
объекта
Поддерживаемый провайдер LDAP, WinNT
Тип данныхstring
Только для чтенияДа
TADsPrintQueueOperations::Get
ОписаниеВозвращает значение из пространства имен на основе
имени
Поддерживаемый провайдер LDAP, WinNT СинтаксисGet(Name As String)
Тип данныхVariant
TADsPrintQueueOperations::GetEx
ОписаниеВозвращаетединичное значение из многозначного атрибута
Поддерживаемый провайдер LDAP, WinNT СинтаксисGetEx(Name As String)
Тип данныхVariant
TADsPrintQueueOperations: : Getlnfо,
ОписаниеЗагружает все значения свойства в кэш
Поддерживаемый провайдер LDAP, WinNT СинтаксисGetinfo()
Тип данныхНет
TADsPrintQueueOperations::GetlnfоЕх
ОписаниеЗагружает определенные свойства в кэш
Поддерживаемый провайдер LDAP, WinNT
СинтаксисGetlnfoEx(Properties As Variant, Reserved as
Long)
Тип данныхНет
TADsPrintQueueOperations::GUID'
ОписаниеВозвращает значение GUID связанного объекта
Поддерживаемый провайдер ■ LDAP, WinNT Тип данныхstring
Только для чтенияДа?■ ''.."
TADsPrintQueueOperations::Name
ОписаниеВозвращает относительное имя связанного объекта
Поддерживаемый провайдер LDAP, WinNT'
Тип данныхstring
Только для чтенияДа
TADsPrintQueueOperations::Parent
ОписаниеВозвращает значение ADspath родительского объекта
Поддерживаемый провайдер LDAP, WinNT,
Тип данныхstring
Только для чтенияДа
lADsPrintQueueOperations::Pause
ОписаниеПриостанавливает выполнение связанной очереди печати
Поддерживаемый провайдер LDAP, WinNT
СинтаксисPause ()
Тип данныхНет
lADsPrintQueueOperations::PrintJobs
ОписаниеВозвращает коллекцию заданий печати, находящуюся в
настоящее время в очереди
Поддерживаемый провайдер LDAP, WinNT
СинтаксисPrintJobs ()
Тип данныхlADsCollection
lADsPrintQueueOperations::Purge
ОписаниеУдаляет все задания из текущей связанной очереди печати
Поддерживаемый провайдер LDAP, WinNT
СинтаксисPurged
Тип данныхНет
lADsPrintQueueOperations::Put
ОписаниеПозволяет заполнить единичный, атрибут на основе имени
Поддерживаемый провайдер LDAP, WinNT
СинтаксисPut(Name As String, Property As Variant)
Тип данныхНет
lADsPrintQueueOperations::PutEx
ОписаниеПозволяет заполнить многозначное свойство на осно
ве имени
Поддерживаемый провайдер LDAP, WinNT
СинтаксисPutEx (ControlCode As Long, Name As String,
Property As Variant)
Тип данныхНет
lADsPrintQueueOperations::Resume
ОписаниеВозобновляет печать заданий, приостановленных в
очереди печати
Поддерживаемый провайдер LDAP, WinNT
СинтаксисResume ()
Тип данныхНет
lADsPrintQueueOperations::Schema
ОписаниеВозвращаетзначение ADsPath схемы класса объекта
для связанного объекта
Поддерживаемый провайдер LDAP, WinNT
Тип данныхString
Только для чтенияДа
lADsPrintQueueOperations::Setinfo
ОписаниеЗаписывает текущие значения свойств из кэша в ката
лог
Поддерживаемый провайдер LDAP, WinNT
Синтаксисsetinfo()
Тип данныхНет
lADsPrintQueueOperations::Status
ОписаниеВозвращает текущее состояние очереди печати
Поддерживаемый провайдер LDAP, WinNT Тип данныхLong■
Только для чтенияДа
Значения флага lADsPrintQueueOperations:: Status
Флаг
Значение
ADS_PRINTER_PAUSED
0x00000001
ADS_PRINTER_PENDING_DELETION
0x00000002.
ADS_PRINTER_ERROR
0x00000003
ADS_PRINTER_PAPER_JAM
0x00000004
ADS_PRINTER_PAPER_OUT
0x00000005
ADS_PRINTER_MANUAL_FEED
0x00000006
ADS_PRINTER_PAPER_PROBLEM
0x00000007
ADS_PRINTER_OFFLINE
0x00000008
ADS_PRINTER_IO_ACTIVE
0x00000100
ADS_PRINTER_BUSY
0x00000200
ADS_PRINTER_PRINTING..
0x00000400
ADS_PRINTER_OUTPUT_BIN_FULL
0x00000800
ADS_PRINTER_NOT_AVAILABLE
0x00001000
ADS_PRINTER_WAITING
0x00002000
ADS_PRINTER_PROCESSING
0x00004000
ADS_PRINTER_INITIALIZING
0x00008000
ADS_PRINTER_WARMING_UP
0x00010000
ADS_PRINTER_TONER_LOW
0x00020000
ADS_PRINTER_NO_TONER
0x00040000
ADS_PRINTER_PAGE_PUNT
0x00080000
ADS_PRINTER_USER_INTERVENTION
0x00100000’
ADS_PRINTER_OUT_OF_MEMORY
0x00200000
ADS_PRINTER_DOOR_OPEN
0x00400000
ADS_PRINTER_SERVER_UNKNOWN
0x00800000
ADS_PRINTER_POWER_SAVE
0x01000000
Интерфейс lADsResource
lADsResource::ADsPath
ОписаниеВозвращает характерное имя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsResource::Class
ОписаниеВозвращаетопределениеклассаобъекта связанного
объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsResource::Get
ОписаниеВозвращает значение из пространства имен на основе
имени
Поддерживаемый провайдер WinNT
СинтаксисGet(Name As String)
Тйп данныхVariant
lADsResource::GetEx
ОписаниеВозвращает единичное значение из многозначного
атрибута
Поддерживаемый провайдер WinNT
СинтаксисGetEx (Name As String)
Тип данныхVariant
lADsResource::GetInfo
ОписаниеЗагружает все значения свойства в кэш
Поддерживаемый провайдер WinNT
СинтаксисGetlnfo()
Тип данныхНет
lADsResource::GetInfoEx
ОписаниенЗагружаетопределенные свойства в кэш
Поддерживаемый провайдерWinNT
СинтаксисGetlnfoEx(PropertiesAsVariant, Reserved as
Long)
Тип данныхНет
LADsResource::GUID
ОписаниеВозвращает значение GUID связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхstring-
Только для чтенияДа
LADsResource::LockCount
ОписаниеВозвращает число блокировок ресурса
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияДа
LADsResource::Name
ОписаниеВозвращает относительное имя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияДа
LADsResource::Parent'
ОписаниеВозвращаетзначение ADsPath родительского объекта
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияДа
LADsResource::Path
ОписаниеВозвращает путь в файловой системе связанного ресурса
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияДа
LADsResource::Put
ОписаниеПозволяетзаполнить единичный атрибут на основе
имени
Поддерживаемый провайдер WinNT
СинтаксисPut(Name As String, Property As Variant)
Тип данныхНет
LADsResource::PutEx
ОписаниеПозволяет заполнить многозначное свойство на основе
имени
Поддерживаемый провайдер WinNT
СинтаксисPutEx (Controlcode As Long, Name As String,
Property As Variant)
Тип данныхНет
lADsResource: : Schema
Описание
Возвращает значение ADsPath схемы класса объекта для связанного объекта
Поддерживаемый провайдер
Тип данных'
Только для чтения
WinNT
String Да
lADsResource::Setinfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Записывает текущие значения свойств из кэша в каталог WinNT Setinfo()
Нет
lADsResource::User
Описание
Возвращает имя пользователя для текущего связанного ресурса
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String Да
lADsResource::UserPath
Описание
Возвращает значение ADsPath пользователя, ассоциированного с текущим связанным ресурсом
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Да
Интерфейс lADsService
lADsService::ADsPath
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает характерное имя связанного объекта
WinNT
String
Да
lADsService::Class
Описание
Возвращает определение класса объекта связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String Да
lADsService::Dependencies
ОписаниеУстанавливает имена служб или загруженных групп, кото
рые должны также загружаться при запуске этой службы
Поддерживаемый провайдер WinNT-
Тип данныхVariant
Только для чтенияНет
lADsService::DisplayName ■
ОписаниеУстанавливает отображаемое имя службы
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияНет
lADsService::ErrorControl
ОписаниеУстанавливаетдействияприсбоеслужбы
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияНет
Значения флага lADsService:
:ErrorControl
Флаг
Значение
ADS_SERVICE_ERROR_IGNORE
0x00000000■
ADS_SERVICE_ERROR_NORMAL
0x00000001
ADS_SERVICE_ERROR_SEVERE
0x00000002
ADS_SERVICE_ERROR_CRITICAL
0x00000003
lADsService::Get
ОписаниеВозвращает значение из пространства имен на основе
имени
Поддерживаемый провайдер WinNT
СинтаксисGet(Name As String)
Тип данныхvariant
lADsService:
:GetEx
Описание
Возвращает единичное значение из многозначного
атрибута
Поддерживаемый провайдер WinNT
Синтаксис
GetEx(Name As String)
Тип данных
Variant
lADsService:
:GetInfo■
Описание
Загружает все значения свойства в кэш
Поддерживаемый провайдер WinNT
Синтаксис
Getlnfo()
Тип данных
Нет
lADsService::GetInfoEx
ОписаниеЗагружает определенные свойства в кэш
Поддерживаемый провайдер WinNT
СинтаксисGetlnfoEx(Properties As Variant, Reserved as
Long)
Тип данныхНет
lADsService::GUID
ОписаниеВозвращает значение GUID связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsService::Hostcomputer
ОписаниеУстанавливает узел текущей связанной службы
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияНет
lADsService::LoadOrderGroup
ОписаниеУстанавливает порядок загрузки группы, используемой
с текущей связанной службой
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияНет
lADsService::Name
ОписаниеВозвращает относительное имя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияДа
lADsService::Parent
ОписаниеВозвращаетзначениеadsPathродительскогообъекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsService::Path
ОписаниеУстанавливаетпутькисполняемомуфайлу связанной
службы
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияНет
lADsService::Put
Описание
Позволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер
Синтаксис
Тип данных
WinNT
Put(Name As String, Property As Variant)
Нет
lADsService::PutEx
Описание
Позволяет заполнить многозначное свойство на основе имени
Поддерживаемый провайдер Синтаксис
WinNT
PutEx(ControlCode As Long, Name As String, Property As Variant)
Тип данных.
Нет
lADsService::Schema
Описание
Возвращает значение ADsPath схемы класса объекта для связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String-
Да
lADsService: : ServiceAccountName
Описание
Устанавливает имя пользователя учетной записи, используемой со службой
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Нет
lADsService::ServiceAccountPath
Описание
Устанавливает значение ADsPath учетной записи пользователя, используемое для аутентификации службы
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Нет
lADsService::ServiceType
Описание
Устанавливает тип процесса, в котором будет запущена связанная служба
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
Long Нет
Значения флага lADsService: : ServiceType
Флаг
Значение
ADS SERVICE KERNAL DRIVER
0x00000001
ADS_SERVICE_FILE_SYSTEM_DRIVER0x00000002
ADS_SERVICE_OWN_PROCESS
ADS_SERVICE_SHARE_PROCESS
0x00000010 '
0x00000020
lADsService::Setinfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Записывает текущие значения свойств из кэша в каталог
WinNT
Setinfo()
Нет .
lADsService::StartType
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает способ запуска службы
WinNT
Long
Нет
Значения флага lADsService: .StartType
Флаг
Значение
ADS_SERVICE_BOOT_START ADS_SERVICE_SYSTEM_START ADS_SERVICE_AUTO_START ADS_SERVICE_DEMAND_START ADS_SERVICE_DISABLED
0
1
2
3
4
lADsService::Startupparameters
Описание
Устанавливает аргументы, передаваемые службе при ее запуске
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Нет
lADsService::Version
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает информацию о версии службы
WinNT
String
Нет
Интерфейс IADs Serviceoperations
ZADsServiceOperations::ADsPath
ОписаниеВозвращает характерное имя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
ZADsServiceOperations::Class
ОписаниеВозвращает определение класса объекта связанного
объекта
Поддерживаемый провайдерWinNT
Тип данныхString■
Только для чтенияДа
ZADsServiceOperations::Continue
ОписаниеВозобновляет работу приостановленной службы
Поддерживаемый провайдерWinNT
СинтаксисContinue()
Тип данныхНет
ZADsServiceOperations::Get
ОписаниеВозвращаетзначение из пространства имен на осно
ве имени
Поддерживаемый провайдер WinNT
СинтаксисGet(Name AsString)
Тип данныхVariant
ZADsServiceOperations::GetEx
ОписаниеВозвращаетединичное значение из многозначного
атрибута
Поддерживаемый провайдер WinNT
СинтаксисGetEx(Name As String)
Тип данныхVariant
ZADsServiceOperations::GetZnfо
ОписаниеЗагружает все значения свойства вкэш
Поддерживаемый провайдер WinNT
СинтаксисGetlnfo()
Тип данныхНет
ZADsServiceOperations::GetZnfoEx
ОписаниеЗагружает определенные свойства в кэш
Поддерживаемый провайдер WinNT
СинтаксисGetlnfoEx(Properties As Variant, Reserved as
Long)
Тип данныхНет
ZADsServiceOperations::GUZD
ОписаниеВозвращает значение GUID связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
ZADsServiceOperations::Name
ОписаниеВозвращает относительное имя связанного объекта
Поддерживаемый, провайдер WinNT
Тип данныхstring
Только для чтения - Да
ZADsServiceOperations::Parent
ОписаниеВозвращает значение ADsPath родительского объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
ZADsServiceOperations::Pause
ОписаниеПриостанавливаетзапущеннуюслужбу
Поддерживаемый провайдер WinNT
СинтаксисPause ()
Тип данныхНет
ZADsServiceOperations::Put
ОписаниеПозволяетзаполнитьединичныйатрибутнаоснове
имени
Поддерживаемый провайдер WinNT
СинтаксисPut(Name As String, Property As Variant)
Тип данныхНет
ZADsServiceOperations::PutEx
ОписаниеПозволяет заполнить многозначное свойство на ос
нове имени
Поддерживаемый провайдер WinNT
СинтаксисPutEx (ControlCode As Long, Name As String,
Property As Variant)
Тип данныхНет
TADsServiceOperations::Schema
ОписаниеВозвращает значение ADsPath схемы класса объекта
для связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияДа
TADsServiceOperations::Setinfo
ОписаниеЗаписывает текущие свойства из кэша в каталог
Поддерживаемый провайдер WinNT СинтаксисSetinfo()
Тип данныхНет
TADsServiceOperations::SetPassword
ОписаниеУстанавливает новый пароль использования учетной
записи службы
Поддерживаемый провайдер WinNT
СинтаксисSetPassword(NewPasswordAs String)
Тип данныхНет
TADsServiceOperations::Start
ОписаниеЗапуск остановленнойслужбы
Поддерживаемый провайдер WinNT
СинтаксисStart ()
Тип данныхНет
TADsServiceOperations::Status
ОписаниеВозвращаетзначениетекущейсвязанной службы
Поддерживаемый провайдер WinNT Тип данныхLong
Только для чтенияДа
Значения флага TADsServiceOperations: : Status
Флаг
Значение
ADS_SERVICE_STOPPED
0x00000001
ADS_SERVICE_START_PENDING
0x00000002 .
ADS_SERVICE_STOP_PENDING
0x00000003
ADS_SERVICE_RUNNING
0x00000004
ADS_SERVICE_CONTINUE_PENDING
0x00000005
ADS_SERVICE_PAUSE_PENDING
0x00000006
ADS_SERVICE_PAUSED
0x00000007
ADS_SERVICE_ERROR
0x00000008
ZADsServiceOperations::Stop
ОписаниеОстанавливает запущенную службу
Поддерживаемый провайдер WinNT
Синтаксисstop()
Тип данныхНет
Интерфейс lADsSession
lADsSession::ADsPath
ОписаниеВозвращает характерное имя связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияДа
lADsSession::Class
ОписаниеВозвращает определение класса объекта связанного
объекта
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияДа
lADsSession::Computer
ОписаниеВозвращает имя компьютера клиента
Поддерживаемый, провайдер WinNT
Тип данныхstring
Только для чтенияДа
lADsSession::ComputerPath
ОписаниеВозвращаетзначение ADsPath компьютера клиента
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияДа
lADsSession::ConnectTime
ОписаниеВозвращаетколичество минут, прошедших с момента
запуска сессии
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияДа
lADsSession::Get'
ОписаниеВозвращает значение из пространства имен на осно
ве имени
Поддерживаемый провайдер WinNT
СинтаксисGet(NameAsString)
Тип данныхVariant
lADsSession::GetEx
ОписаниеВозвращаетединичное значение из многозначного ат
рибута
Поддерживаемый провайдер WinNT
СинтаксисGetEx(NameAsString)
Тип данныхVariant
lADsSession::GetInfo
ОписаниеЗагружает все значения свойства в кэш
Поддерживаемый провайдерWinNT
СинтаксисGetlnfo()
Тип данныхНет
lADsSession::GetInfoEx
ОписаниеЗагружает определенныесвойствав кэш
Поддерживаемый провайдерWinNT
СинтаксисGetlnfoEx(PropertiesAsVariant, Reserved as
Long)
Тип данныхНет
lADsSession::GUID
ОписаниеВозвращает значение GU1D связанного объекта
Поддерживаемый провайдер WinNT
Тип данныхString
Только для чтенияДа
lADsSession::IdleTime
ОписаниеВозвращает время простоя (в минутах) сессии
Поддерживаемый провайдер WinNT
Тип данныхLong
Только для чтенияДа
lADsSession::Name
ОписаниеВозвращаетотносительноеимясвязанногообъекта
Поддерживаемый провайдер WinNT
Тип данныхstring
Только для чтенияДа
lADsSession::Parent
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение ADsPath родительского объекта
WinNT
String
Да
LADsSession::Put
Описание
Позволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
WinNT
Put(Name As String, Property As Variant)
Нет
LADsSession::PutEx
Описание
Позволяет заполнить многозначное свойство на основе имени
Поддерживаемый провайдер Синтаксис
WinNT
PutEx(Controlcode As Long, Name As String, Property As Variant)
Тип данных
Нет
ZADsSession::Schema
Описание
Возвращает значение ADsPath схемы класса объекта для связанного объекта
Поддерживаемый провайдер Тип данных
Только для чтения
WinNT
String
Да
lADsSession::Setinfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Записывает текущие значения свойства из кэша в каталог WinNT
Setinfo()
Нет
lADsSession::User
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает имя сессии пользователя
WinNT
String
Да
lADsSession::UserPath
Описание
Возвращает значение ADsPath сессии объекта пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
String
Да
Интерфейс lADsUser
lADsUser::AccountDisabled
Описание
Устанавливает активизацию или деактивизацию учетной записи
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Boolean
Нет
lADsUser::AccountExpirationDate
Описание
Устанавливает дату и время, которые связаны со сроком действия учетной записи пользователя
Поддерживаемый провайдер Тип данных
Только для чтения
LDAP, WinNT
Date
Нет
lADsUser::ADsPath
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает характерное имя связанного объекта
LDAP, WinNT
String
Да
lADsUser::BadLoginAddress
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Получает адрес узла в системах Novell
Не поддерживается провайдерами LDAP или WinNT
String
Да
lADsUser::BadLoginCount
Описание
Возвращает число неверных попыток регистрации в системе после сброса счетчика попыток
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Long
Да
lADsUser::ChangePassword
Описание
Изменяет пароль для связанного объекта пользователя. Предполагается, что известен старый пароль, так что для выполнения этого действия не нужны права администратора
Поддерживаемый провайдер Синтаксис
LDAP, WinNT
ChangePassword(OldPassword As String, NewPass- word As String)
Тип данных
Нет
ZADsUser::Class
Описание
Возвращает определение класса объекта связанного объекта
Поддерживаемый провайдер Тип данных
Только для чтения
LDAP, WinNT
String
Да
ZADsUser::Department
Описание
Устанавливает имя подразделения или отдела организации, ассоциированного с объектом пользователя
Поддерживаемый провайдер Тип данных
Только для чтения
LDAP
String
Нет
ZADsUser::Description
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает описание для объекта пользователя
LDAP, WinNT■
String
Нет
ZADsUser::Division
Описание
Устанавливает подразделение в организации, ассоциированное с объектом пользователя
Поддерживаемый провайдер
Тип7 данных
Только для чтения
LDAP
String
Нет
ZADsUser::EmailAddress
Описание
Устанавливает адрес электронной почты, ассоциированный с объектом пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
ZADsUser::EmployeeZD
Описание
Устанавливает идентификационный номер сотрудника, ассоциированный с объектом пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
ZADsUser::FaxNumber
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает номер факса пользователя LDAP
String
Нет
554
Часть V. Приложения
lADsUser::FirstName
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает имя пользователя
LDAP
String
Нет
lADsUser::FullName
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает полное имя пользователя
LDAP, WinNT
String
Нет
lADsUser::Get
Описание
Возвращает значение из пространства имен на основе имени
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP, WinNT
Get(Name As String)
Variant
lADsUser::GetEx
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Возвращает единичное значение из многозначного атрибута
LDAP, WinNT
GetEx(Name As String)
Variant
LADsUser::GetInfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Загружает все значения свойства в кэш
LDAP, WinNT
GetlnfoO
Нет
LADsUser::GetInfoEx
Описание
Поддерживаемый провайдер
Синтаксис
Загружает определенные свойства в кэш
LDAP, WinNT
GetlnfoEx(Properties As Variant, Reserved as Long)
Тип данных
Нет
LADsUser::GraceLoginsAllowed
Описание
Устанавливает число разрешенных регистраций в системе, перед тем как пользователь должен изменить пароль, ассоциированный с этой учетной записью. Это свойство доступно только для провайдеров Novell
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдерами LDAP или WinNT
Long
Нет
LADsUser::GraceLoginsRemaining
Описание
Устанавливает число оставшихся регистраций в системе. Это свойство доступно только для провайдеров Novell
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдерами LDAP или WinNT
Long
Нет
LADsUser::Groups
Описание
Устанавливает членов группы для связанного объекта пользователя1
Поддерживаемый провайдер
Синтаксис
Тип данных
LDAP, WinNT
Groups() TADsMembers
lADsUser::GUID
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение GUID связанного объекта
LDAP, WinNT
String
Да
lADsUser::HomeDirectory
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает путь к личному каталогу пользователя
LDAP, WinNT
String
Нет
LADsUser::HomePage
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает адрес URL личной страницы пользователя LDAP
String
Нет
LADsUser::IsAccountLocked
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает блокировку учетной записи
LDAP, WinNT
Boolean
Нет (несмотря на это, данное свойство не может быть установлено в True)
lADsUser::Languages
Описание
Устанавливает массив языков, ассоциированных с объектом пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдерами LDAP или WinNT
Variant
Нет
556'
.Часть V. Приложения
lADsUser::LastFailedLogin
Описание
Возвращает дату и время последней неверной регистрации в сети
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
Date
Да
lADsUser::LastLogin
Описание
Возвращает дату и время последней успешной регистрации в сети
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Date
Да
lADsUser::LastLogoff
Описание
Возвращает дату и время последнего разрыва сетевого соединения
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Date
Да
lADsUser::LastName
Описание
Устанавливает фамилию, ассоциированную с объектом пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
LADsUser::LoginHours
Описание
Устанавливает время, когда объект пользователя может получить доступ
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Variant
Нет
lADsUser::LoginScript
Описание
Устанавливает путь к сценарию регистрации, ассоциированному с объектом пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
String
Нет
ZADsUser::Loginworkstations
Описание
Устанавливает массив рабочих станций или серверов, с которых объект пользователя может зарегистрироваться
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Variant
Нет
ZADsUser::Manager
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает имя диспетчера пользователей
LDAP
String
Нет
ZADsUser::MaxLogins
Описание
Устанавливает число одновременных регистраций в системах Novell
Поддерживаемый провайдер
Тип данных
Только для чтения
Не поддерживается провайдерами LDAP или WinNT
Long
Нет
ZADsUser::MaxStorage
Описание
Устанавливает максимальный объем диска (в Кбайт), который может поддерживать учетная запись пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Long
Нет
ZADsUser::Name
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает относительное имя связанного объекта
LDAP, WinNT
String
Да
ZADsUser::NamePrefix
Описание
Устанавливает префикс имени, ассоциированный с объектом пользователя (например, Mr., Mrs., Dr., Г-н, Г-жа)
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
ZADsUser::NameSuffix
Описание
Устанавливает префикс имени, ассоциированный с объектом пользователя (например Jr., Sr. или III)
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
558
Часть V. Приложения
lADsUser::OfficeLocations
Описание
Поддерживаемый провайдер
Тип данных
Устанавливает расположение офиса пользователя LDAP
Variant (Примечание'. Active Directory поддерживает только одно расположение офиса)
Только для чтения
Нет
lADsUser::OtherName
Описание
Устанавливает дополнительные имена пользователя, например отчество
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
String
Нет
lADsUser::Parent
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает значение ADsPath родительского объекта
LDAP, WinNT
String
Да
lADsUser::PasswordExpirationDate
Описание
Устанавливает дату окончания срока действия учетной записи пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Date
Нет
lADsUser::PasswordLastChanged
Описание
Возвращает дату и время последнего события изменения пароля, ассоциированного с объектом пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
Date
Да
lADsUser::PasswordMinimumLength
Описание
Устанавливает минимальную длину пароля объекта пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Long
Нет
lADsUser::PasswordRequired
Описание
Устанавливает возможность использования пустого пароля
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
Boolean
Нет
lADsUser::Picture
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Массив OctetString, содержащий изображение LDAP
Variant
Нет
lADsUser::PostalAddresses
Описание
Устанавливает почтовый адрес, ассоциированный с объектом пользователя. Адрес должен быть определен в виде восьми элементов по 30 байт в каждом, содержащих название улицы, необязательную вторую строку названия улицы, город или расположение, область или штат, почтовый индекс или код zip и страну
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
Variant
Нет
lADsUser::PostalCodes
Описание
Устанавливает массив почтовых кодов. В Active Directory это единственное значение
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
Variant
Нет
lADsUser::Profile
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает путь к каталогу с профайлом пользователя
LDAP, WinNT
String
Нет
lADsUser::Put
Описание
Позволяет заполнить единичный атрибут на основе имени
Поддерживаемый провайдер
Синтаксис Тип данных■
LDAP, WinNT
Put(Name As String, Property As Variant)
Нет
lADsUser: : PutEx
Описание
Позволяет заполнить многозначное свойство на основе имени
Поддерживаемый провайдер Синтаксис
LDAP, WinNT
PutEx(Controlcode As Long, Name As String, Property As Variant)
Тип данных
Нет
lADsUser::RequireUniquePassword
Описание
Устанавливает флаг, указывающий на то, что пользователь должен применять пароль, отличный от тех, которые хранятся в истории использования паролей
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
Boolean
Нет
lADsUser::Schema
Описание
Возвращает значение ADsPath схемы класса объекта для связанного объекта
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP, WinNT
String
Да
LADsUser: -.SeeAlso
Описание
Устанавливает массив дополнительных объектов, которые описывают текущий связанный объект пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP
Variant
Нет
lADsUser::Setinfo
Описание
Поддерживаемый провайдер
Синтаксис
Тип данных
Записывает текущие значения свойств из кэша в каталог
LDAP, WinNT
Setinfo()
Нет
LADsUser::SetPassword
Описание
Устанавливает новый пароль для объекта пользователя, не зная старого. Для выполнения этого действия необходимы права администратора
Поддерживаемый провайдер Синтаксис
Тип данных
LDAP, WinNT
SetPassword(NewPassword As String)
Нет
lADsUser: : TelephoneHome, lADsUser::TelephoneMobile, lADsUser::TelephoneNumber, lADsUser::TelephonePager
Описание
Устанавливают массив телефонных номеров, ассоциированных с объектом пользователя. В Active Directory эти свойства имеют единственное значение
Поддерживаемый провайдер
Тип данных
Только для чтения
LDAP■
Variant
Нет
lADsUser::Title
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Устанавливает должность пользователя
LDAP
String
Нет
Настраиваемые свойства провайдера WinNT
Следующие настраиваемые свойства провайдера WinNT доступны при использовании методов Get и Put интерфейса IADs.
lADsUser::HomeDirDrive
Описание
Устанавливает имя логического диска, присвоенное личной папке пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT'
String
Нет
lADsUser::ObjectSID
Описание
Устанавливает идентификатор безопасности, ассоциированный с объектом пользователя
Поддерживаемый провайдер
Тип данных
Только для чтения
WinNT
Octet String Нет
lADsUser::Parameters
Описание
Позволяет получить доступ к настраиваемым полям в поле параметров базы SAM. Обычно в этом поле хранятся путь к профайлу Terminal Server/Citrix и параметры RAS
Поддерживаемый провайдер Тип данных
Только для чтения '
WinNT
String Нет
562
Часть V. Приложения
lADsUser::PasswordAge
ОписаниеВозвращает продолжительность действия пароля для
текущего связанного объекта пользователя
Поддерживаемый провайдер WinNT
Гип данныхTime
Только для чтенияНет
lADsUser::PasswordExpired
ОписаниеВозвращаетцелоезначение, представляющее устаревание пароляучетной записи
Поддерживаемый провайдер WinNT
Гип данныхLong
Только для чтенияНет
lADsUser::PrimaryGroupID
ОписаниеУстанавливает основную группу идентификационного
номера для объекта пользователя
Поддерживаемый провайдер WinNT
Гип данныхLong
Только для чтенияНет
lADsUser::UserFlags
ОписаниеУстанавливает различные настраиваемые конфигура
ции для учетной записи пользователя, определенные ВADS_USER_FLAG
Поддерживаемый провайдер WinNT
Г^п данныхLong
Голько для чтенияНет
Значения флага lADsUser: : UserFlags
Флаг
Значение
Описание
ADS_UF_SCRIPT
0x0001
Выполнение сценария регистрации
ADS_UF_ACCOUNTDISABLE
0x0002
Отключение учетной записи
ADS_UF_HOMEDIR_REQUIRED
0x0003
Необходимость личного каталога
ADS_UF_LOCKOUT
0x0010
Разблокировка учетной записи
ADS_UF_PASSWD_NOTREQD
0x0020
Пароль не нужен
ADS_UF_PASSWD_CANT_CHANGE
0x0040
Запрещение пользователю изменять пароль
ADS_UF_ENCRYPTED_TEXT_PASSWORD_ ALLOWED
0x0080
Разрешение пользователю отправлять зашифрованный пароль
ADS_UF_TEMP_DUPLICATE_ACCOUNT
0x0100
Локальная учетная запись пользователя
ADS_UF_NORMAL_ACCOUNT
0x0200
Типичная учетная запись пользователя
ADS_UF_INTERDOMAIN_TRUST_ACCOUNT
0x0800
Устанавливает разрешения доверия учетной записи
ADS_UF_WORKSTATION_TRUST_ACCOUNT
0x1000
Учетная запись компьютера
Флаг
Значение
Описание
ADS_UF_SERVER_TRUST_ACCOUNT
0x2000
Учетная запись компьютера BDC
ADS_UF_DONTEXPIREPASSWORD
0x10000
Пароль не имеет срока действия
ADS_UF_MNS_LOGON_ACCOUNT
0x20000
Учетная запись MNS Logon
ADS_UF_SMARTCARD_REQUIRED
0x40000
Необходимо для регистрации использовать смарт-карту
ADS_UF_TRUSTED_FOR_DELEGATION
0x80000
Установка делегирования
ADS_UF_NOT_DELEGATED
0x100000
Отказ от делегирования
Интерфейс WinNTSysteminfo
Чтобы использовать интерфейс WinNTSystemlnfo с клиентом Windows 2000, рассмотрим следующий код Visual Basic:
Dim WinNTSysInfo As WinNTSystemlnfo
Set WinNTSysInfo = New WinNTSystemlnfo
Debug.Print WinNTSysInfo.ComputerName
Debug.Print WinNTSysInfo.DomainName
Debug.Print WinNTSysInfo.PDC
Debug.Print WinNTSysInfo.UserName
WinNTSystemlnfo:
:ComputerName
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает имя компьютера клиента
Только клиент Windows 2000
String
Да
WinNTSystemlnfo:
: DomainName
Описание
Поддерживаемый провайдер
Тип данных
Только для чтения
Возвращает текущий домен компьютера клиента
Только клиент Windows 2000
String
Да
WinNTSystemlnfo:
: PDC
Описание
Возвращает имя эмулятора PDC или PDC, ассоциированного с доменом компьютера клиента
Поддерживаемый провайдер
Тип данных
Только для чтения
Только клиент Windows 2000
String
Да
WinNTSystemlnfo:
: UserName
Описание
Возвращает имя пользователя, зарегистрировавшегося на компьютере клиента
Поддерживаемый провайдер
Тип данных
Только для чтения
Только клиент Windows 2000
String
Да
в
Дополнительные источники информации
В этом приложении приведены дополнительные источники информации по темам, с которыми вы можете столкнуться, читая эту книгу или применяя на практике полученные знания.
Совет
Помните, что основным и самым полным источником информации является Internet. А кроме того, здесь вы всегда сможете найти самые свежие материалы, которые вас интересуют.
Разработка и администрирование '
Active Directory
На эту тему существует огромное количество информации — как печатной, так и в электронном виде.
Ресурсы Web
По следующим адресам можно найти сведения о службе Active Directory:
Active Directory Overview Whitepaper (http://www.microsoft.com/windows/ server/Technical/directory/ADarch.asp);
Microsoft Windows 2000 Technical Information (http://www.microsoft.com/ windows/server/Technical/default.asp).
Книги
Blum, Daniel. Understanding the Active Directory Service. — Redmond : Microsoft Press, 1999 (ISBN: 1572317213).
Cone, Eric, Jon Boggs, and Sergio Perez. Planning for Windows 2000. — Indianapolis : New Riders, 1999 (ISBN: 0735700486).
Schwartz, Richard. Windows 2000: Active Directory Survival Guide. — New York : John Wiley & Sons, 1999 (ISBN: 047135600X).
Sheresh, Beth and Doug. Understanding Directory Services. — Indianapolis : New Riders, 1999 (ISBN: 0735700486).
Active Directory Service Interfaces (ADSI)
Необходимую дополнительную информацию об ADSI и программном управлении выбранным пространством имен можно найти как на узле Microsoft, так и на узлах сторонних разработчиков.
Ресурсы Web
Корпорация Microsoft
По следующим адресам можно найти библиотеки ADSI для Windows NT и Windows 9х, а также всю необходимую документацию:
основной источник информации об ADSI (http: //www.microsoft. com/adsi);
узел загрузки ADSI — библиотеки, ADSI SDK и ADSI Resource Kit (http:// www.microsoft.ccm/ntserver/nts/downloads/other/ADSI25/default.asp);
Примечание
ADSI SDK является частью ADSI Resource Kit.
справочный файл ADSI 2.5 (http://www.microsoft.com/ntserver/downloads/ bin/nts/adsi25.chm).
Ресурсы сторонних разработчиков
15 Seconds(http://www.15seconds.com/focus/ADSI.htm).
Win32 Scripting (http://cwashington.netreach.net/script_repository/ adsifaq. asp).
Книги
Hahn, Stephen. ADSIASP Programmer’s Reference. — Birmingham, UK : Wrox Press, 1998 (ISBN: 186100169X).
Kirkpatrick, Gil. Active Directory Programming. — Indianapolis : SAMS, 1999 (ISBN: 0672315874).*
Robinson, Simon. Professional ADSI Programming. — Birmingham, UK : Wrox Press, 1999 (ISBN: 1861002262).
Сценарии Active Server Page (ASP)
По этой теме существует множество источников информации. Приведем адреса лишь некоторых из них.
Ресурсы Web
15 Seconds(http://www.15seconds.com/focus/ADSI.htm).
ASP Alliance (http://www.aspalliance.ccm).
ASP Hole (http://www.asphole.com).’
ASP Today (http://www.asptoday.com).
developer.com (http://www.developer.com).
Learn ASP (http://www. learnasp.com).
Microsoft MSDN (http://msdn.microsoft.com)..
Win32 Scripting (http://cwashington.netreach.net/script_repository/ adsifaq. asp).
Книги
Anderson, Richard, Chris Blexrud, Andrea Chiarelli, et al. Professional Active Server Pages 3.0. — Birmingham, UK : Wrox Press, 1999 (ISBN: 1861002610).
Walther, Stephen. Active Server Pages 2.0: Unleashed. — Indianapolis: SAMS, 1999 (ISBN: 0672316137).
ActiveX Data Objects (ADO)
Для поиска в пространстве имен LDAP необходимо использовать ADO. Несмотря на то что эта тема практически полностью описана в MSDN, обязательно просмотрите следующие ресурсы.
Ресурсы Web
DevX — ответы профессионалов (http: //www. inquiry.com).
Microsoft Universal Data Access (http://www.microsoft.com/data).
Книги
Sussman, David. ADO 2.1 Programmer’s Reference. — Birmingham, UK : Wrox Press, 1999 (ISBN: 1861002688)..
Wille, Christoph. Teach Yourself ADO 2.5 in 21 Days. — Indianapolis : SAMS, 2000 (ISBN: 0672318733)..
Lightweight Directory Access Protocol (LDAP)
Чтобы получить дополнительные сведения на эту тему, обратитесь к следующим ресурсам.
Ресурсы Web
Поиск RFC, связанных с LDAP (http://www.rfc-editor.org/ rfcsearch.html)..
Netscape Directory Server Documentation (http://devedge.netscape.com/docs/ manuals/index.html?content=directory.html).
University of Michigan LDAP Project (http://www.umich.edu/~dirsvcs/ldap/).
Книги
Howes, Timothy and Mark Smith. Understanding and Deploying LDAP Directory Services. — Indianapolis : Macmillan Technical Publishing, 1998 (ISBN: 1578700701).
Wilcox, Mark. Implementing LDAP. — Birmingham, UK : Wrox Press Ltd, 1999 (ISBN: 1861002211).
Visual Basic
Большинство системных администраторов достаточно подробно знакомы с этим продуктом. Приведем лишь малую часть ресурсов, посвященных этому прекрасному средству обучения и создания высокоэффективных приложений.
Ресурсы Web
По следующим адресам можно найти дополнительные сведения о работе с Visual Basic или VBScript:
ASP Zone(http://www.aspzone.com);
developer.com (http://www.developer.com);
DevX (http: / /www. devx. com);
DevXinquiry.com (http://www.inquiry.com);
Microsoft MSDN Library (http://www.msdn. com);
VBScript Language Reference (http://msdn.microsoft.com/scripting/ default.htm?/scripting/VBScript/doc/VBSTOCAlt.htm);
Visual Basic Web Directory (http://www.vb-web-directory.com/).
Книги'
Appleman, Dan. Developing СОМ/ActiveX Components with Visual Basic 6. — Indianapolis : SAMS, 1998 (ISBN: 1562765760).
Halvorson, Michael. Microsoft Visual Basic 6.0 Professional Step by Step. — Redmond : Microsoft Press, 1998 (ISBN: 1572318090).
Lhotka, Rockford. Visual Basic 6.0 Business Objects. — Birmingham, UK : Wrox Press, 1999 (ISBN: 186100107X).'
McKinney, Bruce. Hardcore Visual Basic, Second Edition. — Redmond : Microsoft Press, 1997 (ISBN: 1572314222).
Pattison, Ted. Programming Distributed Application with COM and Microsoft Visual Basic 6.0. —' Redmond : Microsoft Press, 1998 (ISBN: 1572319615).
Wright, Peter. Beginning Visual Basic 6. — Birmingham, UK : Wrox Press, 1998 (ISBN: 1861001053).'
Предметный указатель
А
Access Control Entry (АСЕ), 116
Access Control List (ACL), 116; 240
Active Directory, 354
Active Directory Service Interface (ADSI), 21
Active Server Page (ASP), 32
ActiveX Data Object (ADO), 28
ADAdmin.DLL, 378
ADO, 339
ADsSecurity.DLL, 340
Attribute, 355
Attributes, 331
c
Component Object Model (COM), 33
СОМ-сервер, 41
D
Data Source Name (DSN), 192
Discretionary Access Control List (DACL), 241
Distinguished Name (DN), 332
Distributed Component Object Model (DCOM), 43
Domain, 355
E
Entry, 331
F
File Transfer Protocol (FTP), 295
Filter, 332
Forest, 355
G
Global catalog, 355
global.asa, 249
Globally Unique Identifier (GUID), 355
H
Hardware Abstraction Layer (HAL), 122
I
IIS Resource Kit, 183
HsAdmin.DLL, 317
Internet Information Server (IIS), 21
Internet Service Manager, 184
J
JavaScript, 21
К
Kerberos, 28
Key Manager, 262
Kixtart, 20
L
LOphtCrack, 76
LDAP Data Interchange Format (LDIF), 333
LDAPAdmin.DLL, 345
Lightweight Directory Access Protocol (LDAP), 21; 330
M
Microsoft Data Access Components (MDAC), 35
Microsoft Exchange 5.0, 21 •
Microsoft Exchange 5.5, 340
Microsoft IIS Log File Format, 190
Microsoft Knowledge Base, 100
Microsoft Management Console (MMC), 38; 262
Microsoft Transaction Server (MTS), 35
MIME, 188
MSExchAdmin.DLL, 349
N
NCSA Common Log File Format, 190
NDS ADSI, 21
Netscape Directory Server, 334
Netware Directory Service (NDS), 20
Network News Transfer Protocol (NNTP), 199
NTLM, 28
NWCOMPAT, 21
n-уровневая архитектура, 33
О
Object, 355
ODBC Logging, 190
OLE-DS, 21
Open Database Connectivity (ODBC), 23
Organization Unit (OU), 332; 355
P
Perl, 20
Platform for Internet
Content Selection (PICS), 270
R
Relative Distinguished Name (RDN), 332
Resource Kit, 121
Rexx, 21
RootDSE, 357
S
schemalDGuid, 378
Secure Sockets Layer (SSL), 77; 237
Security Identifier (SID), 63
Server Manager, 61
Simple Mail Transport Protocol (SMTP), 199
Site, 356
T
Tree, 356
u
UNC, 87,
Universal Naming Convention (UNC), 246 '
User Principal Name (UPN), 356
V
VBScript, 21
w
W3C Extended Log File Format, 190
Web-приложение, 25
WinBatch, 20
Windows DNA, 33
Windows Load Balancing Service (WLBS), 208
Windows Scripting Host (WSH), 21
X
X.500, 20; 331
A
Автоматизация управления системой, 25
Администрирование списка рассылки, 344
Адрес IP, 236; 298
Активизация исключительно анонимного
доступа, 325
Активный каталог, 21; 354
Альтернативная аутентификация, 358
Анонимное соединения, 301
Анонимный доступ, 260
Атрибут, 355
Атрибуты Active Directory, 362
Аутентификационная информация, 311
Аутентификация NTLM, 262
Б
Базовая аутентификация, 261
Безопасное соединение, 77; 237
Безопасность объектов в Active Directory, 366
Безопасные соединения, 262
Библиотеки ADSI 2.5, 37
Бизнес-логика, 22; 33
Бизнес-процесс, 72
В
Виртуальный каталог, 204
Возобновление печати после приостановки, 178
Возобновление работы узла, 209; 228
Восстановление метабазы, 185
Восстановление метабазы из резервной копии, 221
Восстановление печати заданий из очереди
печати, 163
Временной период регистрации, 193
Время ожидания, 300
Время ожидания соединения, 239
Время регистрации, 89
Выбор оптимальной длины пароля, 57
Г
Главное имя пользователя, 356
Глобальная группа, 64
Глобальный уникальный идентификатор, 355
Группа
глобальная, 64
локальная, 64
д
Дата истечения срока действия содержимого, 267
Дата последнего завершения работы, 97
Дата последней регистрации, 97
Делегирование модели администрирования, 43
Дерево, 356
Дискреционный список контроля доступа, 241
Добавление
зависимостей службы, 145
нового глобального типа MIME, 221
пользователей в группу, 111
пользователя к группе, 120
регистрации рабочей станции, 108
Домен, 355
Дополнительные свойства журнала, 192
Ж
Журнал 11S, 190
3
Зависимости службы, 126
Заголовки HTTP, 267
Заголовки узла, 236
Запись, 331
Запись контроля доступа, 116
Заполнение атрибутов объекта Active
Directory, 391
Запрещение доступа всем, за исключением
определенных адресов IP, 327
определенных доменов DNS, 327
определенных подсетей, 327
Запуск
службы, 135
узла, 208; 227
И
Идентификатор безопасности, 63
Идентификация Web-узла, 235
Изменение типа учетной записи, 108
Имя документа сервера IIS, 255
Имя зарегистрированного владельца, 123
Имя источника данных, 192
Имя компьютера, 130
Имя службы, 126
Интерфейс
IADs, 37
lADsComputer, 122
lADsContainer, 61; 361
lADsDomain, 50
lADsFileService, 147
lADsFileServiceOperations, 147
lADsFileShare, 147
lADsGroup, 114; 121
lADsOpenDSObject, 337; 358
lADsPrintJob, 147
lADsPrintJobOperations, 147
lADsPrintQueue, 147; 159
lADsPrintQueueOperations, 147; 161
lADsService, 122; 125
LADsServiceOperations, 122; 125; 134
lADsUser, 73; 121
IDispatch, 22
IlsComputer, 184
IlsFTPServer, 295
IlsFTPVirtualDir, 295
IlsWebServer, 199
прикладного программирования, 20
службы активного каталога, 21
Информационная модель, 331
К
Колонтитул документа, 257
Комментарий совместно используемого ресурса, 150
Контроль над объектами файловой системы, 117
Конфигурация приложения, 250
Корневая запись DS, 357
Кроссплатформенность, 21
Кэширование свойств, 26
Л
Лес, 355
Личный каталог, 73; 85; 245
Логика приложения, 33
Локальная группа, 64
Локальный личный каталог, 246; 309
м
Максимальное число подключений, 300
Максимальное число соединений, 238
Максимальный размер файла журнала, 194
Местоположение пользовательского профайла, 86
Метабаза, 21; 182
Метод
Add, 111
Continue, 209
Create, 153
DaleteBackup, 186
Delete, 154
EnumBackups, 185
Getlnfo, 27
IsMember, 113
MaxBandwidth, 186
Members, 116
MoveHere, 63; 365
Pause, 162; 209
Printjobs, 165
Purge, 166
Put, 338
Remove, 112
Restore, 185
Setinfo, 27; 37; 52
SetPassword, 76; 137
Start, 208
Status, 161
Stop, 208
аутентификации узла, 258
Минимальная длина пароля учетной записи, 98
Многокомпонентная модель объектов, 34
Модель
безопасности, 240; 333
Делегирования, 43; 375
имен, 332
Модификация атрибута объекта, 348
Модуль
ADObjectManagement, 378
ExchangeObjectMgt, 349
IIsFTPManagement, 317
IIsSiteManagement, 209
IIsWebManagement, 273 LDAPObjectManagement, 345 NTComputerManagement, 138 NTContainerManagement, 68
NTGroupManagement, 118 NTResourceManagement, 166 NTUserManagement, 101
H
Название операционной системы, 123
Наследование, 375
Наследование безопасности, 369
Наследование свойств, 230
О
Область наследования, 369
Общий каталог, 355
Объект, 355
Ограничение доступа на основе адресов IP, 265
Ограничения адресов IP, 315
Окно
Account Policy, 51
Services, 125
Операторы FTP-узла, 304
Операторы Web-узла, 241
Описание FTP.-узла, 298
Определение состояния блокировки учетной записи, 106 отключения учетной записи, 106
Организационный блок, 332; 355
Остановка службы, 136
Остановка узла, 208; 227
Отключение пользовательской сессии, 176
Отключение учетной записи, 107
Открытые ресурсы, 158
Относительное характерное имя, 332 Отображаемое имя службы, 128; 129 Очереди печати, 158
п
Пакет, 44
Параметр
Registerorganization, 123
RegisterOwner, 123
Параметры отладки ASP, 252
Параметры процесса, 251
Пароль пользователя, 76
Переименование
учетной записи пользователя, 71
объекта Active Directory, 365; 391
Перемещение объекта Active Directory, 391
Перенаправление HTTP URL, 253
Перечисление
. АСЕ в ACL Active Directory, 391 всех групп домена, 71
всех объектов домена, 71
всех пользователей в группе, 120
глобальных групп домена, 71
глобальных типов MIME, 221
доменов, 50
доменов, 70
локальных групп домена, 71
методов аутентификации ресурса, 288
объектов контейнера, 348
операторов узла, 288
открытых ресурсов на выбранном компьютере, 176
очереди печати на выбранном сервере, 176
пользователей домена, 71
регистрации рабочих станций, 108
резервных копий метабазы, 221
сессий, 176
служб, 145
совместно используемых ресурсов, 175
содержимого каталога, 226
узлов, 226
установленных служб, 144
учетных записей компьютеров домена, 71
элементов контейнера, 391
Поиск в каталоге, 339
Полное имя пользователя, 74
Полоса пропускания узла, 243
Пользовательский профайл, 85
Порт TCP, 237; 298
Почтовый ящик, 340
Права доступа к объекту каталога, 367
Преобразование типа учетной записи, 95
Приоритет задания печати, 164
Приостановка очереди печати, 162
Приостановка службы, 136
Приостановка узла, 209; 227
Проверка принадлежности пользователя к
группе, 120
Программное управление узлом, 199
Продолжение выполнения службы, 137
Производительность ADSI, 24
Просмотр
адреса IP и порта TCP FTP-узла, 325
активизации анонимного доступ, 325
активности ведения журнала виртуального
каталога, 326
активности ведения журнала провайдера, 222
активности ведения журнала, 221
активности исключительно анонимного дос
тупа, 325
версии операционной системы, 144
возможности использования пустого паро
ля, 107
времени задержки, 325
даты последнего выхода из системы, 107
даты последней регистрации, 107
зависимостей службы, 144
заданий печати, 163
имени компьютера службы, 144
имени компьютера, на котором находится совместно используемый ресурс, 176 имени логического диска, присвоенного подключенному личному каталогу, 107 имени пользователя удаленного виртуального каталога, 326
имени пользователя, используемого для анонимного доступа, 325
имени учетной записи службы, 144 комментариев к совместно используемому ресурсу, 175
конфигурации пользовательского заголовка HTTP, 293
максимального числа подключений к совместно используемому ресурсу, 176 максимального числа подключений, 324 максимальной полосы пропускания сервера, 221
местоположения совместно используемого ресурса, 176
месторасположения личного каталога, 107 месторасположения пользовательского профайла, 107
минимальной длины пароля, 107
названия операционной системы, 144 ограничений IP, 289; 327
ограничений на размер файла журнала, 222 операторов узла, 325
описания FTP-ума, 324
описания выбранной группы, 120
описания пользователя, 106
организации, 144
отображаемого имени службы, 144
пароля анонимного доступа, 325
пароля удаленного виртуального каталога, 326 периода обновления файла журнала, 222 подразделения, 144
полного имени пользователя, 106
пути виртуального каталога, 326
пути к исполняемому файлу службы, 144 разрешения на запись виртуального каталога, 326
разрешения на чтение виртуального каталога, 326
свойств
RootDSE, 390
документа и колонтитулов по умолчанию, 293
задания печати, 178
конфигураций SSL, 292
личного каталога, 290
приложения, 291
производительности, 289
свойств журнала ODBC, 225
свойств очереди печати, 176
синхронизации пароля, 325
сообщения о выходе FTP-ума, 326
сообщения о превышении числа подключе
ний FTP-ума, 326
сообщения-приветствия FTP-ума, 325
состояния очереди печати, 178
срока действия пароля, 107
срока действия учетной записи, 107
стиля отображения содержимого виртуаль
ного каталога, 326
сценария регистрации, 107
текущего числа подключений к совместно
используемому ресурсу, 175
типа запуска службы, 144
типа процессора, 144
типа учетной записи (локальная или гло
бальная), 107
уровней RSACi/PICS выбранного
ресурса, 293
условий временной регистрации, 107
установленного HAL, 144
числа неверных попыток регистрации в сис
теме, 107
Пространство имен, 23
Протокол передачи файлов, 295
Профайл, 73
Путь исполнения службы, 130
Р
Разделяемая модель администрирования, 366
Разрешение
анонимного доступа, 325
доверителю создавать пользовательские объ
екты в контейнере, 391
доступа всем, за исключением определенных
адресов IP, 327
доступа всем, за исключением определенных
доменов DNS, 327
доступа всем, за исключением определенных подсетей, 327
для доступа к каталогу, 311
Расположение совместно используемого ре
сурса, 152
Распределение памяти сервера, 242
Регистрация DLL-файла, 42
Регистрация событий узла, 190
Резервное копирование метабазы, 184
С
Сброс блокировки учетной записи, 107
Свойства соединения, 300
Свойство
AccessRead, 311
AccessWrite, 311
AccountDisabled, 82
AccountExpirationDate, 93
AdminACL, 241
Allow Anonymous, 302
AllowKeepAlive, 244
AnonymousOnly, 304
AnonymousPasswordSync, 260; 303
AnonymousUserName, 260; 303
AnonymousUserPass, 260; 303
AuthAnonymous, 259
AuthBasic, 259
AuthFlags, 259
AuthNTLM, 259
AutoUnlocklntreval, 52
Bad LoginCount, 96
BannerPage, 159
ConnectionTimeout, 239; 300
CurrentUserCount, 149
Datatype, 159
DefaultDoc, 256
DefaultJobPriority, 159
Description, 75; 114; 150; 159
DisplayName, 129
DontLog, 312
EnableDefaultDoc, 256
ExitMessage, 305
Filter, 60; 361
FullName, 73
GreetingMessage, 305
HomeDirDrive, 88
HostComputer, 130
HttpCustomHeaders, 267
HttpExpires, 267
HttpPics, 267
HttpRedirect, 253
IPSecurity, 265; 315
IsAccountLocked, 84
LastLogin, 97
LastLogoff, 97
Location, 160
LockoutObservationlnterval, 53; 54
LogFilePeriod, 193
LogFileTruncateSize, 194
LoginHours, 89
LoginScript, 86
LoginWorkstations, 90
LogType, 190
MaxBadPasswordsAllowed, 54
MaxBandwidth, 243
MaxClientsMessage, 305; 308
MaxConnections, 238; 300
MaxPasswordAge, 55
MaxUserCount, 151
MimeMap, 267
MinPasswordAge, 56
MinPasswordLength, 57
Model, 160
MSDOSDirOutput, 313
Name, 158; 160; 165
OperatingSystemVersion, 124
Parameters, 96
PasswordHistoryLength, 58
PasswordMinimumLength, 98
PasswordRequired, 98
Path, 130; 152; 204; 246; 309; 310
PrintDevice, 160
PrintDevjces, 160
PrinterPath, 160
PrintProcessor, 160
Priority, 160
Processor, 124
ProcessorCount, 124
Profile, 86
Secure Bindings, 237
ServerBindings, 201; 236; 299
ServerComment, 199; 235; 298
ServerSize, 243
ServerState, 207
ServiceAccountName, 132; 138
ServiceStart, 132
StartTime, 160
UNCPassword, 246; 310
UNCUserName, 246; 310
UntilTime, 160
UserFlags, 78
Связывание
группы, 111
объектов в Active Directory, 356
пользовательского объекта, 73
Сертификат Х.509, 262
Системный реестр, 27
Служба RSACi, 271
Смена пароля пользователь, 77
Совместно используемый ресурс, 148
Создание
виртуального каталога, 227
глобальной группы, 70
записи каталога Web в метабазе, 227
записи файла Web в метабазе, 227
локальной группы, 70
нового почтового яшика Exchange, 340; 352
нового совместно используемого ресурса, 176
общего объекта в пространстве имен, 348
объекта Active Directory, 391
резервной копии метабазы, 221
узлов, 226
учетной записи компьютера, 70
учетной записи пользователя, 70
Сокрытие процесса документооборота, 24
Сообщение о выходе, 307
Сообщение о превышении числа подключений, 308
Сообщение-приветствие, 306
Сообщения FTP-узла, 305
Состояние
очереди печати, 161
перенаправления, 254
службы, 134
узла, 207
Сохранение соединения HTTP, 244
Списки рассылки, 343
Список групп домена, 116
Список контроля доступа, 116; 240
Список служб, 125
Срок действия пароля пользователя, 99
Срок действия учетной записи, 93
Стандарт присвоения имен, 25
Стиль отображения списка каталога, 312
Структура метабазы, 183
Сценарии ASP, 252
т
Тип
запуска службы, 132
процессора, 124
учетной записи, 94
Типы
MIME, 188; 272
данных, 33
элемента контроля доступа, 368
У
Удаление
АСЕ Active Directory, 391
ветви Active Directory, 391
виртуального каталога, 227
всех заданий из очереди печати, 178
всех заданий печати, 166
глобального типа MIME, 221
группы, 70
задания из очереди печати, 165; 179
записи каталога Web в метабазе, 227
записи файла Web в метабазе, 227
объекта Active Directory, 391
объекта из пространства имен LDAP, 348
объектов из Active Directory, 364 пользователя из группы, 112; 120 регистрации рабочей станции, 108 резервной копии метабазы, 221 совместно используемого ресурса, 153 совместно используемого файлового ресурса, 176
существующего почтового ящика Exchange, 343; 352
учетной записи компьютера, 70
учетной записи пользователя, 70
Удаленный личный каталог, 246; 310
Узел, 356
Универсальное соглашение об именах, 246 Управление дескриптором безопасности объекта Active Directory, 369
Упрощенный протокол для доступа к каталогу, 21
Упрощенный протокол доступа к каталогу, 330
Уровень аппаратных абстракций, 122
Уровень отображения, 184
Уровни метабазы IIS, 295
Уровни оценок содержимого, 270
Условия блокировки, 84
Установка
активности ведения журнала провайдера, 222
активности ведения журнала, 221
возможности использования пустого пароля, 108
имени логического диска, присвоенного подключенному личному каталогу, 108 максимальной полосы пропускания сервера, 221
месторасположения личного каталога, 108 месторасположения пользовательского профайла, 107
нового описания выбранной группы, 120
ограничений на размер файла журнала, 223
описания пользователя, 107
пароля пользователя, 108
периода обновления файла журнала, 222
полного доступа для объекта Active
Directory, 391
полного имени пользователя, 107
свойств журнала ODBC, 225
срока действия пароля, 108
срока действия учетной записи, 108
сценария регистрации, 108
Учетная запись
компьютера, 61
пользователя, 62
пользователя для анонимного доступа, 303
службы, 131
Ф
Файл
IIsAdmin.DLL, 209
NTAdmin.DLL, 65
VBRUNxxx.DLL, 32
Файлы формата обмена данных LDAP, 333
Фильтр, 332
Формат активного журнала, 191
Функциональная модель, 332
X
Характерное имя, 332
ч
Число неверных попыток регистрации, 53
Числовой индекс узла, 200
ш
Шаблон проекта Visual Basic, 35
Ширина полосы пропускания, 186
э
Экземпляр СОМ-объекта, 42
Учебное пособие
Томас Экк
Сценарии ADSIдля системного администрированияWindows NT/2000
Издательский дом “Вильямс”.101509, Москва, ул. Лесная, д. 43, стр. 1.Изд. лиц. ЛР № 090230 от 23.06.99Госкомитета РФ по печати.
Подписано в печать 19.09.2000. Формат 70Х100/16.Гарнитура Times. Печать офсетная.
Усл. печ. л. 46,44. Уч.-изд. л. 25,6.
Тираж 5000 экз. Заказ № 1843.
Отпечатано с диапозитивов в ГПП «Печатный двор»Министерства РФ по делам печати,телерадиовещания и средств массовых коммуникаций.197110, Санкт-Петербург, Чкаловский пр., 15.
СЦЕНАРИИ ADSI СПЯ СИСТЕМНОГО АДМИНИСТРИРОВАНИЯ WINDOWS МТ/2000.
Puc. 10.5. Вкладка Home Directory диалогового
окна Default FTP Site Properties (выбран удален-
ный компьютер)