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