none
Автоматическая подпись Outlook 2016 в зависимости от почтового ящика. RRS feed

  • Вопрос

  • Добрый день, сейчас сделана стандартизированная подпись всем пользователям в AD через скрипт PowerShell. Это идеальный вариант, если почтовый домен всего один, но как быть, если у некоторых сотрудников подключено по 2-3 почтовых ящика и у всех разные домены @mymail.com, @company.com, @partner.com? Можно каким либо способом сделать отдельную подпись для каждого домена с проверкой на то, подключен ли почтовый ящик пользователю? Думаю, что можно как-то парсить реестр юзера и делать проверку через него, но не знаю, как грамотно все сделать. Уверен, что не я один сталкивался с такой проблемой, может у кого есть готовое решение.

    Скрипт на один домен такой:

    if((Get-ExecutionPolicy) -ne 'AllSigned') {
        Set-ExecutionPolicy -Scope Process Bypass -force
    }
    
    #Получить атрибуты пользователя
    $strName = $env:USERNAME
    $strFilter = "(&(objectCategory=User)(samAccountName=$strName))"
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.Filter = $strFilter
    $objPath = $objSearcher.FindOne()
    $objUser = $objPath.GetDirectoryEntry()
    
    #Имя
    $Name = $objUser.Name
    
    #Почта
    $Mail = $objUser.mail
    
    $Roaming = [Environment]::GetFolderPath('ApplicationData')
    $Path = "$Roaming\Microsoft\Signatures"
    
    #Удаляем старые подписи
    If ((Test-Path "$Path") -eq $True) {
        Remove-Item "$Path" -Recurse
    }
    
    #Копируем шаблон подписи
    $domen = ([DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Name
    Copy-Item -Path "\\$domen\SYSVOL\$domen\EmailSignatures\Sig" -Recurse -Destination "$Path" -Force 
    
    #Подпись
    (Get-Content -Path "$Path\sig.htm") | ForEach-Object {$_ -replace "ADName", "$Name"} | Set-Content -Path "$Path\sig.htm"
    (Get-Content -Path "$Path\sig.htm") | ForEach-Object {$_ -replace "ADPosition", "$Mail"} | Set-Content -Path "$Path\sig.htm"
    
    #Делаем подпись по-умолчанию
    $RegPath = "HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002"
    
    $SigSign = "Sig"
    
    Set-ItemProperty -Path $RegPath -Name "New Signature" -Value $SigSign
    Set-ItemProperty -Path $RegPath -Name "Reply-Forward Signature" -Value $SigSign

    P.S. Отдельная благодарность Sergey Ya за имеющийся скрипт.



    27 июня 2018 г. 13:03

Ответы

  • Разобрался, с Outlook 2016 все работает как надо.

    Вместо старого параметра:

    $RegPath = "HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002"

    сделал

    # Ищем в реестре учетку с названием mymail и сохраняем путь до нее
    $HomePath = "HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\"
    $AccountPath = Get-ChildItem "HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676" -Recurse | ForEach-Object {Get-ItemProperty $_.pspath } | Where-Object -FilterScript {$_.Email -match 'mymail'} | Select -ExpandProperty PSChildName
    $RegPath = $HomePath + $AccountPath

    Теперь целиком скрипт выглядит так:

    if((Get-ExecutionPolicy) -ne 'AllSigned') {
        Set-ExecutionPolicy -Scope Process Bypass -force
    }
    
    # Получить атрибуты пользователя
    $strName = $env:USERNAME
    $strFilter = "(&(objectCategory=User)(samAccountName=$strName))"
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.Filter = $strFilter
    $objPath = $objSearcher.FindOne()
    $objUser = $objPath.GetDirectoryEntry()
    
    # Имя
    $Name = $objUser.Name
    
    # Почта
    $Mail = $objUser.mail
    
    $Roaming = [Environment]::GetFolderPath('ApplicationData')
    $Path = "$Roaming\Microsoft\Signatures"
    
    # Удаляем старые подписи
    If ((Test-Path "$Path") -eq $True) {
        Remove-Item "$Path" -Recurse -Exclude *mymail1*, *mymail2*, *colorschememapping*, *filelist*, *image*, *themedata*
    }
    
    # Копируем шаблон подписи
    $domen = ([DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Name
    Copy-Item -Path "\\jupiter\SYSVOL\alfa.domain\EmailSignatures\Mymail\*" -Recurse -Destination "$Path" -Force
    Copy-Item -Path "\\jupiter\SYSVOL\alfa.domain\EmailSignatures\Mymail\mymail.files" -Recurse -Destination "$Path" -Force  
    
    # Подпись
    # MYMAIL
    (Get-Content -Path "$Path\mymail.htm") | ForEach-Object {$_ -replace "ADName", "$Name"} | Set-Content -Path "$Path\mymail.htm"
    (Get-Content -Path "$Path\mymail.htm") | ForEach-Object {$_ -replace "ADMail", "$Mail"} | Set-Content -Path "$Path\mymail.htm"
    
    #------------------Делаем подпись по-умолчанию-----------------------
    
    # Ищем в реестре учетку с названием mymail и сохраняем путь до нее
    $HomePath = "HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\"
    $AccountPath = Get-ChildItem "HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676" -Recurse | ForEach-Object {Get-ItemProperty $_.pspath } | Where-Object -FilterScript {$_.Email -match 'mymail'} | Select -ExpandProperty PSChildName
    $RegPath = $HomePath + $AccountPath
    
    # Меняем значение реестра, чтобы подпись с названием mymail стала подписью по умолчанию
    $Mailsign = "mymail"
    
    Set-ItemProperty -Path $RegPath -Name "New Signature" -Value $Mailsign
    Set-ItemProperty -Path $RegPath -Name "Reply-Forward Signature" -Value $Mailsign



    • Помечено в качестве ответа Michael L4n3 6 июля 2018 г. 12:53
    • Снята пометка об ответе Michael L4n3 6 июля 2018 г. 12:54
    • Изменено Michael L4n3 6 июля 2018 г. 12:57
    • Помечено в качестве ответа Michael L4n3 6 июля 2018 г. 12:58
    6 июля 2018 г. 12:53

Все ответы

  • Приветствую! Очень приятно видеть свои работы, спасибо! :D

    Лично для меня - парсить в реестр это самый последний вариант.

    Вот вам пара полезных переменных:

    $env:LOGONSERVER

    $env:USERDNSDOMAIN

    $env:USERDOMAIN

    Ну и все это дело будет выглядеть примерно так:

    if ($env:USERDOMAIN -eq domen.com) {

    Блок с персональными настройками типа: Город, шрифт, какие подписи и их нзвания

    }

    • Изменено Sergey Ya 27 июня 2018 г. 14:08
    27 июня 2018 г. 14:08
  • И еще.

    Я тут нашел более правильный/красивый метод выставление подписей по умолчанию:

    $newMessageSignature = "НазваниеПодписи"
    $replyMessageSignature = "НазваниеПодписи"
    if ($setDefaultSignature -eq 1) {
    	$objWord = New-Object -com word.application
    	if ($newMessageSignature -ne "" -or $newMessageSignature -ne $null) {
    		$objWord.EmailOptions.EmailSignature.NewMessageSignature = $newMessageSignature
    	}
    	if ($replyMessageSignature -ne "" -or $replyMessageSignature -ne $null) {
    		$objWord.EmailOptions.EmailSignature.ReplyMessageSignature = $replyMessageSignature
    	}
    	$objWord.Quit()
    }

    27 июня 2018 г. 14:43
  • Спасибо за ответ :)

    Я видно не правильно выразился, ситуация такова, что у одного пользователя (допустим это секретарь) есть 3 почтовых ящика: info@mymail.com, info@company.com, info@partner.com

    Как проще всего сделать, чтобы подпись для каждого отдельного почтового ящика создавалась на основе данных АД этого пользователя и цеплялась к определенной почтовой учетной записи?

    Я думаю, что можно сделать по отдельному шаблону для каждой почты, проверять реестр на наличие той или иной почты в реестре, по этому параметру:

    И уже в зависимости от этого запускать тот или иной кусок скрипта. Насколько рабочая схема?
    27 июня 2018 г. 14:58
  • Я не уверен, что в профиле будут фигурировать все ящики пользователя. Если все же они там будут, то можно брать параметр непосредственно из реестра.

    Еще можно взять все почтовые ящики из переменной $objUser Вот только я не помню какой за это отвечает параметр $objUser.ПочтовыеЯщики , завтра смогу посмотреть

    Схема рабочая


    27 июня 2018 г. 16:12
  • Может кто подсказать, как правильно парсить реестр? У меня толкового ничего не выходит, лоускилл.
    28 июня 2018 г. 20:19
  • Разобрался, с Outlook 2016 все работает как надо.

    Вместо старого параметра:

    $RegPath = "HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\00000002"

    сделал

    # Ищем в реестре учетку с названием mymail и сохраняем путь до нее
    $HomePath = "HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\"
    $AccountPath = Get-ChildItem "HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676" -Recurse | ForEach-Object {Get-ItemProperty $_.pspath } | Where-Object -FilterScript {$_.Email -match 'mymail'} | Select -ExpandProperty PSChildName
    $RegPath = $HomePath + $AccountPath

    Теперь целиком скрипт выглядит так:

    if((Get-ExecutionPolicy) -ne 'AllSigned') {
        Set-ExecutionPolicy -Scope Process Bypass -force
    }
    
    # Получить атрибуты пользователя
    $strName = $env:USERNAME
    $strFilter = "(&(objectCategory=User)(samAccountName=$strName))"
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.Filter = $strFilter
    $objPath = $objSearcher.FindOne()
    $objUser = $objPath.GetDirectoryEntry()
    
    # Имя
    $Name = $objUser.Name
    
    # Почта
    $Mail = $objUser.mail
    
    $Roaming = [Environment]::GetFolderPath('ApplicationData')
    $Path = "$Roaming\Microsoft\Signatures"
    
    # Удаляем старые подписи
    If ((Test-Path "$Path") -eq $True) {
        Remove-Item "$Path" -Recurse -Exclude *mymail1*, *mymail2*, *colorschememapping*, *filelist*, *image*, *themedata*
    }
    
    # Копируем шаблон подписи
    $domen = ([DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest()).Name
    Copy-Item -Path "\\jupiter\SYSVOL\alfa.domain\EmailSignatures\Mymail\*" -Recurse -Destination "$Path" -Force
    Copy-Item -Path "\\jupiter\SYSVOL\alfa.domain\EmailSignatures\Mymail\mymail.files" -Recurse -Destination "$Path" -Force  
    
    # Подпись
    # MYMAIL
    (Get-Content -Path "$Path\mymail.htm") | ForEach-Object {$_ -replace "ADName", "$Name"} | Set-Content -Path "$Path\mymail.htm"
    (Get-Content -Path "$Path\mymail.htm") | ForEach-Object {$_ -replace "ADMail", "$Mail"} | Set-Content -Path "$Path\mymail.htm"
    
    #------------------Делаем подпись по-умолчанию-----------------------
    
    # Ищем в реестре учетку с названием mymail и сохраняем путь до нее
    $HomePath = "HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676\"
    $AccountPath = Get-ChildItem "HKCU:\Software\Microsoft\Office\16.0\Outlook\Profiles\Outlook\9375CFF0413111d3B88A00104B2A6676" -Recurse | ForEach-Object {Get-ItemProperty $_.pspath } | Where-Object -FilterScript {$_.Email -match 'mymail'} | Select -ExpandProperty PSChildName
    $RegPath = $HomePath + $AccountPath
    
    # Меняем значение реестра, чтобы подпись с названием mymail стала подписью по умолчанию
    $Mailsign = "mymail"
    
    Set-ItemProperty -Path $RegPath -Name "New Signature" -Value $Mailsign
    Set-ItemProperty -Path $RegPath -Name "Reply-Forward Signature" -Value $Mailsign



    • Помечено в качестве ответа Michael L4n3 6 июля 2018 г. 12:53
    • Снята пометка об ответе Michael L4n3 6 июля 2018 г. 12:54
    • Изменено Michael L4n3 6 июля 2018 г. 12:57
    • Помечено в качестве ответа Michael L4n3 6 июля 2018 г. 12:58
    6 июля 2018 г. 12:53