HowTo: Outlook Signatur mit PowerShell aus Active-Directory erstellen

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.

Inhalt signatur.htm:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
</head>
<body>

<div style="font-family: Calibri; font-size: 11pt; color: DimGray">	
		<strong>Mit freundlichen Grüßen</strong><br><br>
		<strong>@NAME</strong><br>
</div>

<div style="font-family: Calibri; font-size: 10pt; color: DimGray">
		@DESCRIPTION<br>
</div>

<div style="font-family: Calibri; font-size: 10pt; color: SteelBlue">
		<strong>@COMPANY</strong>
</div>

<div style="font-family: Calibri; font-size: 10pt; color: DimGray">	
	@STREETADDRESS, @POSTALCODE @CITY<br>
	<strong>Tel</strong> @OFFICEPHONE, <strong>Fax</strong> @FAX<br>
	<a style="color: SteelBlue" href="mailto:@EMAIL">@EMAIL</a><br>
	<a style="color: SteelBlue" href="https://@WEBSITE">@WEBSITE</a><br>
	</p>
	<br>
	<p></p>
</div>

</body>
</html>

Inhalt signatur.txt:

Mit freundlichen Grüßen

@NAME
@DESCRIPTION
@COMPANY
@STREETADDRESS, @POSTALCODE @CITY
Tel @OFFICEPHONE Fax @FAX
@EMAIL
@WEBSITE

Die Template-Dateien sollten nun im Deployment-Verzeichnis (Beispiel) hinterlegt werden, welche als Variable $PathSignaturTemplates angegeben wird.

Nun kann ein neues PowerShell-Skript (ps1) erstellt werden.

Festlegen der Variablen:

$UserName = $env:USERNAME
$FileName = "signatur"
$FileExtension = "htm", "txt"
$PathSignaturTemplates = "\\example.com\deploy\signaturtemplates"
$PathSignaturUser = "$env:APPDATA\Microsoft\Signatures"

Auslesen Möglichkeit 1 (Get-ADUser):

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 finden Sie unter docs.microsoft.com.

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"
}

Tipp: Werden eckige Klammern (square brackets) bei -replace verwendet, muss ein Backslash am Anfang gesetzt werden.

Empfehlenswert ist die Ausführung des PowerShell-Skripts bei Anmeldung des Benutzers.

Photo by Museums Victoria on Unsplash

Neueste Beiträge

Neueste Kommentare

2 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.

Schreibe einen Kommentar

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