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
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.
Hallo Andreas B, vielen Dank für dein Interesse und dein Kommentar. Wie bereits im Beitrag beschrieben: Wird DirectorySearcher verwendet, müssen die Active Directory attribute entsprechend an die IADsUser property angepasst werden. Eine Vergleichstabelle findest du unter https://docs.microsoft.com/en-us/windows/win32/adsi/mapping-between-iadsuser-properties-and-active-directory-attributes. Ich habe den Beitrag entsprechend ausführlicher beschrieben.
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?
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.
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 🙁
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.
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
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.
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.
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.
Hallo and Danke für die Anleitung,
wie kann man die Signatur als Default Signatur festlegen?
VG
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
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.