Outlook Signatur PowerShell Active-Directory

In diesem 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 .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 -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 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

Als werbefreie Website freuen wir uns über jede Unterstützung durch euch. Spende deinen individuellen Beitrag an uns.