В первой части моей статьи о написании скриптов обсуждался доступ и поиск объектов Exchange сервера, таких как пользователи и контакты в Active Directory. Вторая часть статьи посвящена созданию новых объектов и наиболее важному атрибуту Exchange — адресу электронной почты(e-mail).
Читайте:
- Разработка скриптов для Exchange с использованием VBScript и ADSI (Часть 1)
- Разработка скриптов для Exchange с использованием VBScript и ADSI (Часть 3)
Создание
Вы можете использовать ADSI для доступа к объекту и для создания объекта, но если вовлекаются операции Exchange, такие как, создание пользователя с разрешением использовать электронный почтовый ящик, то такие операции не могут быть произведены, используя только ADSI. Вместо этого используется CDOEXM, интерфейс, созданный для управлением Exchange. Когда вы создаете нового пользователя, которому разрешено использовать почтовый ящик, в Active Directory вы можете или начать с ADSI и затем использовать CDOEXM для завершения работы, или использовать просто CDOEXM для создания и пользователя и почтового ящика.
Для пользователя нужно имя, имя входа (login), пароль. Для электронного почтового ящика, который им используется, нужно знать имя базы данных, группу хранения, имя сервера, административную группу, название организации и имя домена.
Следующая подпрограмма создает пользователя вместе с почтовым ящиком, который он использует, с помощью ADSI и CDOEXM.
Sub ADSICreateMailBoxEnabledUser _
(MDBName,StorageGroup,Server,AdminGroup,Organization,DomainName,emailname,
FirstName,LastName)
’разделяем доменное имя, чтобы получить имя каталога для него
DomainDN = "dc=" & Replace(DomainName,".",",dc=")
recip = "CN=" & emailname
’ получаем контейнер
Set objContainer = GetObject("LDAP://CN=users," & DomainDN)
’ создаем адресата
Set objUser = objContainer.Create("User", recip)
objUser.Put "samAccountName", emailname
objUser.Put "sn", LastName
objUser.Put "givenName", FirstName
objUser.Put "userPrincipalName", emailname
objUser.SetInfo
objUser.SetPassword "123456"
objUser.AccountDisabled = False
Set objMailbox = objUser
objMailbox.CreateMailbox "LDAP://CN=" & MDBName & _
",CN=" & StorageGroup & _
",CN=InformationStore" & _
",CN=" & Server & _
",CN=Servers" & _
",CN=" & AdminGroup & _
",CN=Administrative Groups" & _
",CN=" & Organization & _
",CN=Microsoft Exchange,CN=Services" & _
",CN=Configuration," & DomainDN
objUser.SetInfo
End Sub
Сначала, имя домена разбивается. Символ «.» заменяется на «,cn=» и другая последовательность символов «cn=» добавляется в начало строки. Это создает имя каталога «cn=domain,cn=local» из доменного имени «domain.local».
Таким же образом , «CN=» добавляется к имени объекта, обозначенного «emailname», чтобы разрешить его создание в скрипте.
Затем, мы получаем контейнер, в этом случае контейнер «users». Заметьте, что вы можете изменить этот скрипт так, что контейнер будет создан в контейнере или в OU по вашему выбору. Выполняется команда «Create» для создания объекта типа «User» в контейнере и вводится ряд свойств.
Далее следует строка, которая выглядит немного странно «Set objMailbox = objUser». Это создается новый объект типа указатель, который указывает на только что созданный с помощью интерфейса ADSI объект. Первый метод, применяемый для этого объекта, CreateMailbox«, назначит указатель для доступа к «IMailboxStore», интерфейсу объекта CDO.Person.
После того, как почтовый ящик создан, выполняется «SetInfo» метод для ADSI объекта пользователя и после его выполнения, можно использовать почтовый ящик.
Следующую строчку я использовал, когда писал вышеуказанную подпрограмму. Она может помочь вам понять, как запустить эту подпрограмму:
ADSICreateMailboxEnabledUser "Mailbox Store (EX2003)","First Storage Group", "EX2003", _
"First Administrative Group", "Sunnydale","sunnydale.muni", _
"testuser" ,"Test","User"
Создание пользователя, вместе с его электронным почтовым ящиком в интерфейсе CDOEXM, не намного отличается.
Sub CDOCreateMailBoxRecipient(MDBName, DomainName, _
exchangeOrg, adminGroup, _
storageGroup, storeName, _
ServerName, emailname, _
firstName, lastName)
’разделение доменного имени для получения имени каталога для него
DomainDN = "dc=" & Replace(DomainName,".",",dc=")
Set objPerson = CreateObject("CDO.Person")
’Сначала, создаем имя пользователя в Active Directory.
objPerson.FirstName = FirstName
objPerson.LastName = LastName
objPerson.Fields("userPrincipalName") = LastName
objPerson.Fields("userAccountControl") = 512
objPerson.Fields("userPassword") = "password"
objPerson.Fields.Update
objPerson.DataSource.SaveTo "LDAP://CN=" & MDBName & _
",CN=" & emailname & _
",CN=users," & domainDN
’Сейчас, создаем почтовый ящик с указанным расположением.
Set objMailbox = objPerson.GetInterface("IMailboxStore")
objMailbox.CreateMailbox "LDAP://CN=" & _
MDBName & _
",CN=" & _
StoreName & _
",CN=" & _
StorageGroup & ",CN=InformationStore,CN=" & _
ServerName & _
",CN=Servers,CN=" & _
AdminGroup & "," & _
"CN=Administrative Groups,CN=" & _
ExchangeOrg & "," & _
"CN=Microsoft Exchange,CN=Services," & _
"CN=Configuration," & domainDN
objPerson.DataSource.Save
End Sub
CDOEXM является более сложным интерфейсом. Он не требует использовать указатель на родительский объект OU, или на контейнер для пользователя. Но, все-таки, как в ADSI скрипте, у вас есть один указатель на свойства Active Directory объекта (objPerson) ,и другой указатель на объект (objMailbox), для создания самого почтового ящика.
Вы можете заметить, что CDOEXM скрипт имеет одно свойство, которого нет в ADSI. «userAccountControl» управляет всеми видами опций в учетной записи. Этот скрипт просто устанавливает пользователя, как пользователя с обыкновенной учетной записью («Normal Account»), но существует много других опций, которые вы можете установить. Для более подробной информации об этом свойстве, читайте Microsoft KB 305144.
Доступ к электронному почтовому адресу(E-mail)
Exchange был создан, чтобы быть гибким сервером для обмена сообщениями. Помня об этом, разработчики Exchange решили, что e-mail адрес объекта будет массивом адресов. Этот массив может содержать любой тип e-mail, подходящий любой системе электронной почты, хотя Exchange первоначально основывался на стандарте X.400. Осуществление связи Exchange с иностранными почтовыми системами значит, кроме всего прочего, что каждый пользователь может добавить другой тип адреса электронной почты, чтобы общаться на одном языке с этой иностранной системой. Интернет был первоначально такой иностранной системой для обмена сообщениями, и каждый пользователь имел один или несколько SMTP адресов к X.400 адресу, заданному по умолчанию.
В наше время интернетовский адрес электронной почты является наиболее важным адресом, который видит пользователь. Exchange 2000/3 передает сообщения с помощью SMTP между серверами и в Интернет. Некоторые организации могут даже посылать больше почты в Интернет, чем внутри самой организации.
В Active Directory без схемы, расширенной для Exchange, каждый пользователь имеет один e-mail адрес, для хранения которого используется атрибут «mail». Этот атрибут не используется в повседневной работе Active Directory, но вы можете записать его на всякий случай.
В Exchange 2000/3 это свойство указывает на основной SMTP адрес объекта. Основной SMTP адрес это адрес, который указывается в поле «Reply-To» (ответить) электронной почты. Таким образом, Exchange адресат может получать почту по многим адресам, но когда он посылает почту в Интернет, то он представлен основным SMTP адресом.
Сам основной SMTP адрес не хранится в атрибуте «mail». Вместо этого он хранится в поле proxyAddresses как часть массива e-mail.
Основной e-mail адрес храниться в верхнем регистре, например: «SMTP:[email protected]». Дополнительный адрес вместе с типом e-mail будет храниться в нижнем регистре.
Скрипты следующего примера читают электронный адрес объекта в Active Directory:
Set MyUser = GetObject ("LDAP://CN=Administrator,CN=Users,DC=sunnydale,DC=muni")
For each email in MyUser.proxyAddresses
WScript.Echo email
Next
Скрипт показывает все e-mail адреса и их типы. Здесь мы видим усложненный скрипт, показывающий основные SMTP адреса и затем дополнительные.
Set MyUser = GetObject ("LDAP://CN=Administrator,CN=Users,DC=sunnydale,DC=muni")
Secondary = ""
For each email in MyUser.proxyAddresses
If Left (email,5) = "SMTP:" Then
WScript.Echo "Primary e-mail address:" & Mid (email,6)
ElseIf Left (email,5) = "smtp:" Then
Secondary = Secondary & "," & Mid (email,6)
End If
Next
If Secondary "" Then WScript.Echo "Other e-mail addresses:" & Mid (Secondary,2)
Функция Left используется, чтобы определить, является тип e-mail SMTP типом, функция Mid используется, чтобы получить действительный e-mail адрес.
Если вы хотите произвести поиск какого-то конкретного e-mail адреса в Active Directory, вы можете сделать это с помощью LDAP запроса, используя атрибут proxyAddresses. Этот атрибут индексирован, так что вы можете производить поиск внутри e-mail массива объекта, когда вы выполняете запрос.
Set rootDSE = GetObject("LDAP://RootDSE")
domainContainer = rootDSE.Get("defaultNamingContext")
Set conn = CreateObject("ADODB.Connection")
conn.Provider = "ADSDSOObject"
conn.Open "ADs Provider"
Email = "smtp:[email protected]"
LDAPStr = ";
(&(objectCategory=person)(proxyAddresses=" & email & "));adspath;subtree"
Set rs = conn.Execute(LDAPStr)
If rs.RecordCount = 1 Then
Set oPerson = GetObject(rs.Fields(0).Value)
WScript.Echo oPerson.displayName
End If
Этот тип поиска не зависит от регистра, так что не имеет значения, производите вы поиск для «smtp:[email protected]» или «SMTP:[email protected]».
Добавление E-mail адресов
Работа со списком e-mail адресов Exchange адресата требует использования функций работы с массивом.
Ubound функция получает количество объектов, хранимых в массиве. Для того, чтобы добавить e-mail адрес в массив proxyAddresses адресата, вам необходимо увеличить количество объектов в массиве.
Redim Preserve функция позволяет вам расширить массив, сохраняя его содержимое.
Set oUser = GetObject ("LDAP://CN=Buffy Summers,OU=Scoobies,DC=sunnydale,DC=muni")
Set objRecip = oUser
sAddress = "smtp:[email protected]"
bIsFound = False
vProxyAddresses = objRecip.ProxyAddresses
nProxyAddresses = UBound(vProxyAddresses)
i = 0
Do While i If vProxyAddresses(i) = sAddress Then
bIsFound = True
Exit Do
End If
i = i + 1
Loop
If Not bIsFound Then
ReDim Preserve vProxyAddresses(nProxyAddresses + 1)
vProxyAddresses(nProxyAddresses + 1) = sAddress
objRecip.ProxyAddresses = vProxyAddresses
oUser.SetInfo
End If
Скрипт получает указатель на пользователя, массив электронных адресов и длину массива. Затем проверяется, существует ли электронный адрес для пользователя. Если он не существует, то увеличиваем длину массива, чтобы было место для дополнительного e-mail адреса, затем добавляем сам электронный адрес.
Вы можете также решить добавить e-mail и сделать его основным электронным адресом.
Dim objRecip
Dim mycontact' As ContactItem
Dim proxies
'On Error Resume Next
Set oUser = GetObject ("LDAP://CN=Buffy Summers,OU=Scoobies,DC=sunnydale,DC=muni")
Set objRecip = oUser
sAddress = "SMTP:[email protected]"
bIsFound = False
vProxyAddresses = objRecip.ProxyAddresses
nProxyAddresses = UBound(vProxyAddresses)
i = 0
Do While i email = vProxyAddresses(i)
If Left (email,5) = "SMTP:" Then
vProxyAddresses (i) = "smtp:" & Mid (email,6)
End If
If vProxyAddresses(i) = sAddress Then
bIsFound = True
Exit Do
End If
i = i + 1
Loop
If Not bIsFound Then
ReDim Preserve vProxyAddresses(nProxyAddresses + 1)
vProxyAddresses(nProxyAddresses + 1) = sAddress
objRecip.ProxyAddresses = vProxyAddresses
oUser.SetInfo
End If
В этом скрипте я использовал функцию Left, чтобы определить, какой из e-mail адресов является основным SMTP адресом. Затем скрипт, используя Mid функцию, определяет адреса, которые начинаются с "smtp:" вместо "SMTP:", определяя их как вторичные e-mail адреса.
Удостоверьтесь, когда вы добавляете e-mail адрес, что он правильно отформатирован, так как Active Directory не проверяет, правильный ли формат e-mail адреса или нет. Вы можете получить странные результаты, если добавите неверно отформатированный e-mail адрес.
Удаление E-mail адресов
Удаление e-mail адреса пользователя так же важно, как и добавление. Добавление e-mail адреса, скажем группе пользователей, может быть сделано, используя диалоговый интерфейс программы Exchange System Manager.
Это добавит каждому пользователю другой вторичный e-mail адрес.
Но что случиться, когда мы изменяем Default Policy(политику по умолчанию) так, что будет только один SMTP адрес ("sunnydale.org")?
Как вы можете видеть, старые e-mail не удалены, когда изменилась политика получателя, так что вы имеете ненужные e-mail адреса. Эти адреса могут быть удалены следующим скриптом:
Dim NewProxies ()
Set rootDSE = GetObject("LDAP://RootDSE")
DomainContainer = rootDSE.Get("defaultNamingContext")
Set conn = CreateObject("ADODB.Connection")
conn.Provider = "ADSDSOObject"
conn.Open "ADs Provider"
emaildomain = "sunnydale.muni"
LDAPStr = ";
(&(objectCategory=person)(proxyAddresses=*@"_
& emaildomain & "));adspath;subtree"
Set rs = conn.Execute(LDAPStr)
While Not rs.EOF
Set oRecipient = GetObject(rs.Fields(0).Value)
bIsFound = False
proxies = oRecipient.ProxyAddresses
nProxies = UBound(proxies)
i = 0
n = 0
Do While i checkproxy = proxies (i)
AddProxy = False
If (LCase(Left(proxies(i),5)) "smtp:") Then
AddProxy = True
Else
TempAr = Split (proxies(i),"";)
If (TempAr (1) emaildomain) Then checkproxy = True
End If
If AddProxy = True Then
ReDim Preserve NewProxies (n)
NewProxies (n) = checkproxy
n = n + 1
End If
i = i + 1
Loop
oRecipient.PutEx 2,"ProxyAddresses",NewProxies
oRecipient.SetInfo
rs.movenext
Wend
Скрипт осуществляет доступ к текущему домену, затем производит LDAP поиск для всех получателей, которые имеют e-mail адреса в домене «sunnydale.muni». Затем происходит определение текущих адресов e-mail, запись их в «proxies», и затем осуществляется проход по этому массиву.
Функция Split используется для разделения адреса email в массив из двух элементов. Второй элемент это e-mail домен. Скрипт затем добавляет все адреса e-mail, которые не заканчиваются на e-mail домен, в новый массив «NewProxies».
Заметьте, что «i» это счетчик, который используется в оригинальном массиве proxyAddresses, счетчик «n» используется для нового массива NewProxies.
Сейчас все старые адреса e-mail удалены. Как вы могли заметить, также удалены адреса, которые пользователь имел раньше ([email protected]). Если вы не хотите, чтобы это произошло, нужен более сложный скрипт.
Dim NewProxies ()
Set rootDSE = GetObject("LDAP://RootDSE")
DomainContainer = rootDSE.Get("defaultNamingContext")
Set conn = CreateObject("ADODB.Connection")
conn.Provider = "ADSDSOObject"
conn.Open "ADs Provider"
emaildomain = "sunnydale.muni"
newemaildomain = "sunnydale.org"
LDAPStr = ";
(&(objectCategory=person)(proxyAddresses=*@" _
& emaildomain & "));adspath;subtree"
Set rs = conn.Execute(LDAPStr)
While Not rs.EOF
Set oRecipient = GetObject(rs.Fields(0).Value)
bIsFound = False
proxies = oRecipient.ProxyAddresses
nProxies = UBound(proxies)
i = 0
n = 0
Do While i checkproxy = proxies (i)
AddProxy = False
If (LCase(Left(proxies(i),5)) "smtp:") Then
AddProxy = True
Else
TempAr = Split (proxies(i),"@")
If (TempAr (1) = emaildomain) Then
checkproxy = TempAr(0) & "@" & newemaildomain
If Not (ExistsInProxies(checkproxy,proxies)) Then AddProxy = True
Else
checkproxy = True
End If
End If
If AddProxy = True Then
ReDim Preserve NewProxies (n)
NewProxies (n) = checkproxy
n = n + 1
End If
i = i + 1
Loop
Recipient.PutEx 2,"ProxyAddresses",NewProxies
oRecipient.SetInfo
rs.movenext
Wend
Function ExistsInProxies (proxy,arProxies)
ExistsInProxies = False
m= UBound (arProxies)
j = 0
Do While j If arProxies (j) = proxy Then
ExistInProxies = True
Exit Do
End If
j = j + 1
Loop
End Function
Исправленный скрипт добавляет функцию, которая проверяет, существует ли e-mail адрес в массиве. Это полезно, потому что сейчас SMTP e-mail адреса удаляется, если они имеют тот суффикс, который вы хотите удалить, только если альтернативный адрес с новым суффиксом существует. Например, [email protected] уничтожается, потому что [email protected] существует. Однако, [email protected] не уничтожается. Вместо этого он меняется на [email protected].
Заключение
Мы рассмотрели в этой статье создание пользователя вместе электронным почтовым адресом, используя ADSI и CDOEXM, и углубились в детали различных скриптов, которые позволяют создавать почтовые ящики и удалять их. По мере нашего продвижения сложность скриптов возрастала, но создание их было достаточно простым. Я бы порекомендовал протестировать эти скрипты и возможно написать на бумаге, что выполняет каждая команда и проанализировать все циклы и структуры «if». Понимание логики этих скриптов может помочь вам понять Active Directory и Exchange лучше и также позволит вам модифицировать скрипты для выполнения бесконечных операций с электронными адресами.