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.

Neueste Beiträge

Neueste Kommentare

13 Kommentare

  1. Andreas B
    11. März 2020 09:57

    Hallo,

    vielen Dank für diese Anleitung, wenn ich allerdings nur
    $Table = (New-Object System.DirectoryServices.DirectorySearcher „sAMAccountName=$UserName“).FindOne().Properties
    nutze, werden in meiner Signatur nur der Name, Abteilung, Position, Mobilnummer.
    Die Felder @telephoneNumber, @Fax, @GivenName, @StreetAddress, @PostalCode @City, @wWWHomePage werden leider nicht gefüllt. Wenn ich aber nur $Table = Get-ADUser $UserName -Properties givenName, sn, title, department, City, mobile, Description, Fax, wWWHomePage, Mail, telephoneNumber, PostalCode, StreetAddress eingebe funktioniert es.

    Ich hoffe Sie können mir helfen.

  2. David R.
    10. August 2022 07:55

    Hallo,
    müssen alle User zur Ausführung des Scripts bei sich lokal auf dem PC das „ActiveDirectory“-Module installiert/aktiviert haben?
    Oder wo und mich welchem Rechtekontext wird der „Get-ADUser“-Befehl dann ausgeführt?

  3. 10. August 2022 10:53

    Hallo David, du kannst mit administrativ installierten Rsat.ActiveDirectory Tools das Skript ausführen, oder als zweite Möglichkeit ohne die AD-Module mit DirectorySearcher. Get-ADUser und DirectorySearcher kann im Userkontext ohne administrative AD-Berechtigungen verwendet werden. Ich habe den Beitrag entsprechend aktualisiert.

  4. Ulf K
    04. Januar 2023 15:09

    Hallo,
    leider funktioniert es seit einigen Office 365 Updates nicht mehr, da der Dateinamen im Signatur Verzeichnis die E-Mail Adresse in bestimmter Schreibweise erwartet.
    Signatur (Vorname.Nachname@Firma.com)
    Manchmal muss der Namens-Anfangsbuchstabe groß und manchmal klein geschrieben sein. Wo man das auslesen kann, ist mir ein Rätsel. habe die Registry auf mehreren Rechnern verglichen und Niemelas eine Übereinstimmung entdeckt.
    Über eine Hilfe oder Tipp würde ich mich wirklich freuen, da ich schon seit Stunden im Dunkeln tappe 🙁

  5. 04. Januar 2023 15:28

    Hallo Ulf K, vielen Dank für dein Kommentar. Mein Beitrag geht nicht explizit auf den Dateinamen ein, dieser kann individuell vergeben werden. Unter Outlook-Desktop mit Aktivierung von gesyncten M365-Signaturen (seit Oktober 2022), kann die Signatur vom User unter „Signaturen von diesem Gerät“ ausgewählt werden.

  6. Ulf K
    09. Januar 2023 08:03

    Hallo,
    danke für deine Antwort.
    Ja kann ich auswählen, allerdings nicht als Standardsignatur für neue oder Antworten festlegen, also völlig nutzlos.
    Habe es inzwischen aufgegeben und die Mitarbeiter müssen sich ihre Signatur selber einrichten.
    Gruß Ulf

  7. 09. Januar 2023 10:49

    Hallo Ulf K, vielen Dank für dein weiteres Kommentar. Im Signaturdateinamen muss der Name der Datei „%LocalAppData%\Microsoft\Outlook\beispiel@dertechblog.de.ost“ stehen, dann kann die Signatur als Standardsignatur für neue Nachrichten oder Antworten/Weiterleitungen gesetzt werden.
    Beispiele:
    „Signatur (beispiel@dertechblog.de).htm“
    „Signatur (beispiel@dertechblog.de).txt“
    Mit (Get-ChildItem *.ost).Basename kann der Name im Skript verwendet werden.
    Ich habe den Artikel entsprechend angepasst.

  8. Ulf K
    09. Januar 2023 18:12

    Hallo Johannes,
    es wäre so schön gewesen aber leider funktioniert das auch nicht, da Microsoft in diesen Fall zwischen Groß und Kleinschreibung unterscheidet.
    In der Ost Datei ist mein Name großgeschrieben und meine Signatur ist kleingeschrieben.
    Es muss doch irgendwie möglich sein, herauszufinden welche E-Mail Adresse er in dem Signatur Dateinamen erwartet, mit welcher Domain und ob groß oder kleingeschrieben.

  9. 09. Januar 2023 19:05

    Hallo Ulf K, E-Mail-Adresse für die Signatur ist der Outlook Kontoname. Im Normalfall ist dies der Basename der .ost Datei. Hierzu gibt es seitens Microsoft noch keine Dokumentation.

  10. Firas
    11. September 2023 11:08

    Hallo and Danke für die Anleitung,

    wie kann man die Signatur als Default Signatur festlegen?

    VG

  11. 11. September 2023 13:46

    Hallo Firas, mit folgenden PowerShell Commands kannst du auch Signaturen als Standard im User Kontext konfigurieren. Ich habe den Beitrag entsprechend aktualisiert.

    $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

  12. Andreas G
    29. September 2023 08:37

    Hallo Herr Sebald, vielen Dank für die Anleitung,

    Sie funktioniert bei mir soweit ganz gut, zwei „Probleme“ habe ich aktuell nur.
    Ich verwende DirectorySearcher um die Daten aus dem AD auszulesen, leider werden dabei die Umlaute nicht korrekt übernommen, entweder fehlen sie oder sehen komisch aus. Die .htm Datei habe ich auf UTF-8 umgestellt, der Standard Text wird auch mit Umlauten aus der Datei korrekt übernommen.

    Im Skript legen Sie die Signatur in Outlook auch als Standard Signatur fest, das funktioniert auch soweit, nur leider kann ich nach setzen der Variablen in der Registry die Signatur nicht mehr händisch wechseln, meist wird das nie gebraucht, aber manche User habe neben der Hauptsignatur auch eine zweite Signatur die sie ab und an verwenden. Ich möchte also die im Skript erzeuge Signatur als Standard/primär setzen, aber die User sollen auch ihre eigene Signatur unter Einstellungen ändern bzw. anlegen können. Vielen Dank.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert