Автоматическое создание подписи в Outlook 2010/2013 с помощью PowerShell | Windows для системных администраторов

Автоматическое создание подписи в Outlook 2010/2013 с помощью PowerShell

В этой статье мы покажем, как автоматически создать подпись пользователя в почтовом клиенте Outlook 2010 / 2013 с помощью PowerShell на основе данных из Active Directory. Благодаря описанной методике, можно добиться того, что при первом входе в систему и запуске Outlook у любого нового пользователя домена по единому шаблону автоматически создается  подпись  с его контактными данными, полученными из Active Directory.

Естественно, для того, чтобы такой скрипт работал корректно, нужно чтобы у всех пользователей в AD были указаны актуальные данные. В данном примере в подписи пользователя мы будем использовать следующие атрибуты Active Directory:

  • ФИО пользователя на русском языке (в моем случае эти данные хранятся в атрибуте  Description),
  • должность (атрибут Title)
  • наименование компании (поле Company)
  • почтовый индекс, город и адрес (PostalCode, City, StreetAddress)
  • телефонный номер (OfficePhone)
  • почтовый адрес (Mail)
  • адрес сайта (Homepage)

Подпись в Outlook 2010 2013 с помощью powershell

Нам нужно создать 3 файла с шаблонами подписей для Outlook в форматах htm (HTML), rtf (Rich Text) и txt (Plain Text). Дизайн, содержание и внешний вид шаблонов подписей в этих файлах должен соответствовать требованиям к корпоративной почтовой подписи.

Создадим файл signature.htm со следующим html кодом:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head></head>
<body>
<div id style="font-family:Arial&;color:#5B9BD5;">
<span style="font-size:10pt;color:#000000;">
<b><p>С уважением</p>
<p>@NAME</p>      </span>
<span style="font-size:9.0pt;">
<p>&nbsp;</p>
<p>@DESCRIPTION</p>
<p>@COMPANY</p></b>
<p> &nbsp;</p></span>
<span style="font-size:8.0pt;">
<p> @POSTALCODE, @CITY, @STREETADDRESS</p>
<p> тел.@OFFICEPHONE</p>
<p> <a href="http://@WEBSITE">@WEBSITE</a></p>
<p>e-mail:<a href="mailto:@EMAIL">@EMAIL</a></span>
</div>
</body>
</html>

html шаблон подписиСодержимое файлов signature.rtf и signature.txt будет таким:

С уважением,
@NAME
@DESCRIPTION
@COMPANY
@POSTALCODE, @CITY, @STREETADDRESS
Тел. @OFFICEPHONE
e-mail:@EMAIL
site:@WEBSITE

В каталоге C:\Users\Public\Downloads создадим папку OutlookSignature, в которой  будут хранится шаблоны подписей для Outlook и подписи пользователей компьютера.  Внутри каталога C:\Users\Public\Downloads\OutlookSignature создадим подкаталог Templates, в который нужно скопировать три файла с шаблонами подписей (это можно сделать вручную или с помощью предпочтений групповых политик (GPP)).

каталог с шаблонами для подписей OutlookСоздадим новый файл outlooksignature.ps1 со следующим кодом PowerShell (перед каждым блоком кода  приведу краткое  описание)

Определим набор переменных. В переменной $User содержится имя пользователя, из-под которого запускается скрипт. В остальных переменных пропишем имена и расширения файлов и пути к ним.

$User = $env:UserName
$FileName = "signature"
$FileExtension = "htm","rtf","txt"
$Path = "C:\Users\Public\Downloads"
$PathSignature = "$Path\OutlookSignature"
$PathSignatureTemplates = "$Path\OutlookSignature\Templates"
$PathSignatureUser = "$PathSignature\$User"
$AppSignatures =$env:APPDATA + "\Microsoft\Signatures"

Загрузим модуль PowerShell для работы с AD. Затем с помощью командлета Get-ADUser получим значения интересующих нас атрибутов пользователя в Active Directory и сохраним их в объекте $AD_user.

Примечание. Для работы командлета Get-ADUser в Windows 7 на ПК должен быть установлен RSAT, и включен компонент  Active Directory Module For Windows PowerShell (Control Panel -> Programs and Features -> Turn On/Off Windows Features -> Remote Server Administration Tools  -> Role Administration Tools  -> AD DS And AD LDS Tools )

Import-module activedirectory
$AD_user = Get-ADUser $User -Properties Title,Company,Description,Fax,HomePage,Mail,OfficePhone,PostalCode,City,StreetAddress

Создадим каталог для хранения файлов подписей пользователя и скопируем в него файлы шаблонов:

New-Item -Path "$PathSignature\$User" -ItemType Container –Force
foreach ($Ext in $FileExtension)
{
Copy-Item -Force "$PathSignatureTemplates\$FileName.$Ext" "$PathSignatureUser\$FileName.$Ext"
}

Затем с помощью функции replace заменим данные в шаблонах на данные пользователя из AD:

foreach ($Ext in $FileExtension)
{
(Get-Content "$PathSignatureUser\$FileName.$Ext") | Foreach-Object {
$_`
-replace "@NAME", $AD_user.Description `
-replace "@DESCRIPTION", $AD_user.title `
-replace "@COMPANY", $AD_user.Company `
-replace "@STREETADDRESS", $AD_user.StreetAddress `
-replace "@POSTALCODE", $AD_user.PostalCode `
-replace "@CITY", $AD_user.City `
-replace "@OFFICEPHONE", $AD_user.OfficePhone `
-replace "@EMAIL", $AD_user.Mail `
-replace "@WEBSITE", $AD_user.Homepage `
} | Set-Content "$PathSignatureUser\$FileName.$Ext"
}

Осталось скопировать файлы с шаблонами подписей в каталог, в котором Outlook 2010 / 2013 / 2016 хранит подписи %APPDATA%\Microsoft\Signatures (C:\Users\username\AppData\Roaming\Microsoft\Signatures).

foreach ($Ext in $FileExtension)
{
Copy-Item -Force "$PathSignatureUser\$FileName.$Ext" "$AppSignatures\$User.$Ext"
write-host "$PathSignatureUser\$FileName.$Ext"
write-host "$AppSignatures\$User.$Ext"
}

Чтобы при запуске Outlook использовал созданные файлы с шаблонами подписей, нужно

  • Удалить параметр First-Run в ветке HKEY_CURRENT_USER\Software\Microsoft\Office\<Версия Office>\Outlook\Setup
  • В ветке HKEY_CURRENT_USER\Software\Microsoft\Office\< Версия Office>\Common\MailSettings создать два строковых параметра с именами NewSignature и ReplySignature, в которых будет содержаться имя шаблона с подписью (в нашем примере имя шаблона соответствует имени учётной записи в AD)

Соответственно,  для работы с разными версиями MS Office нужно добавить такой код:

#Office 2010
If (Test-Path HKCU:'\Software\Microsoft\Office\14.0') {
Remove-ItemProperty -Path HKCU:\Software\Microsoft\Office\14.0\Outlook\Setup -Name First-Run -Force -ErrorAction SilentlyContinue -Verbose
New-ItemProperty HKCU:'\Software\Microsoft\Office\14.0\Common\MailSettings' -Name 'ReplySignature' -Value $User -PropertyType 'String' -Force
New-ItemProperty HKCU:'\Software\Microsoft\Office\14.0\Common\MailSettings' -Name 'NewSignature' -Value $User -PropertyType 'String' -Force
}
#Office 2013
If (Test-Path HKCU:'\Software\Microsoft\Office\15.0') {
Remove-ItemProperty -Path HKCU:\Software\Microsoft\Office\15.0\Outlook\Setup -Name First-Run -Force -ErrorAction SilentlyContinue -Verbose
New-ItemProperty HKCU:'\Software\Microsoft\Office\15.0\Common\MailSettings' -Name 'ReplySignature' -Value $User -PropertyType 'String' -Force
New-ItemProperty HKCU:'\Software\Microsoft\Office\15.0\Common\MailSettings' -Name 'NewSignature' -Value $User -PropertyType 'String' -Force
}

Скрипт для автоматического формирования подписи в Outlook с помощью powershell

Осталось назначить данный PowerShell скрипт на однократный  запуск с помощью Group Policy Preferences при входе пользователя в систему. В результате при запуске Outlook автоматически будет использовать сформированную электронную подпись для отправляемых писем (на первом рисунке статьи приведен пример такой автоматически сформированной подписи).

Несколько советов.

  • В том случае, если Outlook отображает htm подпись с большими (двойными) отступами между строками, это баг Outlook Лучше всего создать файл с шаблоном htm подписи непосредственно в  Outlook, и использовать в качестве шаблона именно этот файл (хранится в %APPDATA%\Microsoft\Signatures)
  • В подпись также можно добавить фотографию пользователя из атрибута thumbnailPhoto в Active Directory. Т.к. простого способа добавить изображение в подпись Outlook нет, проще всего, как и в пункте выше создать шаблон подписи с произвольным изображением в Outlook и в PowerShellскрипте копированием заменять файл с изображением в каталоге с шаблоном (изображение хранится в каталоге %AppData%\Microsoft\Signatures\<имя подписи>.files).способ добавить изображение в шаблон подписи outlook
  • В Exchange 2007 и выше простейшую текстовую подпись, автоматически подставляемую во все письма, можно также реализовать с помощью транспортных правил
Еще записи по теме: Outlook, PowerShell
Понравилась статья? Скажи спасибо и расскажи друзьям!
Назад:
Вперед:

Комментариев: 5

Оставить комментарий
  1. Виктор Мусатов | 25.01.2017

    эммм… и что, на каждом пользовательском ПК нужно RSAT поставить для работы скрипта?
    можно же и без этого обойтись:

    $UserName = $env:username
    $Filter = «(&(objectCategory=User)(samAccountName=$UserName))»
    $Searcher = New-Object System.DirectoryServices.DirectorySearcher
    $Searcher.Filter = $Filter
    $ADUserPath = $Searcher.FindOne()
    $userinfo = $ADUserPath.GetDirectoryEntry()
    $Word = New-Object -Comobject «Word.Application»
    $Word.Visible = $false
    $doc = $Word.Documents.Add()
    $selection = $Word.selection
    $signatureEntries = $word.EmailOptions.EmailSignature.EmailSignatureEntries
    $signature = $word.EmailOptions.EmailSignature
    #endregion

    $strFirstName = $userinfo.FirstName
    $strLastName = $userinfo.LastName
    $strDisplayname = $userinfo.DisplayName
    $strTitle = $userinfo.Title
    $strCompany = ‘Company’
    $strDepartment = $userinfo.Department
    $StrTel = » +7 (495) XXX-XX-XX»
    $strQick = «M. +7 (000) 000 0000″
    $strExt = $userinfo.telephoneNumber
    $strLogo = «http://www.company.ru/logo.png»
    $strSpace = » »
    $strEmail = $userinfo.mail
    $strWeb = «www.company.ru»
    $strText = «С уважением,»
    $Selection.ParagraphFormat.Space1
    $Selection.ParagraphFormat.LeftIndent = 10

    $NL = [Environment]::NewLine
    $Selection.Font.Name = «Calibri»
    $Selection.Font.Size = «11»

    $selection.Typetext(«`v»)
    $pic = $selection.InlineShapes.AddPicture($strLogo, $true)
    $word_selection = $doc.Range()

    $signatureEntries.Add(«Company Signature», $word_selection)
    #$signature.NewMessageSignature = «Company Signature »
    #$signature.ReplyMessageSignature = «Company Signature »

    $doc.Saved = $True
    $word.Quit()
    [System.Runtime.InteropServices.Marshal]::ReleaseComObject($word) | Out-Null
    Remove-Variable -Name word
    [gc]::collect()
    [gc]::WaitForPendingFinalizers()

    хотя сам вариант с шаблоном и подменой значений однозначно удобен, попробую себе применить.

    Ответить
    • itpro | 25.01.2017

      Отчасти согласен, можно LDAP запрос реализовать и без использования модуля Active Directory Module for PowerShell. Скрипт можно легко модифицировать.
      Хотя автоматизированная установка RSAT и активация модуля тоже проблем не должна вызвать:
      Установка RSAT (подставляем KB в зависимости от версии ОС и разрядности)
      wusa Windows6.1-KB958830-x64.msu /quiet
      А потом активируемым модуль командой:
      dism /Online /Enable-Feature /FeatureName:RSATClient-Roles-AD-Powershell

      Ответить
      • Антон | 25.01.2017

        В Win7 этот модуль активируется по другому:
        dism /online /enable-feature /featurename:RemoteServerAdministrationTools-Roles-AD-Powershell

        Ответить
  2. Игорь | 01.02.2017

    Коллеги, есть где-нибудь скрипт для автоматического подключения *.pst в Outlook через gpo?

    Ответить
Полные правила комментирования на сайте winitpro.ru. Вопросы, не связанные с содержимым статьи или ее обсуждением удаляются.

Сказать Спасибо! можно на этой странице или (еще лучше) поделиться с друзями ссылкой на понравившуюся статью в любимой социальной сети(специально для этого на сайте присуствуют кнопки популярных соц. сетей).

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)



MAXCACHE: 0.26MB/0.02732 sec