Automatically generate an Outlook signature using GPO using multiple signatures

While I was looking for a flexible way to automatically create signatures for different types of users. Our domain has several companies, and each of them has different needs. The default scripts that you find when you start googeling simply show how to create a basic signature.

Below is the script, these are a few more steps. It fills in the username and initials when you first start Microsoft Office. If there is no perspective profile, he will configure Outlook using a PRF file (you can use cached for laptops / tablets and not cached for desktops / servers). Then he checks what signatures the user should receive and builds them using the information in the signature file, the template file and user information from the active directory. All status information is recorded in the application event log (WSH filter). When the signature file is updated, the signature will be reapplied.

I am posting the whole script here, hoping someone else will find it useful. Feel free to comment (or donate, of course :-)). It works in Outlook 2000, 2003, 2010 and 2013 (and should be quite promising).

+4
source share
1 answer

Create a new global security group in your domain. In my example, I will use Signature-Marketing and Signature-HR .

Create a new GPO that applies to these groups. Put the Outlook.vbs script in User \ Policy \ Windows \ Scripts \ Logon .

 '\\MyDomain.local\SysVol\WGIT.local\Policies\{MyPolicyID}\User\Scripts\Logon\Outlook.vbs On Error Resume Next ' ##### CHANGE THESE SETTINGS ##### setup_GroupPrefix = "Signature-" setup_Path_SignatureVBS = "\\MyDomain.local\NETLOGON\Outlook\Signatures" 'Signatures with the same name as this group (+.VBS) will be searched within this setup_Path_Template = "\\MyDomain.local\NETLOGON\Outlook\Templates" 'Signatures with the same name as this group (+.VBS) will be searched within this setup_PRF_CacheOn = "\\MyDomain.local\NETLOGON\Outlook\PRF\Outlook_Cached.PRF" setup_PRF_CacheOff = "\\MyDomain.local\NETLOGON\Outlook\PRF\Outlook_NotCached.PRF" ' ##### START OF SCRIPT ##### Set oShell = CreateObject("WScript.Shell") Set oAD = CreateObject("ADSystemInfo") Set oFile = CreateObject("Scripting.FileSystemObject") Set oOutlook = CreateObject("Outlook.Application") Set oUser = GetObject("LDAP://" & oAD.UserName) 'Quit if no outlook is present! If oOutlook = false Then oShell.LogEvent 1, "Signature script error. Outlook application object was not found." Wscript.Quit End If 'Quit if version is lower then 10 v = Split(oOutlook.Version, ".") outlook_Version = v(0) & "." & v(1) If cInt(v(0)) < 10 Then oShell.LogEvent 1, "Signature script error. Outlook version " & outlook_Version & " is not supported." Wscript.Quit ElseIf (cInt(v(0)) >= 10) And (cInt(v(0)) < 15) Then reg_DefaultProfile = "HKCU\Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\DefaultProfile" Else reg_DefaultProfile = "HKCU\Software\Microsoft\Office\" & outlook_Version & "\Outlook\DefaultProfile" End If 'Check if Office Userinfo already exists t1 = oShell.RegRead("HKCU\Software\Microsoft\Office\Common\UserInfo\UserName") If t1 = "" Then 'Add userinfo to registry. oShell.RegWrite "HKCU\Software\Microsoft\Office\Common\UserInfo\UserName", oUser.FullName oShell.RegWrite "HKCU\Software\Microsoft\Office\Common\UserInfo\UserInitials", oUser.sAMAccountName oShell.RegWrite "HKCU\Software\Microsoft\Office\Common\UserInfo\Company", oUser.company oShell.LogEvent 0, "Office userinformation was imported from AD." End If 'Check for a default mail profile t2 = oShell.RegRead(reg_DefaultProfile) oShell.LogEvent 0, "Default profile (" & reg_DefaultProfile & ") said " & t2 If t2 = "" Then 'No default profile was found! Import PRF file! 'Detect mobile devices. Enabled cached outlook if there is a battery present MobileDevice = false Set oBattery = GetObject("Winmgmts:").ExecQuery("Select * from Win32_Battery") For Each x in oBattery MobileDevice = true Next 'Import PRF location into registry If MobileDevice Then oShell.RegWrite "HKCU\Software\Microsoft\Office\" & outlook_Version & "\Outlook\Setup\ImportPRF", setup_PRF_CacheOn oShell.LogEvent 0, "Office Outlook has been set-up with cache." Else oShell.RegWrite "HKCU\Software\Microsoft\Office\" & outlook_Version & "\Outlook\Setup\ImportPRF", setup_PRF_CacheOff oShell.LogEvent 0, "Office Outlook has been set-up without cache." End If 'Delete First-Run key to simulate a first run for outlook. (ie if a profile was configured and deleted) oShell.RegDelete "HKCU\Software\Microsoft\Office\" & outlook_Version & "\Outlook\Setup\First-Run" 'Outlook does not need to be run. 'When a signature is being applied outlook will fire up it initial boot and import the PRF settings. 'With this PRF applied the signature will be applied immediately End If 'Compare users' group membership against available signature settings Set GroupsOfUser = GetMembership(oUser.distinguishedName, null) tGroups = Array() For Each GroupName in GroupsOfUser.Items() If Mid(GroupName, 1, Len(setup_GroupPrefix)) = setup_GroupPrefix Then ReDim Preserve tGroups(UBound(tGroups) + 1) tGroups(UBound(tGroups)) = GroupName end if Next tGroups = SortArray(tGroups) For Each group in tGroups sFile = setup_Path_SignatureVBS & "\" & group & ".VBS" If oFile.FileExists(sFile) = True Then 'File containing specific signature settings were found Set Signature = new Defaults 'Use defaults 'Evaluate signature settings executeGlobal oFile.openTextFile(sFile).readAll() 'Check if signature needs updating sUpdate = false If oFile.FileExists(Signature.sPath) Then Set f = oFile.GetFile(Signature.sPath) If Signature.sVersion > f.DateLastModified Then sUpdate = true End If Else sUpdate = true End If If sUpdate Then 'Apply signature 'Replace defaults with user specific data If Not oUser.FullName = "" Then Signature.uName = oUser.FullName If Not oUser.mail = "" Then Signature.uMail = LCase(oUser.mail) If Not oUser.telephoneNumber = "" Then Signature.uPhone = oUser.telephoneNumber If Not oUser.mobile = "" Then Signature.uCell = oUser.mobile If Not oUser.facsimileTelephoneNumber = "" Then Signature.uFax = oUser.facsimileTelephoneNumber If Not oUser.Title = "" Then Signature.uTitle = oUser.Title If Not oUser.department = "" Then Signature.uDepartment = oUser.department If Not oUser.info = "" Then Signature.uDisclaimer = oUser.info 'Build signature Set oWord = CreateObject("Word.Application") Set oDoc = oWord.Documents.Add() Set oSelection = oWord.Selection executeGlobal oFile.openTextFile(setup_Path_Template & "\" & Signature.sTemplate).readAll() 'Evaluate signatre template Set oSelection = oDoc.Range() 'Add signature to outlook oWord.EmailOptions.EmailSignature.EmailSignatureEntries.Add Signature.sName, oSelection WScript.Sleep 200 'Give outlook the time to create the necessary files 'Set as default signature If Signature.sCompanyNew = "*" OR StrComp(oUser.company, Signature.sCompanyNew, vbTextCompare) = 0 Then oWord.EmailOptions.EmailSignature.NewMessageSignature = Signature.sName If Signature.sCompanyReply = "*" OR StrComp(oUser.company, Signature.sCompanyReply, vbTextCompare) = 0 Then oWord.EmailOptions.EmailSignature.ReplyMessageSignature = Signature.sName 'Closure oDoc.Saved = True oWord.Quit WScript.Sleep 300 'Give work some time to clean up 'Logging oShell.LogEvent 0, "Signature " & Signature.sName & " applied with success!" Else oShell.LogEvent 0, "Signature " & Signature.sName & " is up to date." End If Else oShell.LogEvent 1, "Signature script error. Cannot load signature settings from " & sFile End If Next ' ##### CLASSES AND FUNCTIONS ###### Class Defaults 'Signature properties Public sName 'Name of this signature Public sVersion 'Apply signature if version date is newer then client signature date Public sTemplate 'Signature template to be used Public sCompanyNew 'If the user company field matches this value it will be set as the default 'new' signature Public sCompanyReply 'If the user company field matches this value it will be set as the default 'reply' signature 'Company properties Public cName Public cStreet Public cBox Public cPostal Public cCity Public cState Public cCountry Public cMail Public cVat Public cWebsite Public cUrl Public cLogo Public cLogoPath Public cPhone Public cFax 'User properties Public uName Public uMail Public uPhone Public uCell Public uFax Public uTitle Public uDepartment Public uDisclaimer Private Sub Class_Initialize() me.sName = "The name of my signature" me.sVersion = CDate("1/10/2012") me.sTemplate = "Default.vbs" me.cName = "MY COMPANY NAME" me.cStreet = "Street" me.cBox = "123" me.cPostal = "ZIP" me.cCity = "CITY" me.cMail = " info@company.com " me.cVat = "VAT NUMBER" me.cWebsite = "www.company.com" me.cUrl = "http://www.company.com" me.cPhone = "+32 3 456 780" me.cFax = "+32 3 456 789" me.uName = "John Doe" me.uPhone = "+32 3 456 780" me.uFax = "+32 3 456 780" End Sub Public Property Get sPath() sPath = oShell.ExpandEnvironmentStrings("%AppData%") + "\Microsoft\" & oShell.RegRead("HKCU\Software\Microsoft\Office\" & outlook_Version & "\Common\General\Signatures") & "\" & me.sName & ".htm" End Property End Class Function SortArray(arrShort) Dim i, j, temp For i = UBound(arrShort) - 1 To 0 Step -1 For j= 0 To i If arrShort(j)>arrShort(j+1) Then temp=arrShort(j+1) arrShort(j+1)=arrShort(j) arrShort(j)=temp End If Next Next SortArray = arrShort End Function Function GetMembership(sChild, dMembership) 'Get AD info on the given Child Set oChild = GetObject("LDAP://" & sChild) If TypeName(oChild) = "Object" Then 'Add the Child canonical name to the array IF it a group If TypeName(dMembership) = "Dictionary" Then dMembership.Add oChild.distinguishedName, oChild.CN Else Set dMembership = CreateObject("Scripting.Dictionary") End If 'If the Child has any parents (=groups), run the same loop for these parents. If TypeName(oChild.memberOf) = "Variant()" Then oParents = oChild.GetEx("memberOf") For Each sParent in oParents If Not dMembership.Exists(sParent) Then Set dMembership = GetMembership(sParent, dMembership) End If Next End If End If Set GetMembership = dMembership End Function 

Below is the signature "Guide." These scripts MUST have the same name as the group created in AD to work. When a user enters the AD Signature-Marketing group, he will run \\MyDomain.local\NETLOGON\Outlook\Signatures\Signature-Marketing.vbs

 '\\MyDomain.local\NETLOGON\Outlook\Signatures\MyGroupName.vbs 'Set specific default values Signature.sVersion = CDate("3/12/2012 15:35") Signature.sName = "The name of my signature" Signature.sCompanyNew = "MY COMPANY NAME" Signature.sCompanyReply = "MY COMPANY NAME" Signature.cName = "MY COMPANY NAME" Signature.cStreet = "Street" Signature.cBox = "123" Signature.cPostal = "ZIP" Signature.cCity = "City" Signature.cMail = " info@company.com " Signature.cVat = "VAT NUMBER" Signature.cWebsite = "www.company.com" Signature.cUrl = "http://www.company.com" Signature.cLogo = "\\MyDomain.local\NETLOGON\Outlook\IMG\MyCompanyLogo.png" Signature.cPhone = "+32 3 456 780" Signature.cFax = "+32 3 456 789" Signature.uName = "John Doe" Signature.uPhone = "+32 3 456 780" Signature.uFax = "+32 3 456 789" 

Below is the default template. This script is evaluated in Outlook.vbs.

 '\\MyDomain.local\NETLOGON\Outlook\Templates\Default.vbs oSelection.Font.Name = "Calibri" oSelection.Font.Size = 11 oSelection.TypeText Signature.uName If Not Signature.uTitle = "" Then oSelection.TypeText Chr(11) oSelection.TypeText Signature.uTitle End If If Not Signature.uDisclaimer = "" Then oSelection.TypeText " (*)" ' ### Add company table & info oSelection.TypeParagraph() Set tbl = oDoc.Tables.Add(oSelection.Range, 1, 2) Set oTable = oDoc.Tables(1) tWidth = oTable.Cell(1, 1).width + oTable.Cell(1, 2).width ' Add company logo to cell 1 Set oCell = oTable.Cell(1, 1) Set oCellRange = oCell.Range oCell.Select Set oLogo = oSelection.InlineShapes.AddPicture(Signature.cLogo) oLogo.LockAspectRatio = true oLogo.height = oWord.PixelsToPoints(50) oCell.width = oLogo.width ' Add company info to cell 2 If Signature.cVat = "" Then arrAddressInfo = Array(Signature.cName, Signature.cStreet & " " & Signature.cBox, Signature.cPostal & " " & Signature.cCity) Else arrAddressInfo = Array(Signature.cName, Signature.cStreet & " " & Signature.cBox, Signature.cPostal & " " & Signature.cCity, Signature.cVat) End If strAddressInfo = Join(arrAddressInfo, " | ") Set oCell = oTable.Cell(1, 2) Set oCellRange = oCell.Range oCell.Select oCell.width = tWidth - oLogo.width oSelection.Font.Size = 10 oSelection.TypeText strAddressInfo ' Add phone number information arrUserInfo = Array() If Not Signature.uPhone = "" Then ReDim Preserve arrUserInfo(UBound(arrUserInfo) + 1) arrUserInfo(UBound(arrUserInfo)) = "T " & Signature.uPhone End If If Not Signature.uCell = "" Then ReDim Preserve arrUserInfo(UBound(arrUserInfo) + 1) arrUserInfo(UBound(arrUserInfo)) = "G " & Signature.uCell End If If Not Signature.uFax = "" Then ReDim Preserve arrUserInfo(UBound(arrUserInfo) + 1) arrUserInfo(UBound(arrUserInfo)) = "F " & Signature.uFax End If strUserInfo = Join(arrUserInfo, " | ") If Not strUserInfo = "" Then oSelection.TypeText Chr(11) oSelection.TypeText strUserInfo End If oSelection.TypeText Chr(11) ' Add user mail address to cell 2 Set oLink = oSelection.Hyperlinks.Add(oSelection.Range, "mailto:" & Signature.uMail, , , Signature.uMail) oLink.Range.Font.Color = oSelection.Font.Color oLink.Range.Font.Size = 10 ' Add company weblink to cell 2 oSelection.TypeText " | " Set oLink = oSelection.Hyperlinks.Add(oSelection.Range, Signature.cUrl, , , Signature.cWebsite) oLink.Range.Font.Color = oSelection.Font.Color oLink.Range.Font.Size = 10 If Not Signature.uDisclaimer = "" Then oSelection.TypeText " | (*) " & Signature.uDisclaimer tbl.Rows(1).Cells.VerticalAlignment = 1 oTable.AutoFitBehavior(1) 

\\MyDomain.local\NETLOGON\Outlook\PRF\Outlook_Cached.PRF \\MyDomain.local\NETLOGON\Outlook\PRF\Outlook_NotCached.PRF

Create your own PRF file (quote from Microsoft TechNet):

To create a .prf file using the Office Customization Tool

  • At the root of the network installation point, run the following command line to start the Office setup tool: \ server \ share \ setup.exe / admin
  • To edit an existing setup file (.msp), in the Select Product dialog box, click Open an existing setup setup file. Or, to create a new configuration file, select the Office package that you want to configure, and click OK.
  • In the Outlook pane, click Outlook Profile. Choose how you want to configure profiles for users. To specify the options that should be included in the .prf file, select either Edit Profile or New Profile.
  • To add and configure new accounts or change or delete existing accounts, click "Add Accounts" and then click "Configure Additional Outlook Profile and Account Information."
  • After completing your Outlook profile configurations in the Outlook area, click Export Settings.
  • Click the "Export Profiles" button to create a new .prf file. Enter the file name and path to save the file, and then click "Save."
+4
source

All Articles