В этой статье мы покажем, как автоматически создать подпись пользователя в почтовом клиенте Outlook 2010 / 2013 с помощью PowerShell на основе данных из Active Directory. Благодаря описанной методике, можно добиться того, что при первом входе в систему и запуске Outlook у любого нового пользователя домена по единому шаблону автоматически создается подпись с его контактными данными, полученными из Active Directory.
Естественно, для того, чтобы такой скрипт работал корректно, нужно чтобы у всех пользователей в AD были указаны актуальные данные. В данном примере в подписи пользователя мы будем использовать следующие атрибуты Active Directory:
- ФИО пользователя на русском языке (в моем случае эти данные хранятся в атрибуте Description),
- должность (атрибут Title)
- наименование компании (поле Company)
- почтовый индекс, город и адрес (PostalCode, City, StreetAddress)
- телефонный номер (OfficePhone)
- почтовый адрес (Mail)
- адрес сайта (Homepage)
Нам нужно создать 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> </p>
<p>@DESCRIPTION</p>
<p>@COMPANY</p></b>
<p> </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>
Содержимое файлов 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)).
Создадим новый файл 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.
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
}
Осталось назначить данный PowerShell скрипт на однократный запуск с помощью Group Policy Preferences при входе пользователя в систему. В результате при запуске Outlook автоматически будет использовать сформированную электронную подпись для отправляемых писем (на первом рисунке статьи приведен пример такой автоматически сформированной подписи).
Несколько советов.
- В том случае, если Outlook отображает htm подпись с большими (двойными) отступами между строками, это баг Outlook Лучше всего создать файл с шаблоном htm подписи непосредственно в Outlook, и использовать в качестве шаблона именно этот файл (хранится в %APPDATA%\Microsoft\Signatures)
- В подпись также можно добавить фотографию пользователя из атрибута thumbnailPhoto в Active Directory. Т.к. простого способа добавить изображение в подпись Outlook нет, проще всего, как и в пункте выше создать шаблон подписи с произвольным изображением в Outlook и в PowerShellскрипте копированием заменять файл с изображением в каталоге с шаблоном (изображение хранится в каталоге %AppData%\Microsoft\Signatures\<имя подписи>.files).
- В Exchange 2007 и выше простейшую текстовую подпись, автоматически подставляемую во все письма, можно также реализовать с помощью транспортных правил
эммм… и что, на каждом пользовательском ПК нужно 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()
хотя сам вариант с шаблоном и подменой значений однозначно удобен, попробую себе применить.
Отчасти согласен, можно 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
В Win7 этот модуль активируется по другому:
dism /online /enable-feature /featurename:RemoteServerAdministrationTools-Roles-AD-Powershell
Win10 1809 и выше:
Add-WindowsCapability -Name Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0 -Online
Коллеги, есть где-нибудь скрипт для автоматического подключения *.pst в Outlook через gpo?
Посмотрите этот vbs скрипт (https://blogs.technet.microsoft.com/messaging_and_beyond/2012/05/10/scripting-adding-pst-files-to-an-outlook-profile-automatically/). Думаю его можно допилить и запускать через логон-скрипт / задание планировщика
Добрый день! Вот такая ситуация: Пользователь использует программу Outlook. У пользователя, уже сформирована подпись со всеми стилями отображения. Когда пользователь создает новое письмо, то в конце письма создается автоматически подпись к письму. Вопрос: Есть ли возможность, когда пользователь ведет переписку при нажатии кнопки «Ответить» или «Ответить всем», в письме сохранялся СТИЛЬ подписи (со своим шрифтом, выделенные жирным шрифтом и т.д)?
В настройках подписи в Outlook выберите, чтобы подпись применялась не только к «новые сообщения», но и к «ответ и пересылка».
Отличная инструкция. Правда, возникли проблемы с отображением иллюстрации в подписи, но это решилось созданием подписи в почтовом клиенте, правкой htm — шаблона и корректировкой путей для img в скрипте при копировании шаблона (при логине). А так — отлично работает. Правда, врукопашную я наверное меньше бы потратил времени, чем на реализацию, но — маст хэв однозначно
а поделишься кодом касаемо иллюстрации? Не могу никак с ней совладать
Сам сделал, всё легко.
За статью уважуха.
#копируем графический файл с логотипом вместе с папкой-спутником для htm-файла, минуя буферное расположение
New-Item -Path «$AppSignatures» -Name «$User.files» -ItemType «directory»
Copy-Item -Force -Path «$PathSignatureTemplates\signature.files\*» -Destination «$AppSignatures\$User.files» -Recurse
#меняем в htm-файле пути к папке-спутнику
(Get-Content «$AppSignatures\$User.htm») | Foreach-Object {
$_`
-replace «signature.files», «$User.files» `
} | Set-Content «$AppSignatures\$User.htm»
#меняем в файле filelist.xml имя htm-файла
(Get-Content «$AppSignatures\$User.files\filelist.xml») | Foreach-Object {
$_`
-replace «signature.htm», «$User.htm» `
} | Set-Content «$AppSignatures\$User.files\filelist.xml»
а как можно переделать этот скрипт для подгрузки данных из Outlook 365? У нас там хранятся все данные по пользователям — DisplayName, Title, PhoneNumber, MobileNumber
Для Office 356 и Azure AD есть специальные PowerShell модули интеграции. Все очень похоже с Get-Aduser. В случае использования Office 365 нужно установить Azure Active Directory Module и получать информацию о пользователях командлетом:
Get-MsolUser –UserPrincipalName user@office365com | FL
Откуда вдруг взялась переменная $Ext
Эта фишка цикла powershell foreach. Указывает на текущий объект при переборе
Всем привет!
У меня из AD не подтягивается атрибут displayName и telephoneNumber, хотя title и Company подтягиваются нормально.
Подскажите, пожалуйста, в чём может быть проблема?
DC на ОС Windows Server 2012 R2
Тестируемый ПК с ОС Windows 10 (1803)
Отбой, вопрос решён
Добрый день.
Скрипт рабочий, но есть нюансы.
Например как сделать проверку, если оного из параметров нет?
Например телефона или мобильника?
Чтоб не было пустых строк.
P.S. Чтоб не ставить у пользователей в домене дополнительный модуль можно использовать код перед чтением из AD
$session = New-PSSession -ComputerName DomainController
Import-Module -PSsession $session -Name ActiveDirectory
Тут несколько вариантов — заставлять пользователей/отдел кадров заполнять всю информацию, убрать ненужные поля из скрипта. В принципе можно и проверять, что значение поля -ne $null , но тогда шаблон html шаблон нужно править.
Есть вариант заменять пустые значение на n/a, тогда типа такого нужно сделать:
if ($AD_user.OfficePhone) { $AD_user.OfficePhone = "n/a" }
Вернее вот так
if (!$AD_user.OfficePhone) { $AD_user.OfficePhone = «n/a» }
Добрый день, подскажите пожалуйста, выдается ошибка: «Отказано в доступе по пути «OutlookSignature».
Как можно ее решить?
Проверьте, что у вашего пользователя есть NTFS права на эту папку. проверьте, отработывает ли код при запуске вручную из PowerShell ISE с правами администратора
Я нашёл способ, чтобы не было двойных отступов в тексте подписи — вместо тэга использовать
Вместо тэга р использовать div