none
Просьба помочь со скриптом RRS feed

  • Вопрос

  • Добрый день,
    Имеется задача, чтобы при создании нового пользователя и соответственно ящика для него ему автоматически генерировалось письмо с приветствием и общими правилами. Прогуглить не получается, здесь тоже ничего подходящего не нашел. Может кто сможет написать скрипт или ткнуть носом, где уже это есть.
    • Перемещено Hengzhe Li 12 марта 2012 г. 7:39 forum merge (От:Exchange Server 2007)
    14 января 2010 г. 9:31

Ответы

  • Есть более длинное решение, но оно автоматизирует процесс полностью.

    вначале создаем текстовый файл с адресами.

    ON ERROR RESUME NEXT

    Function ListEmailInDomain(DomainDN)

    LDAPQUERY = DomainDN
    Dim con, com, rs
         Set con = CreateObject("ADODB.Connection")
        Set com = CreateObject("ADODB.Command")
        con.Provider = "ADsDSOObject"
        con.Open "Active Directory Provider"
        Set com.ActiveConnection = con
      com.CommandText = "select proxyAddresses from '" & LDAPQUERY & "'where objectClass= 'user' order by sn "
      com.Properties("Page Size") = 1000
        Set rs = com.Execute
        rs.MoveFirst
        While Not rs.EOF
          TProxyAddresses = rs.Fields("proxyAddresses")
          If Not IsNull(TProxyAddresses) Then
            TProxyAddressesCount = UBound(TProxyAddresses)
            For i = 0 To TProxyAddressesCount
               If LCase(Left(TProxyAddresses(i),4))="smtp" Then
                  If instr(lcase(trim(Mid(TProxyAddresses(i),6))),"@example.com") > 0 then
                            f.Write lcase(trim(Mid(TProxyAddresses(i),6))) & VBCRLf
                  end if  
               End If
                    Next
          End iF
          rs.MoveNext
       Wend
         rs.Close
     

    end Function

    Root   = "LDAP://DC01/DC=example,DC=spb,DC=ru"

    FILENAME= "emailwhitelist.txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(FILENAME, 2, True)
    DomainDN = Example
    ListEmailInDomain(DomainDN)
    f.Close

    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CopyFile "global.recipients" , "global.recipients.old", TRUE

    FILENAME= "global.recipients"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(FILENAME, 2, True)
    ListEmailInDomain(Example)
    f.Close


    Const ForReading = 1
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile1 = objFSO.OpenTextFile("global.recipients.old", ForReading)

    strCurrentDevices = objFile1.ReadAll
    objFile1.Close

    Set objFile2 = objFSO.OpenTextFile("global.recipients", ForReading)

    Do Until objFile2.AtEndOfStream
        strAddress = objFile2.ReadLine
        If InStr(strCurrentDevices, strAddress) = 0 Then
            strNotCurrent = strNotCurrent & strAddress & vbCrLf
        End If
    Loop

    objFile2.Close

    if (strNotCurrent = "") then
      Wscript.Echo "no data"
    else
      Set objFile3 = objFSO.CreateTextFile("NewEmails.txt")
      Wscript.echo strNotCurrent
      objFile3.WriteLine strNotCurrent
      objFile3.Close
    end if


    Set objFSO = CreateObject("Scripting.FileSystemObject")

    Set objFile = objFSO.OpenTextFile("NewEmails.txt", 1)
    strContents = objFile.ReadAll
    strLine = objFile.Line
    'Wscript.Echo "Number of lines: " & StrLine
    objFile.Close

    If InStr(strContents, "@example.com") and strLine<=6 Then
       
    Set objShell = CreateObject("WScript.Shell")
    objShell.Run "SendMail.bat",,True
    end if


    во второй запуск он переименовывается в файл .old
    и при условии наличия разницы в первом и втором файле запускается скрипт SendMail.bat

    но если убрать последний блок то можно расширить функционал так

    формируем файл send.bat и запускаем его каждый час

    @echo off
    cd "C:\Program Files\Tools\welcome_message"

    cscript.exe send_welcome.vbs

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command "& 'C:\Program Files\Tools\welcome_message\send_info.ps1'"
    rem C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command "& 'C:\Program Files\Tools\welcome_message\send_welcome.ps1'"

    файл send_info.ps1

    $file = "C:\Program Files\Tools\welcome_message\NewEmails.txt"

    $FileExists = Test-Path $file

    If ($FileExists -eq "False") {
      Write-Host "sending mail"
      $mail = New-Object System.Net.Mail.MailMessage

      #set the addresses
      $mail.From = New-Object System.Net.Mail.MailAddress("mail.auditor@example.com")
      $mail.To.Add("admin@example.com")

      #set the content
      $mail.Subject = "New mailbox(es) was created";
      $mail.Body = get-content $file

      #send the message
      $smtp = New-Object System.Net.Mail.SmtpClient
      $smtp.host = "EXHUB-01"

      $Credentials = new-object System.Net.networkCredential
      $Credentials.domain = "example"
      $Credentials.UserName = "mail.auditor"
      $Credentials.Password = "password"

      $smtp.Credentials = $Credentials

      $smtp.Send($mail)
      Remove-Item $file

    } else {
      Write-Host "File $file not found"

    }


    файл send_welcome.ps1

    $file = Get-Content "C:\Program Files\Tools\welcome_message\NewEmails.txt"
    $addresses = ([string]$file).Split(" ")

    foreach($singleAddress in $addresses) {

      #create the mail message
      $mail = New-Object System.Net.Mail.MailMessage

      #set the addresses
      $mail.From = New-Object System.Net.Mail.MailAddress("mail.auditor@example.com")
      write-host "send to "$singleAddress
      $mail.To.Add($singleAddress)

      #set the content
      $mail.Subject = "Welcome to Example e-mail system";
      $mail.Body = Get-Content "C:\Program Files\Tools\welcome_message\welcome.htm"
      $mail.IsBodyHTML = $true

      #send the message
      $smtp = New-Object System.Net.Mail.SmtpClient
      $smtp.host = "exhub-01"

      $Credentials = new-object System.Net.networkCredential
      $Credentials.domain = "EXAMPLE"
      $Credentials.UserName = "mail.auditor"
      $Credentials.Password = "password"

      $smtp.Credentials = $Credentials
      $smtp.Send($mail)
    }


    собственно в welcome.htm можно впихнуть все что угодно...

    результат работы
    1. ежечасно формируется файл с почтовыми ящиками
    2. при наличии созданных ящиков на них отправляется welcome-message
    3. отправляется отчет админимтратору
    blog.wadmin.ru
    • Помечено в качестве ответа Daniil KhabarovModerator 18 января 2010 г. 14:11
    • Изменено zero55 17 февраля 2010 г. 12:49
    14 января 2010 г. 12:17
  • В EMS 2007 нет встроенного командлета для отправки письма. (В 2010 есть такой команлет)
    Вы можете использовать скрипт создания ящика нового пользователя и потом команду, которая будет посылать на его ящик нужное вам письмо(можете использовать для этого blat.exe).

    #создание ящика
    New-Mailbox -Name 'test' -Alias 'test' -UserPrincipalName 'test18@domain.loc' -SamAccountName 'test18' -Password 'System.Security.SecureString' -ResetPasswordOnNextLogon $false -Database 'EXCH2K7\First Storage Group\storage1'

    #послать email
    $emailFrom = "user@yourdomain.com"
    $emailTo = "user@yourdomain.com"
    $subject = "your subject"
    $body = "your body"
    $smtpServer = "your smtp server"
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $smtp.Send($emailFrom, $emailTo, $subject, $body)


    14 января 2010 г. 9:42
  • Недавно была похожая тема http://social.technet.microsoft.com/Forums/ru-RU/ocses2007ru/thread/ee0a8e88-eb30-47fc-a8dd-c139da83004a
    21 января 2010 г. 19:43

Все ответы

  • В EMS 2007 нет встроенного командлета для отправки письма. (В 2010 есть такой команлет)
    Вы можете использовать скрипт создания ящика нового пользователя и потом команду, которая будет посылать на его ящик нужное вам письмо(можете использовать для этого blat.exe).

    #создание ящика
    New-Mailbox -Name 'test' -Alias 'test' -UserPrincipalName 'test18@domain.loc' -SamAccountName 'test18' -Password 'System.Security.SecureString' -ResetPasswordOnNextLogon $false -Database 'EXCH2K7\First Storage Group\storage1'

    #послать email
    $emailFrom = "user@yourdomain.com"
    $emailTo = "user@yourdomain.com"
    $subject = "your subject"
    $body = "your body"
    $smtpServer = "your smtp server"
    $smtp = new-object Net.Mail.SmtpClient($smtpServer)
    $smtp.Send($emailFrom, $emailTo, $subject, $body)


    14 января 2010 г. 9:42
  • Есть более длинное решение, но оно автоматизирует процесс полностью.

    вначале создаем текстовый файл с адресами.

    ON ERROR RESUME NEXT

    Function ListEmailInDomain(DomainDN)

    LDAPQUERY = DomainDN
    Dim con, com, rs
         Set con = CreateObject("ADODB.Connection")
        Set com = CreateObject("ADODB.Command")
        con.Provider = "ADsDSOObject"
        con.Open "Active Directory Provider"
        Set com.ActiveConnection = con
      com.CommandText = "select proxyAddresses from '" & LDAPQUERY & "'where objectClass= 'user' order by sn "
      com.Properties("Page Size") = 1000
        Set rs = com.Execute
        rs.MoveFirst
        While Not rs.EOF
          TProxyAddresses = rs.Fields("proxyAddresses")
          If Not IsNull(TProxyAddresses) Then
            TProxyAddressesCount = UBound(TProxyAddresses)
            For i = 0 To TProxyAddressesCount
               If LCase(Left(TProxyAddresses(i),4))="smtp" Then
                  If instr(lcase(trim(Mid(TProxyAddresses(i),6))),"@example.com") > 0 then
                            f.Write lcase(trim(Mid(TProxyAddresses(i),6))) & VBCRLf
                  end if  
               End If
                    Next
          End iF
          rs.MoveNext
       Wend
         rs.Close
     

    end Function

    Root   = "LDAP://DC01/DC=example,DC=spb,DC=ru"

    FILENAME= "emailwhitelist.txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(FILENAME, 2, True)
    DomainDN = Example
    ListEmailInDomain(DomainDN)
    f.Close

    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    objFSO.CopyFile "global.recipients" , "global.recipients.old", TRUE

    FILENAME= "global.recipients"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(FILENAME, 2, True)
    ListEmailInDomain(Example)
    f.Close


    Const ForReading = 1
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile1 = objFSO.OpenTextFile("global.recipients.old", ForReading)

    strCurrentDevices = objFile1.ReadAll
    objFile1.Close

    Set objFile2 = objFSO.OpenTextFile("global.recipients", ForReading)

    Do Until objFile2.AtEndOfStream
        strAddress = objFile2.ReadLine
        If InStr(strCurrentDevices, strAddress) = 0 Then
            strNotCurrent = strNotCurrent & strAddress & vbCrLf
        End If
    Loop

    objFile2.Close

    if (strNotCurrent = "") then
      Wscript.Echo "no data"
    else
      Set objFile3 = objFSO.CreateTextFile("NewEmails.txt")
      Wscript.echo strNotCurrent
      objFile3.WriteLine strNotCurrent
      objFile3.Close
    end if


    Set objFSO = CreateObject("Scripting.FileSystemObject")

    Set objFile = objFSO.OpenTextFile("NewEmails.txt", 1)
    strContents = objFile.ReadAll
    strLine = objFile.Line
    'Wscript.Echo "Number of lines: " & StrLine
    objFile.Close

    If InStr(strContents, "@example.com") and strLine<=6 Then
       
    Set objShell = CreateObject("WScript.Shell")
    objShell.Run "SendMail.bat",,True
    end if


    во второй запуск он переименовывается в файл .old
    и при условии наличия разницы в первом и втором файле запускается скрипт SendMail.bat

    но если убрать последний блок то можно расширить функционал так

    формируем файл send.bat и запускаем его каждый час

    @echo off
    cd "C:\Program Files\Tools\welcome_message"

    cscript.exe send_welcome.vbs

    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command "& 'C:\Program Files\Tools\welcome_message\send_info.ps1'"
    rem C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command "& 'C:\Program Files\Tools\welcome_message\send_welcome.ps1'"

    файл send_info.ps1

    $file = "C:\Program Files\Tools\welcome_message\NewEmails.txt"

    $FileExists = Test-Path $file

    If ($FileExists -eq "False") {
      Write-Host "sending mail"
      $mail = New-Object System.Net.Mail.MailMessage

      #set the addresses
      $mail.From = New-Object System.Net.Mail.MailAddress("mail.auditor@example.com")
      $mail.To.Add("admin@example.com")

      #set the content
      $mail.Subject = "New mailbox(es) was created";
      $mail.Body = get-content $file

      #send the message
      $smtp = New-Object System.Net.Mail.SmtpClient
      $smtp.host = "EXHUB-01"

      $Credentials = new-object System.Net.networkCredential
      $Credentials.domain = "example"
      $Credentials.UserName = "mail.auditor"
      $Credentials.Password = "password"

      $smtp.Credentials = $Credentials

      $smtp.Send($mail)
      Remove-Item $file

    } else {
      Write-Host "File $file not found"

    }


    файл send_welcome.ps1

    $file = Get-Content "C:\Program Files\Tools\welcome_message\NewEmails.txt"
    $addresses = ([string]$file).Split(" ")

    foreach($singleAddress in $addresses) {

      #create the mail message
      $mail = New-Object System.Net.Mail.MailMessage

      #set the addresses
      $mail.From = New-Object System.Net.Mail.MailAddress("mail.auditor@example.com")
      write-host "send to "$singleAddress
      $mail.To.Add($singleAddress)

      #set the content
      $mail.Subject = "Welcome to Example e-mail system";
      $mail.Body = Get-Content "C:\Program Files\Tools\welcome_message\welcome.htm"
      $mail.IsBodyHTML = $true

      #send the message
      $smtp = New-Object System.Net.Mail.SmtpClient
      $smtp.host = "exhub-01"

      $Credentials = new-object System.Net.networkCredential
      $Credentials.domain = "EXAMPLE"
      $Credentials.UserName = "mail.auditor"
      $Credentials.Password = "password"

      $smtp.Credentials = $Credentials
      $smtp.Send($mail)
    }


    собственно в welcome.htm можно впихнуть все что угодно...

    результат работы
    1. ежечасно формируется файл с почтовыми ящиками
    2. при наличии созданных ящиков на них отправляется welcome-message
    3. отправляется отчет админимтратору
    blog.wadmin.ru
    • Помечено в качестве ответа Daniil KhabarovModerator 18 января 2010 г. 14:11
    • Изменено zero55 17 февраля 2010 г. 12:49
    14 января 2010 г. 12:17
  • Стоит такая задач, в AD есть OU, в которую с некоторой переодичностью добавляются новые пользователи. После того, как я создаю пользователя, приходиться вручную сбрасывать ему общие документы (типа внутреннего устава компании, общие правила и прочее), т.е. один и тот же набор документов.
    Можно ли автоматизировать как-то этот процесс, т.е. создав пользователя и почтовый ящик для него, ему автоматически скидываются на почту эти документы ?
    21 января 2010 г. 14:59
  • Недавно была похожая тема http://social.technet.microsoft.com/Forums/ru-RU/ocses2007ru/thread/ee0a8e88-eb30-47fc-a8dd-c139da83004a
    21 января 2010 г. 19:43
  • Я объединю эти 2 темы, чтобы не было спама.
    22 января 2010 г. 14:18
    Модератор
  • Уважаемые коллеги, прошу вашего совета.
    Подскажите, как можно реализовать автоматическую рассылку сообщений вновь созданным пользователям?

    Т.е. есть список документов, которые должен получать каждый сотрудник, поступивший к нам на работу. Хотелось бы автоматизировать этот процесс: создал юзера и ему сразу же на ящик сообщения пришли.
    9 февраля 2010 г. 17:42
  • Была такая тема http://social.technet.microsoft.com/Forums/ru-RU/ocses2007ru/thread/ee0a8e88-eb30-47fc-a8dd-c139da83004a
    9 февраля 2010 г. 19:44
  • Привет всем!
    А можно как нибудь по конкретннее расписать процедуру отправки сообщения для нового созданого пользователя!
    Спасибо.
    16 февраля 2010 г. 10:03
  • вроде все уже описано.

    какие детали вам интересны?
    blog.wadmin.ru
    16 февраля 2010 г. 11:29
  • незнаю как именно применить Ваш скрипт....и как поправить его с какого конца подойти :-)
    16 февраля 2010 г. 12:57
  • первый скрипт запускается по расписанию и при первом запуске создает текстовый файл со списком мыл.

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

    в куске

    @echo off
    cd "C:\Program Files\Tools\welcome_message"
    cscript.exe send_welcome.vbs
    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command "& 'C:\Program Files\Tools\welcome_message\send_info.ps1'"
    rem C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command "& 'C:\Program Files\Tools\welcome_message\send_welcome.ps1'"


    лишняя строка
    cscript.exe send_welcome.vbs
    ее надо удалить

    первый скрипт send_info.ps1 служит для отсылки отчета о созданных мылах администратору
    второй скрипт send_welcome.ps1 служит для отсылки сообщения пользователю.

    сообщение кладется в файл C:\Program Files\Tools\welcome_message\welcome.htm

    править из всего этого нужно
    1. строку Root   = "LDAP://DC01/DC=example,DC=spb,DC=ru" на полный путь до вашего контроллера
    например если у вас домен ANYNAME.CORP.RU, а имя контроллера DC001 То путь будет выглядеть
    Root   = "LDAP://DC001/DC=anyname,DC=corp,DC=ru"

    еще можно поменять пути к файлам...

    blog.wadmin.ru
    16 февраля 2010 г. 13:22
  • Спасибо большое!
    Вопросик есть один
    в файле welcome.htm можно сделать чтоб имя юзера вставлялось автоматом?
    16 февраля 2010 г. 14:08
  • не пробовал  т.к. не было задачи.
    предположительно если написать процедуру по получению Display Name по имеющемуся в переменной $singleAddress мылу то в шаблон вполне можно вписать что то вроде $user в которую предварительно помещать полученное значение.

    Вопрос в другом.
    А надо ли это?

    Welcome message как правило безликий и является некой сборкой правил использования электронной почты

    blog.wadmin.ru
    16 февраля 2010 г. 14:20
  • Прошу прощения, со скриптами не дружу. Впрочем как и с программированием. Вопрос таков - Function ListEmailInDomain(DomainDN) а где в скрипте декларируется DomainDN
    Второй вопрос:
    TProxyAddresses = rs.Fields("proxyAddresses")
          If Not IsNull(TProxyAddresses) Then
            TProxyAddressesCount = UBound(TProxyAddresses)
            For i = 0 To TProxyAddressesCount
               If LCase(Left(TProxyAddresses(i),4))="smtp" Then
                  If instr(lcase(trim(Mid(TProxyAddresses(i),6))),"@lenta.com") > 0 then
                            f.Write lcase(trim(Mid(TProxyAddresses(i),6))) & VBCRLf

    В этом блоке нет ошибки, в частности TProxyAddresses, может всетаки без T?
    17 февраля 2010 г. 12:24
  • Прошу прощения, со скриптами не дружу. Впрочем как и с программированием. Вопрос таков - Function ListEmailInDomain(DomainDN) а где в скрипте декларируется DomainDN
    Второй вопрос:
    TProxyAddresses = rs.Fields("proxyAddresses")
          If Not IsNull(TProxyAddresses) Then
            TProxyAddressesCount = UBound(TProxyAddresses)
            For i = 0 To TProxyAddressesCount
               If LCase(Left(TProxyAddresses(i),4))="smtp" Then
                  If instr(lcase(trim(Mid(TProxyAddresses(i),6))),"@lenta.com") > 0 then
                            f.Write lcase(trim(Mid(TProxyAddresses(i),6))) & VBCRLf

    В этом блоке нет ошибки, в частности TProxyAddresses, может всетаки без T?
    17 февраля 2010 г. 12:27
  • в каком скрипте ? ( передача параметра в функцию)

    а как обзовете переменную - так и будет хоть с T хоть с M
    Exchange MVP. _ This posting is provided "AS IS" with no warranties, and confers no rights.
    17 февраля 2010 г. 12:33
  • Прошу прощения, со скриптами не дружу. Впрочем как и с программированием. Вопрос таков - Function ListEmailInDomain(DomainDN) а где в скрипте декларируется DomainDN
    Второй вопрос:
    TProxyAddresses = rs.Fields("proxyAddresses")
          If Not IsNull(TProxyAddresses) Then
            TProxyAddressesCount = UBound(TProxyAddresses)
            For i = 0 To TProxyAddressesCount
               If LCase(Left(TProxyAddresses(i),4))="smtp" Then
                  If instr(lcase(trim(Mid(TProxyAddresses(i),6))),"@example.com") > 0 then
                            f.Write lcase(trim(Mid(TProxyAddresses(i),6))) & VBCRLf

    В этом блоке нет ошибки, в частности TProxyAddresses, может всетаки без T?
    как именовать переменные личное дело каждого.
    хотите можно и без Т, смысл от этого не поменяется.

    главное не ошибиться тут
    rs.Fields("proxyAddresses")


    blog.wadmin.ru
    17 февраля 2010 г. 12:52
  • Вопрос, я так понимаю, в свете этой http://social.technet.microsoft.com/Forums/ru-RU/ocsesru/thread/0d858c72-4c5e-4218-be76-d81e2d6ce40c задачи?

    В нем была же ссылка на скрипт от zero55? Он практически рабочий, хотя и излишне громоздок....

    DomainDN в нем декларируется при вызове функции ListEmailInDomain :


    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(FILENAME, 2, True)
    DomainDN = Example
    ListEmailInDomain(DomainDN)


    DomainDN должен быть вида LDAP://OU=AllUsers,DC=domain,DC=ru - если нужно обрабатывать пользователей в какой-либо одной OU либо
    LDAP://DC=domain,DC=ru - если парсить нужно весь домен


    Если ответ Вам помог, нажмите на изображение зеленой галочки - «пометить как ответ». Так же, Вы можете пометить это сообщение как «полезное», нажав на ссылку "проголосовать за полезное сообщение".
    17 февраля 2010 г. 13:21
  • Уважаемый Drud !

    Дабы не плодить темы, я объединю две эти темы.
    17 февраля 2010 г. 13:46
    Модератор
  • Спасибо, очень хорошее описание кода.

    Можете пожалуйста описать, какие куски кода в какой файл помещать?

    А то у вас два разных сообщения, немного путается из за этого.