none
Welcome письмо exchange Powershell RRS feed

  • Вопрос

  • Добрый день.

    Помогите сделать приветственное письмо. Делал по инструкции

    https://www.informaticar.net/create-welcome-email-message-in-exchange-2013/

    немного переписал скрипт

    if($succeeded) {
    if ($provisioningHandler.TaskName -eq "New-Mailbox") {
    
    $USRdname=$provisioningHandler.UserSpecifiedParameters["Name"]
    
    $Ualias=$provisioningHandler.UserSpecifiedParameters["Alias"]
    
    $pSMTP = (get-mailbox $Ualias | select-object PrimarySMTPAddress | Format-Wide | Out-String ).trim()
    
    }
    
    elseif ($provisioningHandler.TaskName -eq "Enable-Mailbox") {
    
    $eUalias=$provisioningHandler.UserSpecifiedParameters["Alias"]
    
    $dName = (get-mailbox $eUalias | select-object Name | Format-Wide | Out-String ).trim()
    
    $pSMTP = (get-mailbox $eUalias | select-object PrimarySMTPAddress | Format-Wide | Out-String ).trim()
    
    
    
    }
    
    $fromHR="support@*******"
            $SubjectHR="Тестовое сообщение!"
            $BodyHR = [string] (get-content ("C:\Script\welcome.htm")) 
            $fileHR = "C:\Script\welcome.htm"
            $smtp="MY server"
            Send-MailMessage -From $fromHR -To $pSMTP -Subject  $SubjectHR -Body $UsrAlias -BodyAsHtml -Encoding ([System.Text.Encoding]::UTF8) -SmtpServer $Smtp
    
    }
    Путем перебора и оправки переменных к себе в почту я понял что в переменную $pSMTP засовываются все почтовые адреса всех пользователей. Не могу разобраться ка кподчинить.
    • Изменено Vector BCOModerator 12 мая 2020 г. 10:51 добавлен скриптблок
    • Перемещено Vector BCOModerator 12 мая 2020 г. 10:55 перенесено из курилки

Все ответы

  • проверяйте

    $eUalias=$provisioningHandler.UserSpecifiedParameters["Alias"]

    так как если эта переменная будет пустой get-mailbox не будет иметь фильтра и вернет все ящики

    Дополнительно на скрине обозначены красными стрелками те строки кода которые вы никак не используете а зелеными - дубликаты. Учитывая это у вас If от elseif ничем не отличается


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • то что некоторые строчки не используются это я знаю. 

    Вопрос по такому куску скрипта - как вернуть почтовый адрес(первая строка отрабатывает на ура и возвращает логин пользователя, а вот вторая строчка не работает)

    $UsrIdentity = $provisioningHandler.UserSpecifiedParameters["Identity"].ToString()
            $UsrAlias = (Get-Mailbox -Identity $UsrIdentity).PrimarySmtpAddress.ToString()

  • то что некоторые строчки не используются это я знаю. 

    Вопрос по такому куску скрипта - как вернуть почтовый адрес(первая строка отрабатывает на ура и возвращает логин пользователя, а вот вторая строчка не работает)

    $UsrIdentity = $provisioningHandler.UserSpecifiedParameters["Identity"].ToString()
            $UsrAlias = (Get-Mailbox -Identity $UsrIdentity).PrimarySmtpAddress.ToString()

    1 пользуйтесь пожалуйста скрипт блоками для публикации кода

    2 я не вижу приведенного вами фрагмента кода из комментария выше в оригинальном коде вопроса. Почистите пожалуйста код до актуального и необходимого состояния 


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Прошу прощения, это кусок из второго скрипта, первый не смог подчинить.

    вот полный скрипт

    if($succeeded) {
    
    if ($provisioningHandler.TaskName -eq "New-Mailbox") {
    
    $UsrAl = $provisioningHandler.UserSpecifiedParameters["Alias"]
    $UsrAlias = (Get-Mailbox -Filter {Alias -eq $UsrAl}).PrimarySmtpAddress.ToString()
    
    
    }
    
    elseif ($provisioningHandler.TaskName -eq "Enable-Mailbox") {
    
    $UsrIdentity = $provisioningHandler.UserSpecifiedParameters["Identity"].ToString()
    $UsrAlias = (Get-Mailbox -Filter {Alias -eq $UsrIdentity}).PrimarySmtpAddress.ToString()
    
    }
    $fromHR="support@*****"
            $SubjectHR="Тестовое сообщение!"
            $BodyHR = [string] (get-content ("C:\Script\welcome.htm")) 
            $fileHR = "C:\Script\welcome.htm"
            $smtp="server"
    
            Send-MailMessage -From $fromHR -To $UsrAlias -Subject  $SubjectHR -Body $BodyHR -BodyAsHtml -Encoding ([System.Text.Encoding]::UTF8) -SmtpServer $Smtp
    
    }

    Этот скрипт выполняется службой скриптагента при создании нового почтового ящика или подключении ящика существующему пользователю. Поэтому два условия в зависимости от того подключаем ящик существующему или создаем нового пользователя. 

    При выполнении скрипта ошибка ниже. Судя по ошибке он не поймет кому слать письмо.

    Агент расширения командлета с индексом 5 создал исключение в OnComplete(). Исключение: Microsoft.Exchange.Provisioning.ProvisioningException: ScriptingAgent: в ходе вызова сценария для API OnComplete возникло исключение: Не удается проверить аргумент для параметра "To". Аргумент пустой или имеет значение NULL. Укажите непустой аргумент, не имеющий значение NULL, после чего повторите выполнение команды.. ---> System.Management.Automation.ParameterBindingValidationException: Не удается проверить аргумент для параметра "To". Аргумент пустой или имеет значение NULL. Укажите непустой аргумент, не имеющий значение NULL, после чего повторите выполнение команды. ---> System.Management.Automation.ValidationMetadataException: Аргумент пустой или имеет значение NULL.



    • Изменено Vector BCOModerator 12 мая 2020 г. 12:08 автор настойчиво игнорирует кодблоки
  • Не игнорируйте пожалуйста кодблоки. Мне не по приколу править ваши сообщения

    if ($succeeded) {
    
        if ($provisioningHandler.TaskName -eq "New-Mailbox") {
            $UsrIdentity = $provisioningHandler.UserSpecifiedParameters["Alias"]
        } elseif ($provisioningHandler.TaskName -eq "Enable-Mailbox") {
            $UsrIdentity = $provisioningHandler.UserSpecifiedParameters["Identity"].ToString()
        }
    
        if ([string]::IsNullOrEmpty($UsrIdentity)){
            throw "UsrIdentity is empty"
        } else {
            $UsrAlias = (Get-Mailbox -Filter {Alias -eq $UsrIdentity})
    
            if ([string]::IsNullOrEmpty($UsrAlias)) {
                throw "UsrAlias object is empty. '$UsrIdentity' not found"
            }else {
                $UsrAlias = $UsrAlias.PrimarySmtpAddress
                if ([string]::IsNullOrEmpty($UsrAlias)) {
                    throw "UsrAlias '$UsrIdentity' exists but parameter 'PrimarySmtpAddress' empty or incorrect"
                } else {
                    $fromHR = "support@*****"
                    $SubjectHR = "Тестовое сообщение!"
                    $BodyHR = [string] (get-content ("C:\Script\welcome.htm")) 
                    $fileHR = "C:\Script\welcome.htm"
                    $smtp = "server"
    
                    Send-MailMessage -From $fromHR `
                                    -To $UsrAlias `
                                    -Subject  $SubjectHR `
                                    -Body $BodyHR `
                                    -BodyAsHtml `
                                    -Encoding ([System.Text.Encoding]::UTF8) `
                                    -SmtpServer $Smtp
                }
            }
        }
    }
    Добавьте дебаг чтоб посмотреть где у вас проблема


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Запустил через PS чтоб увидеть ошибку

    ПРЕДУПРЕЖДЕНИЕ: Агент расширения командлета с индексом 5 создал исключение в OnComplete(). Исключение: Microsoft.Exchange.Provisioning.ProvisioningException:
    ScriptingAgent: в ходе вызова сценария для API OnComplete возникло исключение: UsrAlias object is empty. 'testa2' not found. --->
    System.Management.Automation.RuntimeException: UsrAlias object is empty. 'testa2' not found ---> System.Management.Automation.RuntimeException: UsrAlias object is
    empty. 'testa2' not found

    Значит проблема в строке, правильно?

    $UsrAlias = (Get-Mailbox -Filter {Alias -eq $UsrIdentity})


  • Правильно понимаете. Можете в консоли дебажить пока не получите правильный результат

    Судя по справке Identity это тот параметр который вам нужен так как он принимает в качестве инпута Alias`ы


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • Вообщем извратился по полной.

    Отрабатываю проверку команды Enable-Mailbox.

    Получилось следующее -  создаю в AD нового пользователя, подключаю ящик - всё ОТЛИЧНО, письмо ему приходит. Отключаю в админке этот ящик, подключаю новый ящик  и сразу несколько ошибок. 

    Либо пишет что опять некому отправить - параметр ТО нулевое (при проверке и отправке мне на почту значения переменной $а приходит нужный адрес)

    Либо все проходит отлично, но зайти в этот почтовый ящик не возможно через браузер, ошибка открытия.

    Попытался очистить переменные, результат тот же. 

    Возможно после отключения ящиков и их повторного создания проходит мало времени и сервак просто не успевает их снести с баз данных.....

    <?xml version="1.0" encoding="utf-8" ?>
    <Configuration version="1.0">
    <Feature Name="WelcomeEmail" Cmdlets="New-Mailbox,Enable-Mailbox">
    <ApiCall Name="OnComplete">
    if ($succeeded) {
    		$fromHR = "support@****"
                    $SubjectHR = "Тестовое сообщение!"
                    $BodyHR = [string] (get-content ("C:\Script\welcome.htm")) 
                    $fileHR = "C:\Script\welcome.htm"
                    $smtp = "server"	
    
        if ($provisioningHandler.TaskName -eq "New-Mailbox") {
            $UsrIdentity = $provisioningHandler.UserSpecifiedParameters["Alias"]
        } elseif ($provisioningHandler.TaskName -eq "Enable-Mailbox") {
            $UsrIdentity = $provisioningHandler.UserSpecifiedParameters["Identity"].ToString()
    	$UsrAlias = get-aduser -identity $UsrIdentity
    	$UsrAlias1 = $UsrAlias.samaccountname
      	$tempDA = get-mailbox -identity $UsrAlias1 -RecipientTypeDetails UserMailbox
    	$a = $tempDA.WindowsEmailAddress.ToString()
    
    Send-MailMessage -From $fromHR -To "$a" -Subject  $SubjectHR -Body $BodyHR -BodyAsHtml -Encoding ([System.Text.Encoding]::UTF8) -SmtpServer $smtp
    
        }
    
    if ($fromHR) { Remove-Variable fromHR }
    if ($SubjectHR) { Remove-Variable SubjectHR }
    if ($BodyHR) { Remove-Variable BodyHR }
    if ($fileHR) { Remove-Variable fileHR }
    if ($smtp) { Remove-Variable smtp }
    if ($UsrIdentity) { Remove-Variable UsrIdentity }
    if ($UsrAlias) { Remove-Variable UsrAlias }
    if ($UsrAlias1) { Remove-Variable UsrAlias1 }
    if ($tempDA) { Remove-Variable tempDA}	
    if ($a) { Remove-Variable a}	
                  
    	     
    }
    </ApiCall>
    </Feature>
    </Configuration>

  • как дебажить ваш код я показал выше

    по аналогии вы можете проверять все остальные свои изменения

    этот if не делает ничего

        if ($provisioningHandler.TaskName -eq "New-Mailbox") {

    так как *все любые* действия производятся только если скрипт идет в elseif


    The opinion expressed by me is not an official position of Microsoft

    Модератор
  • За дебаг спасибо огромное. 

    Первый if да, я пока не создаю сразу новых пользователей, а подключаю  существующим, отлажу elseif, перейду к нему. Просто дальше дебаг не совсем поможет, т.к. появившиеся проявления непонятны и к PS коду они не относятся.

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

  • Короче нужно было добавить паузы 

    } elseif ($provisioningHandler.TaskName -eq "Enable-Mailbox") {
    Start-Sleep -s 5
            $UsrIdentity = $provisioningHandler.UserSpecifiedParameters["Identity"].ToString()
        Start-Sleep -s 5
    $UsrAlias = get-aduser -identity $UsrIdentity

     теперь все отлично отрабатывает.

  • День добрый

    При наличии нескольких DC, для экстеншн агента хорошо бы их указывать, например так:

    if ($succeeded -and -not $provisioningHandler.UserSpecifiedParameters.Contains("Archive")) {
        $DC = [string]($readOnlyIConfigurable.originatingserver)
    
        if ($provisioningHandler.TaskName -eq "New-Mailbox") {
            $Identity = $provisioningHandler.UserSpecifiedParameters["UserPrincipalName"]
        }
        elseif ("Enable-Mailbox", "Connect-Mailbox" -contains $provisioningHandler.TaskName) {
            $Identity = $provisioningHandler.UserSpecifiedParameters["Identity"].RawIdentity
        }
    
        if ($Identity) {
            # Полезная нагрузка
            Set-Mailbox -Identity $Identity -SingleItemRecoveryEnabled:$true -DomainController $DC
        }
    }
    или вначале делать паузу, т.к. объёкт может создаться/измениться на одном контроллере а читать его скриптом начинают с другого.


    Грамотная постановка вопроса - уже 50% решения.
    SCCM User Group Russia на FaceBook и в Telegram