none
Почему скрипт powershell меняет вид разметки страницы Word'а? RRS feed

  • Вопрос

  • Камрады, помогите разобраться в скрипте.

    Нашел в сети скрипт для создания подписи в Outlook и установки его по умолчанию.

    Подкорректировал чуток под себя.

    #Custom variables
    $CompanyName = 'BT'
    $SigSource = "\\domain.com\SysVol\domain.com\Policies\{0CD7D3A9-1B70-4503-8746-89BC60B5F3F4}\User\Scripts\Logon\$CompanyName"
    $ForceSignatureNew = '1' #When the signature are forced the signature are enforced as default signature for new messages the next time the script runs. 0 = no force, 1 = force
    $ForceSignatureReplyForward = '1' #When the signature are forced the signature are enforced as default signature for reply/forward messages the next time the script runs. 0 = no force, 1 = force
    
    #Environment variables
    
    $AppData=(Get-Item env:appdata).value
    $SigPath ='\Microsoft\Signatures'
    $LocalSignaturePath = $AppData+$SigPath
    $LocalSignatureFile = $LocalSignaturePath+'\'+$CompanyName+'.files'
    $RemoteSignaturePathFull = $SigSource+'\'+$CompanyName+'.docx'
    
    #Get Active Directory information for current user
    
    $UserName = $env:username
    $Filter = "(&(objectCategory=User)(samAccountName=$UserName))"
    $Searcher = New-Object System.DirectoryServices.DirectorySearcher
    $Searcher.Filter = $Filter
    $ADUserPath = $Searcher.FindOne()
    $ADUser = $ADUserPath.GetDirectoryEntry()
    $ADDisplayName = $ADUser.DisplayName
    $ADTelePhoneNumber = $ADUser.TelephoneNumber
    
    #Setting registry information for the current user
    
    $CompanyRegPath = "HKCU:\Software\" + $CompanyName
    if (Test-Path $CompanyRegPath)
    {}
    else
    {New-Item -path "HKCU:\Software" -name $CompanyName}
    
    if (Test-Path $CompanyRegPath'\Outlook Signature Settings')
    {}
    else
    {New-Item -path $CompanyRegPath -name "Outlook Signature Settings"}
    
    $SigVersion = (gci $RemoteSignaturePathFull).LastWriteTime #When was the last time the signature was written
    $ForcedSignatureNew = (Get-ItemProperty $CompanyRegPath'\Outlook Signature Settings').ForcedSignatureNew
    $ForcedSignatureReplyForward = (Get-ItemProperty $CompanyRegPath'\Outlook Signature Settings').ForcedSignatureReplyForward
    $SignatureVersion = (Get-ItemProperty $CompanyRegPath'\Outlook Signature Settings').SignatureVersion
    Set-ItemProperty $CompanyRegPath'\Outlook Signature Settings' -name SignatureSourceFiles -Value $SigSource
    #присваиваем переменные взяв значения из реестра
    $TelephoneNumberREG = (Get-ItemProperty $CompanyRegPath'\Outlook Signature Settings').TelephoneNumber
    $DisplayNameREG = (Get-ItemProperty $CompanyRegPath'\Outlook Signature Settings').DisplayName
      
    $SignatureSourceFiles = (Get-ItemProperty $CompanyRegPath'\Outlook Signature Settings').SignatureSourceFiles
    
    #Forcing signature for new messages if enabled
    if ($ForcedSignatureNew -eq '1')
    {
    #Set company signature as default for New messages
    $MSWord = New-Object -com word.application
    $EmailOptions = $MSWord.EmailOptions
    $EmailSignature = $EmailOptions.EmailSignature
    $EmailSignatureEntries = $EmailSignature.EmailSignatureEntries
    $EmailSignature.NewMessageSignature=$CompanyName
    $MSWord.Quit()
    }
    
    #Forcing signature for reply/forward messages if enabled
    if ($ForcedSignatureReplyForward -eq '1')
    {
    #Set company signature as default for Reply/Forward messages
    $MSWord = New-Object -com word.application
    $EmailOptions = $MSWord.EmailOptions
    $EmailSignature = $EmailOptions.EmailSignature
    $EmailSignatureEntries = $EmailSignature.EmailSignatureEntries
    $EmailSignature.ReplyMessageSignature=$CompanyName
    $MSWord.Quit()
    }
    
    #Copying signature sourcefiles and creating signature if signature-version are different from local version
    $FileExists =  Test-Path "$LocalSignatureFile"
    if ($SignatureVersion -eq $SigVersion -And $TelephoneNumberREG -eq $ADTelePhoneNumber -And $DisplayNameREG -eq $ADDisplayName -and $FileExists -eq $true) {}
    else
    {
    #Copy signature templates from domain to local Signature-folder
    Copy-Item "$SignatureSourceFiles\*" $LocalSignaturePath -Recurse -Force
    
    $ReplaceAll = 2
    $FindContinue = 1
    $MatchCase = $False
    $MatchWholeWord = $True
    $MatchWildcards = $False
    $MatchSoundsLike = $False
    $MatchAllWordForms = $False
    $Forward = $True
    $Wrap = $FindContinue
    $Format = $False
    
    #Insert variables from Active Directory to rtf signature-file
    $MSWord = New-Object -com word.application
    $fullPath = $LocalSignaturePath+'\'+$CompanyName+'.docx'
    $MSWord.Documents.Open($fullPath)
    
    $FindText = "TelephoneNumber"
    $ReplaceText = $ADTelephoneNumber.ToString()
    $MSWord.Selection.Find.Execute($FindText, $MatchCase, $MatchWholeWord,    $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap,    $Format, $ReplaceText, $ReplaceAll    )
    
    $FindText = "DisplayName"
    $ReplaceText = $ADDisplayName.ToString()
    $MSWord.Selection.Find.Execute($FindText, $MatchCase, $MatchWholeWord,    $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap,    $Format, $ReplaceText, $ReplaceAll    )
    
    $MSWord.ActiveDocument.Save()
    $saveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat], "wdFormatHTML");
    [ref]$BrowserLevel = "microsoft.office.interop.word.WdBrowserLevel" -as [type]
    
    $MSWord.ActiveDocument.WebOptions.OrganizeInFolder = $true
    $MSWord.ActiveDocument.WebOptions.UseLongFileNames = $true
    $MSWord.ActiveDocument.WebOptions.BrowserLevel = $BrowserLevel::wdBrowserLevelMicrosoftInternetExplorer6
    $path = $LocalSignaturePath+'\'+$CompanyName+".htm"
    $MSWord.ActiveDocument.saveas([ref]$path, [ref]$saveFormat)
    
    $saveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat], "wdFormatRTF");
    $path = $LocalSignaturePath+'\'+$CompanyName+".rtf"
    $MSWord.ActiveDocument.SaveAs([ref] $path, [ref]$saveFormat)
    
    $path = $LocalSignaturePath+'\'+$CompanyName+".txt"
    $MSWord.ActiveDocument.SaveAs([ref] $path, [ref]$SaveFormat)    #::wdFormatText)
    $MSWord.ActiveDocument.Close()
    
    $MSWord.Quit()
    
    }
    
    #Stamp registry-values for Outlook Signature Settings if they doesn`t match the initial script variables. Note that these will apply after the second script run when changes are made in the "Custom variables"-section.
    if ($ForcedSignatureNew -eq $ForceSignatureNew){}
    else
    {Set-ItemProperty $CompanyRegPath'\Outlook Signature Settings' -name ForcedSignatureNew -Value $ForceSignatureNew}
    
    if ($ForcedSignatureReplyForward -eq $ForceSignatureReplyForward){}
    else
    {Set-ItemProperty $CompanyRegPath'\Outlook Signature Settings' -name ForcedSignatureReplyForward -Value $ForceSignatureReplyForward}
    
    if ($SignatureVersion -eq $SigVersion){}
    else
    {Set-ItemProperty $CompanyRegPath'\Outlook Signature Settings' -name SignatureVersion -Value $SigVersion}
    
    #проверить актуальность тел. номера
    if ($TelephoneNumberREG -eq $ADTelePhoneNumber){}
    else
    {Set-ItemProperty $CompanyRegPath'\Outlook Signature Settings' -name TelephoneNumber -Value $ADTelePhoneNumber}
    if ($TelephoneNumberREG -eq $ADTelePhoneNumber){}
    else
    {Set-ItemProperty $CompanyRegPath'\Outlook Signature Settings' -name TelephoneNumber -Value $ADTelePhoneNumber}
    
    #проверить актуальность ФИО
    if ($DisplayNameREG -eq $ADDisplayName){}
    else
    {Set-ItemProperty $CompanyRegPath'\Outlook Signature Settings' -name DisplayName -Value $ADDisplayName}
    if ($DisplayNameREG -eq $ADDisplayName){}
    else
    {Set-ItemProperty $CompanyRegPath'\Outlook Signature Settings' -name DisplayName -Value $ADDisplayName}

    Но получается так, что при входе он выполняется, подпись создается, но при этом меняется по умолчанию "Вид" вордовского документа с "Разметка страницы" на "Веб-документ". Из-за чего пользователю приходится переключать ее.

    Такое каждый раз при входе, т.к. скрипт висит на Logon и проверяет актуальность данных из АД, чтобы если что изменить подпись.



    14 августа 2019 г. 18:41

Ответы

Все ответы

  • В ISE выплните скрипт кусками дабы найти момент в котором переключается вид и в конце скрипта сделайте его переключение в обратный формат.


    The opinion expressed by me is not an official position of Microsoft

    14 августа 2019 г. 19:52
    Модератор
  • Да где он меняет по тексту понятно. вот тут:

    $MSWord.ActiveDocument.WebOptions.OrganizeInFolder = $true
    $MSWord.ActiveDocument.WebOptions.UseLongFileNames = $true

    Да только вариант с заменой true а false и копированием этих двух строчек, перед закрытием документа 

    $MSWord.ActiveDocument.Close()
    $MSWord.Quit()

    не сработало. Это самая очевидная вещь, которая мне пришла в голову )))

    15 августа 2019 г. 5:23
  • $msword.ActiveWindow.view.type = 3
    • Помечено в качестве ответа Sergei Ryzhkin 15 августа 2019 г. 8:40
    15 августа 2019 г. 8:40