1 (изменено: Sigvar, 2011-09-26 09:49:59)

Тема: VBScript: Переадресация почты

Приветствую.

Помогите плиз со скриптом на установку переадресации почты в домене. 

Сейчас пользуемся скриптом:

Set objFSO = CreateObject("Scripting.FileSystemObject")
set WshShell = WScript.CreateObject("WScript.Shell")
Set objNetwork = CreateObject("Wscript.Network")
strName = objNetwork.UserName

Set objRootDSE = GetObject("LDAP://RootDSE")

strDNSDomain = objRootDSE.Get("defaultNamingContext")
Const ADS_NAME_INITTYPE_DOMAIN = 1
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1179 = 1
Set objTrans = CreateObject("NameTranslate")
objTrans.Init ADS_NAME_TYPE_NT4, strDNSDomain
objTrans.Set ADS_NAME_TYPE_1179, strDNSDomain
strNetBIOSDomain = objTrans.Get(ADS_NAME_TYPE_NT4)
strNetBIOSDomain = Left(strNetBIOSDomain, Len(strNetBIOSDomain) - 1)
objTrans.Init ADS_NAME_INITTYPE_DOMAIN, strNetBIOSDomain
objTrans.Set ADS_NAME_TYPE_NT4, strNetBIOSDomain & "\" & strName
strUserDN = objTrans.Get(ADS_NAME_TYPE_1179)
Set objUser = GetObject("LDAP://" & strUserDN)

strForwardingAddress = "CN=test,OU=Test,DC=domain,DC=biz"

objUser.altRecipient = strForwardingAddress
objUser.deliverAndRedirect = TRUE
objUser.SetInfo

Он устанавливает при логофе пользователя переадресацию почты на определенный адрес (который прописан в скрипте).

А сейчас поставили задачу, чтобы пользователь при логофе мог ввести самостоятельно адрес (в виде user@domain.ru), на который нужно переадресовать почту. А если он не вводит в течении 30 секунд - чтобы ставилась переадресация на дефолтный адрес прописанный в скрипте.

Буду сильно благодарен.

Very Happy — это весьма счастлив, а не благодарен. Я привёл Ваш пост в соответствие Правилам форума.

поправил. смайлик при copy\paste  скривился ...    

Спасибо большое за приведение темы в соответствие с правилами.

2

Re: VBScript: Переадресация почты

Думается, Вам поможет метод Popup объекта WScript.Shell.

3 (изменено: dab00, 2011-09-23 14:46:05)

Re: VBScript: Переадресация почты

Dmitrii пишет:

Думается, Вам поможет метод Popup объекта WScript.Shell.

Надо полагать уважаемый Dmitrii имел в виду один из аргументов метода Popup - время (количество секунд), в течение которого должно висеть окно (по-моему не мешало бы пояснить).

4

Re: VBScript: Переадресация почты

dab00 пишет:

... по-моему не мешало бы пояснить.

Согласен, поясняю примером:

'...
strForwardingAddress = "здесь - дефолтный адрес прописанный в скрипте"
Set objWShell = CreateObject("WScript.Shell")
xResult = objWShell.Popup("Будете указывать свой адрес эл. почты?", 30, "Текст заголовка", 4 + 32)
Set objWShell = Nothing
If xResult = 6 Then
    strUserMail = InputBox("Укажите адрес эл. почты:", "Текст заголовка")
    If Len(strUserMail) > 0 Then strForwardingAddress = strUserMail
End If
'objUser.altRecipient = strForwardingAddress
'...

Разумеется, надо бы ещё добавить процедуру проверки корректности структуры адреса, заданного пользователем.

5 (изменено: Sigvar, 2011-09-26 10:13:32)

Re: VBScript: Переадресация почты

Внес изменения предложенный уважаемым Dmitrii.

Но теперь вылезает ошибка.

После ввода адреса переадресации ( в виде user@domain.ru )  вылезает ошибка в строке objUser.SetInfo

строка: 38
символ: 1
Ошибка: Произошло нарушение ограничения.
Код: 8007202F
Источник: Active Directory

Причем если не вводить адрес руками - то на адрес прописанный в скрипте переадресация ставиться нормально.

Подскажите пожалуйста как исправить???


--------------------- добавлено ---------------------

Господа я понял почему не работает скрипт .

Потому что скрипт пытается подставить адрес в виде user@domain.ru ,  а в строку  altRecipient  он должен поставляться в виде "CN=username,OU=cont,DC=domain,DC=biz"   ( все наверное подумали: "блин Америку открыл :) )

Вот теперь у меня другая проблема -  как перевести введенный адрес вида user@domain.ru ,  в вид "CN=username,OU=cont,DC=domain,DC=biz"  ?   

Помогите пожалуйста.

6

Re: VBScript: Переадресация почты

Sigvar, ознакомьтесь с этим: Серый форум / Супер-тема, заходите — не пожалеете и этим: Правила форума.

7

Re: VBScript: Переадресация почты

Поправил пост как смог.

8

Re: VBScript: Переадресация почты

Sigvar пишет:

Поправил пост как смог.

Хорошо. Сразу бы так .

Sigvar пишет:

Вот теперь у меня другая проблема -  как перевести введенный адрес вида user@domain.ru ,  в вид "CN=username,OU=cont,DC=domain,DC=biz"  ?

Наверное, никак. Я не вижу путей из «ru» — получить «biz». Или Вы просто описались?

9

Re: VBScript: Переадресация почты

alexii пишет:
Sigvar пишет:

Поправил пост как смог.

Хорошо. Сразу бы так .

Sigvar пишет:

Вот теперь у меня другая проблема -  как перевести введенный адрес вида user@domain.ru ,  в вид "CN=username,OU=cont,DC=domain,DC=biz"  ?

Наверное, никак. Я не вижу путей из «ru» — получить «biz». Или Вы просто описались?

Нет не описался.   Запись учетной записи выглядит именно как CN=User,OU=IT,DC=domain,DC=biz ( это строчка distinquishedName),а пользователь не сможет вводить ее в таком виде. 
Они вводят ее в виде почтового адреса (user@domain.ru) - это строчка mail .

Вот как бы сделать так чтобы скрипт сопоставлял введенную пользователем строку mail со строкой  distinquishedName   и уже подставлял в altRecipient данные в том виде в котором они стоят в строке distinquishedName . 

Тогда скрипт сработает нормально.

Вот только как это сделать... ?

10

Re: VBScript: Переадресация почты

Sigvar пишет:

... как бы сделать так чтобы скрипт сопоставлял введенную пользователем строку mail со строкой  distinquishedName?

Если вводимый пользователем адрес совершенно произволен (то есть никак не связан с Вашим доменом), то возможно лишь "механическое" приведение формата X@Y.Z к формату CN=X,DC=Y,DC=Z.

11

Re: VBScript: Переадресация почты

Вводимый адрес не произволен- переадресация должна ставиться только на доменные адреса.

На внешние адреса (которых нет в домене) переадресация ставиться не должна.

12

Re: VBScript: Переадресация почты

1. В общем случае можно воспользоваться уже знакомым Вам интерфейсом IADsNameTranslate для преобразования имени из формата ADS_NAME_TYPE_USER_PRINCIPAL_NAME в формат ADS_NAME_TYPE_1779.

2. Существует ли между вводимым адресом и "учёткой" текущего пользователя прямая однозначная связь?
Если существует, то какая?

13 (изменено: Sigvar, 2011-09-26 15:27:13)

Re: VBScript: Переадресация почты

1. Что то мне не сообразить как это сделать ... :rolleyes:

2. Не совсем понял вопрос.   Пользователь при установке переадресации вводит адрес своего коллеги. Связь между ними  - это то что они оба в одном домене,  и то что их адреса находятся на одном сервере Exchange.

14 (изменено: Dmitrii, 2011-09-27 06:50:58)

Re: VBScript: Переадресация почты

Sigvar пишет:

... Пользователь при установке переадресации вводит адрес своего коллеги. Связь между ними  - это то что они оба в одном домене,  и то что их адреса находятся на одном сервере Exchange.

Сказали бы об этом сразу и результат получили бы быстрее, и не было бы лишних вопросов.

Sigvar пишет:

... как это сделать...

Пример:

Const ADS_NAME_TYPE_USER_PRINCIPAL_NAME = 9
'...
objTrans.Init ADS_NAME_INITTYPE_DOMAIN, strNetBIOSDomain
'...
Set objWShell = CreateObject("WScript.Shell")
xResult = objWShell.Popup("Будете указывать свой адрес эл. почты?", 30, "Текст заголовка", 4 + 32)
Set objWShell = Nothing
If xResult = 6 Then
    strUserMail = InputBox("Укажите адрес эл. почты:", "Текст заголовка")
    If Len(strUserMail) > 0 Then
        On Error Resume Next
        objTrans.Set ADS_NAME_TYPE_USER_PRINCIPAL_NAME, strUserMail
        strTemp = objTrans.Get(ADS_NAME_TYPE_1179)
        If Err.Number = 0 Then
            strForwardingAddress = strTemp
        Else
            Err.Clear
        End If
        On Error GoTo 0
    End If
End If

15 (изменено: Sigvar, 2011-09-27 12:15:59)

Re: VBScript: Переадресация почты

Скрипт приобрел очертания работающей удобной программы.

Set objFSO = CreateObject("Scripting.FileSystemObject")
set WshShell = WScript.CreateObject("WScript.Shell")
Set objNetwork = CreateObject("Wscript.Network")
strName = objNetwork.UserName

Set objRootDSE = GetObject("LDAP://RootDSE")

strDNSDomain = objRootDSE.Get("defaultNamingContext")
Const ADS_NAME_INITTYPE_DOMAIN = 1
Const ADS_NAME_TYPE_NT4 = 3
Const ADS_NAME_TYPE_1179 = 1
Set objTrans = CreateObject("NameTranslate")
objTrans.Init ADS_NAME_TYPE_NT4, strDNSDomain
objTrans.Set ADS_NAME_TYPE_1179, strDNSDomain
strNetBIOSDomain = objTrans.Get(ADS_NAME_TYPE_NT4)
strNetBIOSDomain = Left(strNetBIOSDomain, Len(strNetBIOSDomain) - 1)
objTrans.Init ADS_NAME_INITTYPE_DOMAIN, strNetBIOSDomain
objTrans.Set ADS_NAME_TYPE_NT4, strNetBIOSDomain & "\" & strName 
strUserDN = objTrans.Get(ADS_NAME_TYPE_1179)
Set objUser = GetObject("LDAP://" & strUserDN)


strForwardingAddress = "CN=Admintest,OU=Test,DC=domain,DC=biz"



Const ADS_NAME_TYPE_USER_PRINCIPAL_NAME = 9
objTrans.Init ADS_NAME_INITTYPE_DOMAIN, strNetBIOSDomain
Set objWShell = CreateObject("WScript.Shell")
xResult = objWShell.Popup("Будете указывать свой адрес эл. почты?", 30, "Текст заголовка", 4 + 32)
Set objWShell = Nothing
If xResult = 6 Then
    strUserMail = InputBox("Укажите адрес эл. почты:", "Текст заголовка")
    If Len(strUserMail) > 0 Then
        On Error Resume Next
        objTrans.Set ADS_NAME_TYPE_USER_PRINCIPAL_NAME, strUserMail
        strTemp = objTrans.Get(ADS_NAME_TYPE_1179)
        If Err.Number = 0 Then
            strForwardingAddress = strTemp
        Else
            Err.Clear
        End If
        On Error GoTo 0
    End If
End If

WScript.Echo strTemp

objUser.altRecipient = strForwardingAddress
objUser.deliverAndRedirect = TRUE
objUser.SetInfo


WScript.Echo "Переадресация установлена"

Но выяснилось небольшое неудобство... в строку адреса при запросе скрипта необходимо вводить UserLogonName,  а не email.
Если вводить  UserLogonName -  то все замечательно и скрипт срабатывает отлично.

Но если вводить именно email  -  то скрипт не срабатывает и ставит переадресацию на дефолтный адрес,  а strTemp возвращает имя залогиненного пользователя (т.е. пользователя от имени которого запускается скрипт) ,  а не пользователя на которого пытаются поставить переадресацию.

Можно это как то исправить? Или учить пользователей чтобы они вводили не email а LoginName?

16

Re: VBScript: Переадресация почты

Sigvar пишет:

... если вводить именно email  -  то скрипт не срабатывает и ставит переадресацию на дефолтный адрес...

Вероятно, возникает какая-то ошибка. Чтобы увидеть сообщение о ней закомментируйте оператор On Error Resume Next.

17

Re: VBScript: Переадресация почты

Скрипт не видит домен.

Строка: 38
Символ: 9
Ошибка: указанный домен не существует или к нему невозможно подключиться.
Код: 8007054В
Источник: (null)

Возможно это потому что скрипт ищет домен domain.ru   а в реале домен называется domain.biz  ... 

А как сделать чтобы он искал соответвие введенного email учетной записи в домене domain.biz??

18

Re: VBScript: Переадресация почты

Sigvar пишет:

... скрипт ищет домен domain.ru   а в реале домен называется domain.biz...

Но ведь уже было сказано: "... Пользователь при установке переадресации вводит адрес своего коллеги <...> они оба в одном домене,  и то что их адреса находятся на одном сервере Exchange".
Каким образом в домене с суффиксом BIZ может появиться адрес с суффиксом RU?

19 (изменено: Sigvar, 2011-09-27 17:26:28)

Re: VBScript: Переадресация почты

Хм..

У пользователя в домене есть два вида записей в подобном виде:

1.  Это User Logon Name ( или userPrincipalName)   - он записывается как user@domain.biz ( или Local -  как при установке домена поставим) 
2. Это E-mail (или mail) пользователя по которому он получает и отправляет почту  - он записывается как user@domain.ru ( или com - какой почтовый домен зарегистрирован)

В основном рядовые пользователи знают только e-mail ... заставить запомнить их еще и logonName да еще и с тем что надо вписывать его с суффиксом biz ... это совсем за гранью фантастики

Да и еще часто logonName не совпадает с  email ... как у меня например ...  logonName - vasiliev@domain.biz  , а email - it2@domain.ru 
По скрипту, чтобы установить на меня переадресацию  - нужно вводить vasiliev@domain.biz  ,  а пользователи знаю только мой email  - it2@domain.ru.

20

Re: VBScript: Переадресация почты

Тогда попробуйте подобным образом:

'...
Set objWShell = CreateObject("WScript.Shell")
xResult = objWShell.Popup("Будете указывать свой адрес эл. почты?", 30, "Текст заголовка", 4 + 32)
Set objWShell = Nothing
If xResult = 6 Then
    strUserMail = InputBox("Укажите адрес эл. почты:", "Текст заголовка")
    If Len(strUserMail) > 0 Then
        Set objConnection = CreateObject("ADODB.Connection")
        objConnection.Provider = "ADsDSOObject"
        objConnection.Open "Active Directory Provider"
        Set objCommand = CreateObject("ADODB.Command")
        Set objCommand.ActiveConnection = objConnection
        objCommand.CommandText = "SELECT distinguishedName FROM 'LDAP://" & strDNSDomain & _
                                "' WHERE objectCategory='Person' And objectClass='User' And mail='" & _
                                strUserMail & "'"
        objCommand.Properties("Page Size") = 1000
        objCommand.Properties("Timeout") = 30 
        objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE 
        Set objRSet = objCommand.Execute
        Select Case objRSet.RecordCount
            Case 0: MsgBox "Указанный адрес не найден.", vbExclamation
            Case 1
                objRSet.MoveFirst
                strForwardingAddress = objRSet.Fields("distinguishedName").Value
            Case Else: MsgBox "Указанный адрес не уникален.", vbExclamation
        End Select
        Set objRSet = Nothing
        Set objCommand = Nothing
        objConnection.Close
        Set objConnection = Nothing
    End If
End If
'...

21

Re: VBScript: Переадресация почты

Не работает.

Все время выдает "Указанный адрес не найден." 

Вчера весь день пытался понять почему - не понял...

22

Re: VBScript: Переадресация почты

1. Лишних пробелов (до и после почтового адреса) случайно нет (как в значении атрибута Mail тестируемой "учётки", так и в строке с вводимым адресом)?
2. Сколько пользовательских "учёток" в Вашем домене?

23

Re: VBScript: Переадресация почты

1. Пробелов лишних нет.  Это точно.
2. Учеток в домене - порядка 300.

24

Re: VBScript: Переадресация почты

Sigvar, а может быть мы говоря об атрибуте Mail подразумеваем не одно и то же?
Я веду речь о том значении, которое отображается в свойствах "учётки", на вкладке "Общие", в поле "Эл. почта".

25 (изменено: Sigvar, 2011-09-30 09:39:33)

Re: VBScript: Переадресация почты

Dmitrii пишет:

Sigvar, а может быть мы говоря об атрибуте Mail подразумеваем не одно и то же?
Я веду речь о том значении, которое отображается в свойствах "учётки", на вкладке "Общие", в поле "Эл. почта".

Теоретически мы говорим об одном поле.  Оно выделено на скриншоте.

http://img.forums.kg/images/imgCOh60739.png


В вот скриншот на котором видно что userPrincipalName сильно различается с полем mail  ( Это данные по одной и тойже учетной записи - Admintest)

http://img.forums.kg/images/imgEHn61149.png

26

Re: VBScript: Переадресация почты

Стало быть, речь мы ведём об одном и том же атрибуте.
Пока не знаю, чем ещё может быть обусловлен отрицательный результат поиска "учётки" по значению адреса.
У меня-то всё работает нормально.

27 (изменено: Rialto, 2011-09-30 23:21:58)

Re: VBScript: Переадресация почты

Можно спрашивать у пользователя e-mail, а тебе использовать только его первую часть(до @) и преобразовать в distinquishedName
Домен пользователя ты уже нашёл - strNetBIOSDomain.

Так что, можно так:

If xResult = 6 Then
    strUserMail = InputBox("Укажите адрес эл. почты:", "Текст заголовка")
    If Len(strUserMail) > 0 Then
        On Error Resume Next
        strUserName =split(strUserMail,"@")(1)
          objTrans.Set ADS_NAME_TYPE_NT4, strNetBIOSDomain & "\" & strUserName 
          strTemp = objTrans.Get(ADS_NAME_TYPE_1179)
        If Err.Number = 0 Then
            strForwardingAddress = strTemp
        Else
            Err.Clear
        End If
        On Error GoTo 0
    End If
End If