Рубрика:
Администрирование /
Администрирование
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
Иван Коробко
Программное управление MS Exchange
Управление ящиками Microsoft Exchange является очень важным разделом в автоматизации процесса управления учетными записями пользователей. Рассмотрим подробнее процедуры создания и удаления почтовых ящиков.
В крупных организациях каждому пользователю даются индивидуальные привилегии. Подключение сетевых дисков, необходимых для работы баз данных, сетевых принтеров, создание почтового ящика. Все это требует значительных усилий, затраченных на администрирование. Регулярное использование мастеров, сценариев регистрации пользователей и другие меры позволят автоматизировать процессы в сети.
Рассмотрим подробнее процесс автоматизированного управления почтовыми ящиками. Для удаленного управления Microsoft Exchange на рабочей станции должно быть предустановленно соответствующее программное обеспечение.
Необходимые компоненты
Для удаленного управления почтовым ящиком необходимо зарегистрировать COM-объект Microsoft CDO for Exchange Management Library (CDOEX) на рабочей станции, с которой осуществляется запуск сценария.
Для этого на компьютере необходимо установить следующие компоненты:
- Microsoft Admin Pack для Windows Server. Для Microsoft Exchange 2000 и 2003 клиентом может быть одна из следующих операционных систем: Windows 2000, XP, 2003. Microsoft Admin Pack для Windows 2003 Server можно загрузить с сайта Microsoft [3]. Этот компонент необходим для установки Microsoft Exchange.
- Microsoft Exchange System Management Tools. Этот пакет – составная часть Microsoft Exchange 2000/2003, которая в развернутом виде занимает около 100 Мб. Несмотря на то что библиотека Interop.CDOEXM.dll присутствует в «развернутом виде», необходимо установить System Management Tools, так как в процессе установки осуществляется ее регистрация как псевдо COM-объекта. Без этой процедуры ее невозможно использовать в VBScript-сценариях.
Установка Microsoft Admin Pack для Windows Server 2003
После того как Microsoft Admin Pack загружен с сайта Microsoft [3], необходимо его установить. Процесс установки проходит без каких-либо трудностей, поэтому подробно его описывать не буду.
Установка Microsoft Exchange: Management Tools
Чтобы запустить процесс установки Microsoft Exchange 2003 в каталоге %CD-ROM%/setup/i386 необходимо дважды кликнуть на файл setup.exe. В появившемся диалоговом окне (см. рис. 1) нужно выбрать напротив Microsoft Exchange метод установки Custom, а напротив Microsoft Exchange System Management Tools – Install. Затем нажмите кнопку «Далее» для продолжения установки.
Рисунок 1. Установка Microsoft Exchange System Management Tools
Замечание: если на компьютере отсутствует Microsoft Admin Pack, то процесс установки Microsoft Exchange будет прерван. На экране будет отображено соответствующее информационное сообщение.
MailBox в Active Directory
Точкой входа в любой домен служит виртуальный объект RootDSE, определенный в RFC 2251 как часть спецификации LDAP версии 3. Каждый контроллер домена самостоятельно поддерживает этот искусственный объект, являющийся вершиной логического пространства имен, по которому осуществляется поиск с помощью провайдера LDAP. Для подключения к RootDSE используется бессерверное анонимное подключение: определение доступного пространства имен осуществляется локатором контроллеров домена. Объект включает в себя около двух десятков свойств. Для создания и управления ящиками необходимо использовать некоторые из них:
- rootDomainNamingContext. Значение этого параметра – имя домена. Пример: DC=msk, DC=ru.
- defaultNamingContext. По умолчанию совпадает со значением rootDomainNamingContext.
- configurationNamingContext. С помощью этого пространства имен осуществляется доступ к текущей конфигурации домена Active Directory. Пример: CN=Configuration,DC=msk,DC=ru.
Один из первых двух параметров (rootDomainNamingContext или defaultNamingContext) необходим для определения местоположения учетной записи пользователя в Active Directory, с почтовым ящиком которого будут производиться манипуляции. Второй – configurationNamingContext – используется для непосредственного управления почтовым ящиком пользователя.
Идентификатор почтового ящика – текстовый параметр homeMDBBL, находящийся в контейнере: CN=Mailbox Store (ServerName),CN=First Storage Group,CN=Information Store,CN=ServerName,CN=Servers,CN=ShortDomain-Mail,CN=Administrative Groups,CN=FirmName,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=***,DC=***,DC=***. Значение параметра – путь к учетной записи пользователя в домене в LDAP-формате.
При создании сценария путь к контейнеру можно задать двумя способами: жестко в теле сценария или определить местоположение CN=Mailbox Store (ServerName) в контейнере Configuration. Настоятельно рекомендуется использовать второй способ.
Операции с почтовым ящиком
С почтовым ящиком могут быть осуществлены следующие операции (см рис. 2):
- Создание почтового ящика пользователя (Create MailBox);
- Создание почтового адреса (Establish E-mail Address);
- Удаление атрибутов Exchange (Remove Exchange Attributes);
- Перемещение почтового ящика (Move MailBox);
- Удаление почтового ящика (Delete MailBox);
- Изменение параметров (Configure Exchange Features).
Рисунок 2. Операции с почтовым ящиком
Остановимся подробнее на выполнении основных операций с почтовым ящиком: создание, удаление и изменение свойств его почтового ящика. Рассмотрим каждую из операций последовательно на двух языках программирования: компилируемом (VB.NET) и интерпретируемом (VBscript). Для наглядности используем языки из одного семейства – Visual Basic.
Замечание: сценарий должен быть запущен с административными правами на рабочей станции или сервере, где установлен компонент Microsoft CDO for Exchange Management Library.
Создание учетной записи пользователя
Рассмотрим алгоритм работы сценария, который создает почтовый ящик заданному пользователю на VBScript и VB.NET. Его работу условно можно разделить на несколько этапов:
- создание соединения с Active Directory и определение местоположения учетной записи пользователя (поле distinguishedName) в контейнере домена;
- создание соединения с помощью контейнера Configuration, определение местоположение хранилища Exchange (поле distinguishedName);
- установка связи (link) между учетной записью пользователя и хранилищем Exchange в контейнере Configuration, создание почтового ящика (mailbox).
Предлагаю перейти к реализации алгоритма на практике.
Создание соединения с Active Directory и определение местоположения учетной записи пользователя
На первом этапе работы сценария, созданного на языке VBScript, определяют имя текущего домена (см. листинг 1). Для этого используется виртуальный объект RootDSE, который был рассмотрен ранее.
Листинг 1. Определение имени текущего домена (VBScript)
Set obj1=GetObject("LDAP://RootDSE")
domain="LDAP://" +obj1.Get("defaultNamingContext")
Затем используют провайдер ADsDSOObject, получают доступ к пространству имен Active Directory c помощью ADODB-соединения (см. листинг 2). COM-объект ADODB является стандартным и зарегистрирован на любой рабочей станции. Создавая соединение желательно отключить кэширование результатов поиска в Active Directory (последняя строка листинга 2). Эта мера позволит увеличить достоверность получаемых результатов, однако немного снизит скорость работы сценария. При выключенном режиме кэширования скорость работы сценария будет уменьшаться на 2-3 минуты. За это время будет обработано около 1000-1500 почтовых ящиков. Необходимо отметить, что приведенные цифры ориентировочны. Скорость выполнения сценария зависит от производительности сети, загрузки серверов и других факторов.
Листинг 2. Создание ADODB-соединения с Active Directory (VBScript)
Set objConnection = CreateObject("ADODB.Connection")
Set objCommand = CreateObject("ADODB.Command")
objConnection.CommandTimeout = 120
objConnection.Provider = "ADsDSOObject"
objConnection.Open "Active Directory Provider"
Set objCommand.ActiveConnection = objConnection
objCommand.properties("Cache Results")=False
После создания соединения можно перейти непосредственно к определению местоположения учетной записи пользователя в домене, используя метод Execute, предварительно составив SQL-запрос (см. листинг 3). Для составления эффективных SQL-запросов необходимо знать названия считываемых свойств, соответствующие им типы данных и примерные их значения. Названия параметров, их значения и типы данных объектов Active Directory (см. рис. 3) можно узнать с помощью программы Softerra LDAP Browser 2.6 [4].
Листинг 3. Поиск объектов в SQL (VBScript)
Set sql=objconnection.execute("SQL_QUERY")
UserDN = Sql.Fields("distinguishedName").Value
где SQL_QUERY – запрос SQL.
Рисунок 3. Внешний вид LDAP Browser 2.6.
Для создания почтового ящика необходимо «привязать» учетную запись пользователя к создаваемому ящику. Для этого необходимо знать расположение учетной записи пользователя (свойство distinguishedName) в Active Directory. Для составления соответствующего SQL-запроса необходимо использовать следующие параметры:
- distinguishedName – описывает местоположение учетной записи пользователя в LDAP-формате;
- samaccountname='Login' – имя пользователя в сети (login). Это ключевое значение, по которому ведется поиск. Имя в сети уникально;
- objectClass='user' and NOT objectClass='computer' – учетная запись пользователя относится к классу «user» и не входит в класс «computer». Этот фильтр используется для ускорения процедуры поиска.
SQL-запрос после подстановки значений:
Листинг 4. SQL-запрос поиска distinguishedName по указному сетевому имени пользователя (VBScript)
Select * from ("SELECT distinguishedName FROM '" & Domain & " ' WHERE samaccountname='"+LoginName+"' and objectClass='user' and NOT objectClass='computer'"
где domain – имя домена в формате LDAP://DC=…,DC=…
После того как запрос выполнен с помощью метода Execute, необходимо считать найденный параметр (см. листинг 3, строка 2). В VB.NET процедура поиска объекта может быть также реализована с помощью ADODB-соединения, однако рекомендуется использовать метод с большей производительностью на основе библиотеки System.DirectoryServices NET.Framework. На первом этапе необходимо создать точку входа, обращаясь к виртуальному объекту RootDSE. Определив значение свойства defaultnamingcontext, получают имя текущего домена:
Листинг 5. Определение имени текущего домена (VB.NET)
Dim a As New DirectoryEntry("LDAP://rootdse")
Dim domain As String = "LDAP://" + a.Properties("defaultNamingContext").Value
На следующем этапе осуществляется вызов метода DirectorySearcher() и задание параметров листинга. Среди них можно выделить как обязательные, определение точки входа и фильтр (см. листинг 6, строка 2 и 4), так и необязательные. Все необязательные параметры имеют значения по умолчанию.
Листинг 6. Поиск объектов в SQL (VB.NET)
Dim sobj As New DirectorySearcher()
sobj.SearchRoot = New DirectoryEntry(domain)
sobj.SearchScope = SearchScope.Subtree
sobj.Filter = "(&(samaccountname=" + findemail + "))"
Dim ss As SearchResult
ss = sobj.FindOne()
Dim DNUser As String = "LDAP://" + ss.Properties("distinguishedName")(0)
Затем, после определения критериев поиска, осуществляется поиск с помощью одного из двух методов. Если осуществляется поиск одного объекта, то используется метод FindOne(), если нескольких – FindAll(). Синтаксис вызова методов незначительно отличается.
Поскольку учетная запись пользователя в домене уникальна, то разумнее использовать метод FindOne() (см. листинг 6, строка 5-6). После того как процедура поиска завершена с помощью свойства .Properties("distinguishedName")(0), считывают значение параметра.
Создание соединения с хранилищем Exchange, определение его местоположения в контейнере Configuration
Хранилище почтовых ящиков Exchange в Active Directory располагается в контейнере Configuration: CN=Mailbox Store (ServerName),CN=First Storage Group,CN=Information Store,CN=ServerName,CN=Servers,CN=ShortDomain-Mail,CN=Administrative Groups,CN=FirmName,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=***,DC=***,DC=***…
Поиск параметра CN=Mailbox Store (ServerName) осуществляется по описанному в предыдущем разделе алгоритму. Изменяется лишь контейнер, в котором осуществляется поиск (см. листинги 7а, 7б) и SQL-запрос (см. листинги 8а, 8б). Путь к контейнеру определяется с помощью одного из свойств объектов RootDSE: rootDomainNamingContext или в defaultNamingContext. На практике используют параметр defaultNamingContext. Для определения местоположения контейнера Configuration используется параметр configurationNamingContext.
Листинг 7а. Определение местоположения контейнера Configuration (VBScript)
Set obj1=GetObject("LDAP://RootDSE")
domain="LDAP://" +obj1.Get("configurationNamingContext ")
Листинг 7б. Определение местоположения контейнера Configuration (VB.NET)
Dim a As New DirectoryEntry("LDAP://rootdse")
Dim domain As String = "LDAP://" + a.Properties("configurationNamingContext").Value
Как отмечалось ранее, критерий поиска также изменяется. В сценарии на VBScript изменяется SQL-запрос (см. листинг 8а), в листинге на VB.NET – фильтр поиска (см. листинг 8б, строка 1, 2 и 8).
Листинг 8а. SQL-запрос определения местоположения Exchange-хранилища (VBScript)
Set exchange=objconnection.execute("SELECT distinguishedName FROM '" & configuration & "' WHERE cn='"+FindConfPath+"'")
StoreDN = exchange.Fields("distinguishedName").Value
где FindConfPath= "CN=Mailbox Store (" + ServerName + ") ".
Листинг 8б. Поиск объектов в SQL (VB.NET)
Public ExchangeServer = "MAIL_SERVER_NAME"
Dim findconfpath As String = "Mailbox Store (" + ExchangeServer + ")"
Dim m As New DirectoryEntry("LDAP://rootdse")
Dim conf As String = "LDAP://" + m.Properties("configurationnamingcontext").Value
Dim mobj As New DirectorySearcher()
mobj.SearchRoot = New DirectoryEntry(conf)
mobj.SearchScope = SearchScope.Subtree
mobj.Filter = "(&(cn=" + findconfpath + "))"
mobj.PropertiesToLoad.Add("distinguishedName")
Dim ms As SearchResult
ms = mobj.FindOne()
Установка взаимосвязи между объектами и создание почтового ящика
Для установки взаимосвязи между учетной записью пользователя и хранилищем почтовых ящиков используется LDAP-путь (distinguishedName) учетной записи пользователя. При создании почтового ящика соответствующая запись появляется в Active Directory в контейнере Configuration. В результате действия сценария (см. листинги 9а, 9б) в нем создается учетная запись почтового ящика, в которой фигурирует имя учетной записи пользователя, к которой привязан ящик.
Замечание: в листинге 9а объект CDOEX не используется явным образом, однако соответствующая библиотека должна быть зарегистрирована на рабочей станции, с которой выполняется сценарий.
Листинг 9а. Создание почтового ящика (VBScript)
Set User = GetObject("LDAP://" & UserDN)
Set Mailbox = User
Mailbox.CreateMailbox StoreDN
User.SetInfo
Листинг 9б. Создание почтового ящика (VB.NET)
Dim deMail As New DirectoryEntry(DNUser)
If Not deMail Is Nothing Then
Dim mailboxStore As IMailboxStore
mailboxStore = CType(deMail.NativeObject, IMailboxStore)
mailboxStore.CreateMailbox(ms.Path)
deMail.CommitChanges()
Else
MsgBox("MailBox Exists")
End If
Полную версию сценария, осуществляющего создание почтового ящика, на VBScript и на VB.NET, смотрите на сайте журнала www.samag.ru в разделе «Исходный код».
Удаление почтового ящика
Процедура удаления почтового ящика пользователя сводится к вызову метода – .DeleteMailBox. Алгоритм работы сценария следующий (см. листинги 10а, 10б): подключившись к Active Directory с помощью провайдера ADsDSOObject, осуществляют поиск учетной записи пользователя (distinguishedName) по заданному значению, например, логину (samaccountname). Затем с помощью GetObject() получают доступ к свойствам и методам объекта. Для удаления почтового ящика вызывают последовательно методы DeleteMailBox и SetInfo. Полный листинг сценария смотрите на сайте журнала www.samag.ru в разделе «Исходный код».
Листинг 10а. Создание почтового ящика (VBScript)
Set User = GetObject("LDAP://" & UserDN)
User.DeleteMailBox
User.SetInfo
Замечание: метод .SetInfo всегда вызывается после вызова какого-либо метода для записи данных в базу Active Directory.
По сравнению с функцией создания учетной записи пользователя в Active Directory на языке VB.NET листинг функции, в которой осуществлено удаление почтового ящика, претерпевает следующие изменения. Во-первых, нет необходимости определять местоположение хранилища почтовых ящиков Exchange в Active Directory. Этот фрагмент листинга можно удалить. Во-вторых, вместо метода mailboxStore.CreateMailbox(ms.Path) осуществляется вызов другого метода: mailboxStore.DeleteMailbox() (см. листинг 10б). Все остальные строки остаются без изменений. Полный текст листинга функции удаления почтового ящика пользователя на языке VB.NET смотрите на сайте журнала www.samag.ru в разделе «Исходный код».
Листинг 10б. Создание почтового ящика (VB.NET)
Dim DNUser As String = "LDAP://" + ss.Properties("distinguishedName")(0)
Dim deMail As New DirectoryEntry(DNUser)
If Not deMail Is Nothing Then
Dim mailboxStore As IMailboxStore
mailboxStore = CType(deMail.NativeObject, IMailboxStore)
mailboxStore.DeleteMailbox()
deMail.CommitChanges()
Else
MsgBox("User Not Found")
End If
Изменение свойств почтового ящика
Свойства почтового ящика можно изменить с помощью библиотеки CDOEX и классическим способом, используя GetObject(). Предпочтительным вариантом является использование GetObject() из-за своей простоты. Приведу в листинге 11 общий шаблон сценария изменения свойств почтового ящика учетной записи пользователя. Под буквой «а» – листинг на VBScript, под буквой «б» – на VB.NET.
Листинг 11a. Изменение свойств почтового ящика (VBScript)
…
UserDN = Sql1.Fields("distinguishedName").Value
Set User = GetObject("LDAP://" & UserDN)
User.put "mDBOverQuotaLimit", "600"
User.SetInfo
где mDBOverQuotaLimit – изменяемое свойство (список полей см. в Softerra LDAPBrawser 2.6), а 600 —присваиваемое значение.
Листинг 11б. Изменение свойств почтового ящика (VB.NET)
…
Dim DNUser As String = "LDAP://" + ss.Properties("distinguishedName")(0)
Dim User = GetObject("LDAP://" & DNUser)
User.put("mDBOverQuotaLimit", "600")
User.SetInfo()
Приведу в таблице список некоторых параметров почтового ящика. Полный листинг изменения свойств почтового ящика пользователя смотрите на сайте журнала www.samag.ru в разделе «Исходный код».
Список некоторых параметров почтового ящика
Параметр
|
Тип данных
|
Описание
|
submissionContLength
|
Строка
|
Максимальный размер письма (Кб), которое может быть отправлено пользователем
|
delivContLength
|
Строка
|
Максимальный размер письма (Кб), которое может быть принято пользователем
|
mDBStorageQuota
|
Строка
|
В случае превышения указанного размера ящика в (Кб) пользователю высылается письмо, содержащее информацию о свободном месте почтового ящика
|
mDBOverQuotaLimit
|
Строка
|
При достижении размера почтового ящика, указанного в (Кб) , пользователь не сможет отправлять письма
|
mDBOverHardQuotaLimit
|
Строка
|
При достижении размера почтового ящика, указанного в (Кб), пользователь не сможет отправлять и принимать письма
|
proxyAddresses
|
Массив
|
Элементы массива – алиасы почтового ящика пользователя
|
mailNickname
|
Строка
|
Короткое имя, которое с помощью программы-клиента может быть расшифровано в полноценный адрес
|
mail
|
Строка
|
Оригинальный почтовый адрес
|
proxyAddresses
|
Строка
|
Адрес прокси-сервера
|
Заключение
Прочитав эту статью, вы сможете не только усовершенствовать сценарий регистрации пользователей в сети, который будет «следить» за состоянием почтового ящика пользователя, регистрирующегося в сети, но и написать мастер создания учетной записи пользователя в сети.
- KB 304718. «How to use the Administration Tools Pack to remotely administer computers that are running Windows Server 2003, Windows XP, or Windows 2000» – http://support.microsoft.com/?kbid=304718.
- KB 327079. «How to programmatically create a mailbox for an existing user in the Active Directory by using CDOEXM» – http://support.microsoft.com/kb/327079.
- Windows Server 2003 SP1 Administration Tools Pack – http://download.microsoft.com/download/6/8/1/681c9ba7-380f-4756-ac85-a3323437e6c3/WindowsServer2003-KB304718-AdministrationToolsPack.exe.
- Softerra LDAP Browser 2.6 – http://download.softerra.com/files/ldapbrowser26.msi.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|