In diesem HowTo geht es um die Erstellung einer Microsoft Outlook Signatur mittels PowerShell aus dem Active-Directory (AD). Zuerst müssen die erforderlichen Template-Dateien (htm, txt) erstellt werden.
Das Layout der beispielhaften Template-Dateien sollte sich am Corporate Design orientieren, und deshalb angepasst werden. Das HowTo ist sehr einfach gehalten, und man kann es deshalb selbst weiterentwickeln bzw. ausbauen.
Die Template-Dateien sollten nun im Deployment-Verzeichnis (Beispiel) hinterlegt werden, welche als Variable $PathSignaturTemplates angegeben wird.
Seit Oktober 2022 muss bei der Aktivierung von gesyncten M365-Signaturen im Signaturdateinamen der Name der Outlook .ost Datei unter „%LocalAppData%\Microsoft\Outlook“ vorhanden sein, damit die Standardsignatur für neue Nachrichten oder Antworten/Weiterleitungen gesetzt werden kann. Beispiel für Signaturdateinamen:
- „Signatur (beispiel@dertechblog.de).htm“
- „Signatur (beispiel@dertechblog.de).txt“
Nun kann ein neues PowerShell-Skript (.ps1) erstellt werden. Auslesen des .ost Dateinamen und festlegen der Variablen:
$UserName = $env:USERNAME
$OstName = (Get-ChildItem -Path "$env:LOCALAPPDATA\Microsoft\Outlook\*.ost").Basename
$FileName = "Signatur ($OstName)"
$FileExtension = "htm", "txt"
$PathSignaturTemplates = "\\example.com\deploy\signaturtemplates"
$PathSignaturUser = "$env:APPDATA\Microsoft\Signatures"
Auslesen Möglichkeit 1 (Get-ADUser):
Wird diese Möglichkeit in Betracht gezogen, sollten die PowerShell-AD-Cmdlets vorab an einem Windows Client administrativ installiert bzw. verteilt werden:
Get-WindowsCapability -Online | Where-Object { $_.Name -match "Rsat.ActiveDirectory" -and $_.State -eq "NotPresent" } | Add-WindowsCapability -Online
Auslesen der Active Directory attribute mit vorhandenen PowerShell-AD-Cmdlets mit Get-ADUser und Übergabe in eine Variable:
$Table = Get-ADUser $UserName -Properties City, Company, Description, Fax, HomePage, Mail, OfficePhone, PostalCode, StreetAddress
Auslesen Möglichkeit 2 (DirectorySearcher):
Auslesen der IADsUser property ohne vorhandenen PowerShell-AD-Cmdlets mit DirectorySearcher und Übergabe in eine Variable:
$Table = (New-Object System.DirectoryServices.DirectorySearcher "sAMAccountName=$UserName").FindOne().Properties
Hinweis: Wird DirectorySearcher verwendet, müssen die Active Directory attribute entsprechend an die IADsUser property angepasst werden. Eine Vergleichstabelle ist bei Mapping Between IADsUser Properties and Active Directory Attributes – Win32 apps | Microsoft Docs zu finden.
Template-Dateien in Benutzer-Verzeichnis für Signatur-Dateien kopieren:
foreach ($Ext in $FileExtension) {
Copy-Item -Force "$PathSignaturTemplates\$FileName.$Ext" "$PathSignaturUser\$FileName.$Ext"
}
Ersetzen Möglichkeit 1 (Get-ADUser):
Mit dem -replace Parameter werden die zuvor ausgelesenen Active Directory attribute in den Signatur-Dateien eingefügt bzw. ersetzt:
foreach ($Ext in $FileExtension) {
(Get-Content -Path "$PathSignaturUser\$FileName.$Ext") |
ForEach-Object { $_ -replace "@CITY", $Table.City } |
ForEach-Object { $_ -replace "@COMPANY", $Table.Company } |
ForEach-Object { $_ -replace "@DESCRIPTION", $Table.Description } |
ForEach-Object { $_ -replace "@EMAIL", $Table.Mail } |
ForEach-Object { $_ -replace "@FAX", $Table.Fax } |
ForEach-Object { $_ -replace "@NAME", $Table.Name } |
ForEach-Object { $_ -replace "@OFFICEPHONE", $Table.OfficePhone } |
ForEach-Object { $_ -replace "@POSTALCODE", $Table.PostalCode } |
ForEach-Object { $_ -replace "@STREETADDRESS", $Table.StreetAddress } |
ForEach-Object { $_ -replace "@WEBSITE", $Table.Homepage } |
Set-Content -Force -Path "$PathSignaturUser\$FileName.$Ext"
}
Ersetzen Möglichkeit 2 (DirectorySearcher):
Mit dem -replace Parameter werden die zuvor ausgelesenen IADsUser property in den Signatur-Dateien eingefügt bzw. ersetzt:
foreach ($Ext in $FileExtension) {
(Get-Content -Path "$PathSignaturUser\$FileName.$Ext") |
ForEach-Object { $_ -replace "@CITY", $Table.l } |
ForEach-Object { $_ -replace "@COMPANY", $Table.company } |
ForEach-Object { $_ -replace "@DESCRIPTION", $Table.description } |
ForEach-Object { $_ -replace "@EMAIL", $Table.mail } |
ForEach-Object { $_ -replace "@FAX", $Table.facsimiletelephonenumber } |
ForEach-Object { $_ -replace "@NAME", $Table.name } |
ForEach-Object { $_ -replace "@OFFICEPHONE", $Table.telephonenumber } |
ForEach-Object { $_ -replace "@POSTALCODE", $Table.postalcode } |
ForEach-Object { $_ -replace "@STREETADDRESS", $Table.streetaddress } |
ForEach-Object { $_ -replace "@WEBSITE", $Table.wWWHomePage } |
Set-Content -Force -Path "$PathSignaturUser\$FileName.$Ext"
}
Werden eckige Klammern (square brackets) bei -replace verwendet, muss ein Backslash am Anfang gesetzt werden.
Beide Möglichleiten Get-ADUser und DirectorySearcher können im Userkontext ohne administrative AD-Berechtigungen verwendet werden.
Empfehlenswert ist die Ausführung des PowerShell-Skripts bei Anmeldung des Benutzers.
Standard Signatur
Mit folgenden PowerShell Commands kann die erstellte Signatur auch als Standard im User Kontext festgelegt werden:
$Path = "HKCU:\Software\Microsoft\Office\16.0\Common\MailSettings"
Remove-Item -Path $Path -Force -ErrorAction SilentlyContinue
New-Item -Path $Path -ErrorAction SilentlyContinue
New-ItemProperty -Path $Path -Force -Name "NewSignature" -PropertyType ExpandString -Value $FileName
New-ItemProperty -Path $Path -Force -Name "ReplySignature" -PropertyType ExpandString -Value $FileName
Photo by Museums Victoria on Unsplash