5

しばらく前に、さまざまなタイプのユーザーの署名を自動的に生成する柔軟な方法を探していました。私たちのドメインには複数の会社があり、それぞれに異なるニーズがあります。グーグル検索で見つけたデフォルトのスクリプトは、基本的な署名の作成方法を示しているだけです。

以下のスクリプトは、さらにいくつかの手順を踏んでいます。Microsoft Office を最初に起動するときに、ユーザー名とイニシャルを入力します。Outlook プロファイルが存在しない場合は、PRF ファイルを使用して Outlook をセットアップします (ラップトップ/タブレットにはキャッシュを使用し、デスクトップ/サーバーには非キャッシュを使用できます)。次に、ユーザーが取得する必要がある署名を確認し、署名ファイル、テンプレート ファイル、および Active Directory のユーザー情報内の情報を使用して署名を作成します。すべてのステータス情報は、アプリケーション イベント ログ (フィルタ WSH) に書き込まれます。署名ファイルが更新されると、署名が再適用されます。

他の誰かが役に立つことを期待して、スクリプト全体をここに投稿しています。お気軽にコメントしてください(またはもちろん寄付してください:-))。これは、Outlook 2000、2003、2010、および 2013 で機能します (そして、将来的にはかなり証明されるはずです)。

4

2 に答える 2

5

ドメインに新しいグローバル セキュリティ グループを作成します。私の例では、 と を使用Signature-MarketingSignature-HRます。

これらのグループに適用される新しい GPO を作成します。Outlook.vbsにスクリプトを配置します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's 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. (i.e. 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's 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's 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's canonical name to the array IF it's 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

署名「ガイド」の下。これらのスクリプトが機能するには、AD で作成されたグループと同じ名前でなければなりません。ユーザーが AD グループ Signature-Marketing のメンバーである場合、実行されます。\\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"

デフォルトのテンプレートの下。このスクリプトは 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

独自の PRF ファイルを作成します (Microsoft TechNet からの引用):

Office カスタマイズ ツールを使用して PRF ファイルを作成するには

  1. ネットワーク インストール ポイントのルートから、次のコマンド ラインを実行して、Office カスタマイズ ツールを起動します: \server\share\setup.exe /admin
  2. 既存のカスタマイズ ファイル (.msp) を編集するには、[製品の選択] ダイアログ ボックスで、[既存のセットアップ カスタマイズ ファイルを開く] をクリックします。または、新しいカスタマイズ ファイルを作成するには、カスタマイズする Office スイートを選択し、[OK] をクリックします。
  3. Outlook 領域で、[Outlook プロファイル] をクリックします。ユーザーのプロファイルをカスタマイズする方法を選択します。.prf ファイルに含める設定を指定するには、[プロファイルの変更] または [新しいプロファイル] を選択します。
  4. 新しいアカウントを追加して構成するか、既存のアカウントを変更または削除するには、[アカウントの追加] をクリックし、[追加の Outlook プロファイルとアカウント情報のカスタマイズ] をクリックします。
  5. Outlook プロファイルの構成が完了したら、[Outlook] 領域で [設定のエクスポート] をクリックします。
  6. [プロファイル設定のエクスポート] ボタンをクリックして、新しい .prf ファイルを作成します。ファイル名とファイルを保存するパスを入力し、[保存] をクリックします。
于 2013-04-03T15:01:53.063 に答える