Hallo Zusammen,
wir hatten bisher immer das Tool "OutlookSignatur.exe" (https://www.outlook-stuff.com/tipps-tricks/p…17-einheitliche) benutzt, da das aber schon Jahre einige Jahre nicht weiterentwickelt wurde habe ich mich eine Umsetzung in Autoit gemacht.
Da unsere Clients im Azure AD liegen und die User im lokalen AD habe ich LDAP benutzt, um die Userparameter auszulesen.
Hier das Script:
; ===============================================
; Outlook HTML-Signatur mit direkter LDAP-Verbindung
; ===============================================
#include <Array.au3>
#include <MsgBoxConstants.au3>
; ===============================
; Konfiguration
; ===============================
Local $sLDAPServer = "LDAP://ip Adresse oder DNS Name" ; Dein DC oder LDAP-Server
Local $sBaseDN = "OU=User,OU=Benutzer,DC=xxx,DC=de" ; Basis-DN der Domain
Local $sUserName = @UserName ; sAMAccountName des Users
; ===============================
; Verbindung zum AD
; ===============================
Local $sLDAPPath = $sLDAPServer & "/" & $sBaseDN
Local $oConnection = ObjGet($sLDAPPath)
If Not IsObj($oConnection) Then
MsgBox(16, "Fehler", "LDAP Verbindung konnte nicht hergestellt werden!" & @CRLF & $sLDAPPath, 2)
Exit
EndIf
; ===============================
; ADSI User suchen
; ===============================
; ===============================
Local $oCommand = ObjCreate("ADODB.Command")
Local $oConn = ObjCreate("ADODB.Connection")
$oConn.Provider = "ADsDSOObject"
$oConn.Open("Active Directory Provider")
$oCommand.ActiveConnection = $oConn
; === LDAP-Filter: Benutzerobjekt suchen ===
$oCommand.CommandText = "<" & $sLDAPPath & ">;" & _
"(&(objectCategory=person)(objectClass=user)(sAMAccountName=" & $sUserName & "));" & _
"givenName, sn,mail,telephoneNumber,title,department,company, userPrincipalName;subtree"
; === Abfrage ausführen ===
Local $oRS = $oCommand.Execute
If $oRS.EOF Then
MsgBox(48, "LDAP", "Benutzer " & $sUserName & " nicht gefunden!",2)
Exit
EndIf
; === Werte auslesen ===
Local $sgivenName = _LDAP_GetField($oRS, "givenName")
Local $sSureName = _LDAP_GetField($oRS, "sn")
Local $sMail = _LDAP_GetField($oRS, "mail")
Local $sPhone = _LDAP_GetField($oRS, "telephoneNumber")
Local $sTitle = _LDAP_GetField($oRS, "title")
Local $sDept = _LDAP_GetField($oRS, "department")
Local $sCompany = _LDAP_GetField($oRS, "company")
Local $sUserPName = _LDAP_GetField($oRS, "userPrincipalName")
; === Verbindung schließen ===
$oRS.Close()
$oConn.Close()
; === Signaturname und Logo ===
;Local $sSigName = $sCompany
Local $sSigName = $sCompany & " ("& $sUserPName & ")"
;Local $sLogoSource = "C:\Firma\logo.png"
;Local $sBannerSource = "C:\Firma\banner.png"
Local $sSigPath = @AppDataDir & "\Microsoft\Signatures\"
;ConsoleWrite(@AppDataDir & "\Microsoft\Signatures")
; === HTML-Signatur generieren ===
; --- HTML-Datei einlesen ---
Local $sFile_html = @ScriptDir & "\Signatur-Files\Signatur.html"
Local $sHTML = FileRead($sFile_html)
If @error Then
MsgBox(16, "Fehler", "Konnte HTML Datei nicht lesen!")
Exit
EndIf
; --- Platzhalter ersetzen ---
$sHTML = StringReplace($sHTML, "{{sgivenName}}", $sgivenName)
$sHTML = StringReplace($sHTML, "{{sSureName}}", $sSureName)
$sHTML = StringReplace($sHTML, "{{sTitle}}", $sTitle)
$sHTML = StringReplace($sHTML, "{{sMail}}", $sMail)
$sHTML = StringReplace($sHTML, "{{sPhone}}", $sPhone)
;ConsoleWrite($sHTML)
; === Dateien schreiben für txt und rtf ===
; --- TXT-Datei einlesen ---
Local $sFile_txt = @ScriptDir & "\Signatur-Files\Signatur.txt"
Local $sTXT = FileRead($sFile_txt)
If @error Then
MsgBox(16, "Fehler", "Konnte TXT Datei nicht lesen!")
Exit
EndIf
; --- Platzhalter ersetzen ---
$sTXT = StringReplace($sTXT, "{{sgivenName}}", $sgivenName)
$sTXT = StringReplace($sTXT, "{{sSureName}}", $sSureName)
$sTXT = StringReplace($sTXT, "{{sTitle}}", $sTitle)
$sTXT = StringReplace($sTXT, "{{sMail}}", $sMail)
$sTXT = StringReplace($sTXT, "{{sPhone}}", $sPhone)
;delete old signatures
If FileExists ($sSigPath & $sCompany & ".htm") Then FileDelete ($sSigPath & $sCompany & ".htm")
If FileExists ($sSigPath & $sCompany & ".rtf") Then FileDelete ($sSigPath & $sCompany & ".rtf")
If FileExists ($sSigPath & $sCompany & ".txt") Then FileDelete ($sSigPath & $sCompany & ".txt")
;create new signatures
If FileExists ($sSigPath & $sSigName & ".htm") Then FileDelete ($sSigPath & $sSigName & ".htm")
If FileExists ($sSigPath & $sSigName & ".rtf") Then FileDelete ($sSigPath & $sSigName & ".rtf")
If FileExists ($sSigPath & $sSigName & ".txt") Then FileDelete ($sSigPath & $sSigName & ".txt")
Sleep(1000)
FileWrite($sSigPath & $sSigName & ".htm", $sHTML)
FileWrite($sSigPath & $sSigName & ".txt", $sTXT)
FileWrite($sSigPath & $sSigName & ".rtf", $sTXT)
; === Outlook-Signatur als Standard setzen ===
;_SetDefaultOutlookSignature($sSigName)
MsgBox($MB_ICONINFORMATION, "Signatur erstellt", "Signatur für '" & $sgivenName & " " & $sSureName & "' wurde erfolgreich erstellt!",1)
; ====================================================
; Hilfsfunktionen
; ====================================================
Func _LDAP_GetField($oRS, $sField)
Local $vValue = ""
If Not IsObj($oRS.Fields($sField)) Then Return ""
If Not IsObj($oRS.Fields($sField).Value) Then
$vValue = $oRS.Fields($sField).Value
EndIf
Return $vValue
EndFunc
Func _SetDefaultOutlookSignature($sName)
Local $sRegPath = "HKCU\Software\Microsoft\Office\" & _GetOutlookVersion() & "\Common\MailSettings"
RegWrite($sRegPath, "NewSignature", "REG_SZ", $sName)
RegWrite($sRegPath, "ReplySignature", "REG_SZ", $sName)
EndFunc
Func _GetOutlookVersion()
Local $aVersions[4] = ["19.0", "16.0", "15.0", "14.0"]
For $v In $aVersions
If RegRead("HKCU\Software\Microsoft\Office\" & $v & "\Outlook", "Bitness") <> "" Then Return $v
Next
Return "16.0"
EndFunc
Alles anzeigen
Bei Outlook gibt es nun 2 Signatur Bereiche. Einmal die Signatur auf dem lokalen Gerät und die zweite für das EmailKonto. Welche dann auch Online Syncronisiert wird.
Die Signatur für das Emailkonto muss dann im Format Signaturname + (userPrincipalName) sein. So im Quelltext: $sSigName = $sCompany & " ("& $sUserPName & ")"
Das Tool liest eine HTML und ein Textfile ein und ersetzt dann die entsprechenden Platzhalter mit den per LDAP ausgelesen Werten und spiecher es als Signatur im Fortmat HTML, TXT und RTF ab.
Nun möchte ich noch eine Updater bauen, der beim starten prüft (Freigegebener Ordner auf dem Filseserver ) ob es eine neue HTML und TXT Datei gibt, wenn die Signatur mal angepasst wurde.
Beispiel TXT File mit den Platzhaltern.
Hat da jemand eine Idee?
Gruß Marcel