Zum Inhalt wechseln


Foto

Powershell Assembly nicht geladen


  • Bitte melde dich an um zu Antworten
Eine Antwort in diesem Thema

#1 CrissGross

CrissGross

    Newbie

  • 4 Beiträge

 

Geschrieben 12. Mai 2017 - 12:28

Hi zusammen,

 

ich habe ein Problem.

Via Powershell ISE habe ich ein Script programmiert, welches ein Word Template von einem Netzlaufwerk in den Pfad AppData\Roaming\Microsoft\Signatures kopiert.

Platzhalter in dem Template werden mit User Daten aus dem Active Directory gefüttert.
Danach wird das Word Template via:

 

#HTML
$saveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat], "wdFormatHTML");
$path = $LocalSignaturePath+'\'+$SignatureName+".htm"
$MSWord.ActiveDocument.saveas([ref]$path, [ref]$saveFormat)
 
unter anderem in eine HTML Datei gewandelt.

Das funktioniert soweit auch alles problemlos im Powershell ISE.

Allerdings nicht in der Konsole. Ich verknüpfe das Script um dieses via Doppelklick zu starten, bzw. über den Aufgabenplaner zu starten.
Die Fehlermeldung seht ihr im Anhang.
 
Ich habe bereits versucht das Assembly nachzuladen, allerdings ist das glaube ich der falsche Ansatz.
#$path = 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft.Office.Tools.Word.Implementation.resources\v4.0_10.0.0.0_de_b03f5f7f11d50a3a\Microsoft.Office.Tools.Word.Implementation.resources.dll'
#Add-Type -Path $path

Würdet ihr mir hierbei bitte helfen?

 

 

Der gesamte Code lautet:







#variablen
$SignatureName = 'Standard - VSI'
$SignatureSource = "\\DE-S-0154797\DEASJ-Projects\Angebote\Z_Trigger\Templates2\Signatures\*.docx" #Pfad zu dem Template"
$SignatureVersion = "1.1" #Versionsnummer, muss mit jeder Änderung an Signatur um 0.1 erhöht werden.
$SignatureForce = '0' #Verhindert das manuelle ändern/ löschen/ erstellen einer Signatur, wenn auf 1 steht.




#variablen programmierumgebung
$AppData=(Get-Item env:appdata).value
$SignaturePath = '\Microsoft\Signatures'
$LocalSignaturePath = $AppData+$SignaturePath
$RemoteSignaturePathFull = $SignatureSource




#kopiert / erstellt den Versionsordner
If (-not(Test-Path -Path $LocalSignaturePath\$SignatureVersion))
{
New-Item -Path $LocalSignaturePath\$SignatureVersion -ItemType Directory
}
Elseif (Test-Path -Path $LocalSignaturePath\$SignatureVersion)
{
Write-Output "Ihre Signaturen sind auf dem aktuellsten Stand..."
break
}




#Prüft ob der Signaturpfad vorhanden ist. Wichtig für neue Rechner auf denen noch nie eine Signatur angelegt war.
if (-not(Test-Path -path $LocalSignaturePath)) {
New-Item $LocalSignaturePath -Type Directory
}




#Kontaktiert Active Directory und ruft definierte LDAP Felder ab.
$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








#Kopiert Template vom Netzwerk auf den lokalen Rechner.
Write-Output "Signaturen werden kopiert..."
Copy-Item "$SignatureSource" $LocalSignaturePath -Recurse -Force
$ReplaceAll = 2
$FindContinue = 1
$MatchCase = $False
$MatchWholeWord = $True
$MatchWildcards = $False
$MatchSoundsLike = $False
$MatchAllWordForms = $False
$Forward = $True
$Wrap = $FindContinue
$Format = $False






#Erstellt ein temporäres docx Dokument zur Vorbereitung. LDAP Felder / Variablen
Write-Output "Temporäres Dokument wird erstellt..."
$MSWord = New-Object -ComObject word.application
$fullPath = $LocalSignaturePath+'\'+$SignatureName+'.docx'
$MSWord.Documents.Open($fullPath)


$ADCustomAttribute1 = 'test' 


#DisplayName wird durch das LDAP Feld 'DisplayName' ersetzt.
$FindText = "DisplayName" 
$Designation = $ADCustomAttribute1.ToString() #custom attribute 1 in Exchange Version
If ($Designation -ne '') { 
$Name = $ADDisplayName.ToString()
$ReplaceText = $Name+', '+$Designation
}
Else {
$ReplaceText = $ADDisplayName.ToString() 
}
$MSWord.Selection.Find.Execute($FindText, $MatchCase, $MatchWholeWord, $MatchWildcards, $MatchSoundsLike, $MatchAllWordForms, $Forward, $Wrap, $Format, $ReplaceText, $ReplaceAll ) 






#Wandelt DocX Dokument in HTML, RTF und TXT um.
Write-Output "Signatur wird umgewandelt und gespeichert..."




#HTML
$saveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat], "wdFormatHTML");
$path = $LocalSignaturePath+'\'+$SignatureName+".htm"
$MSWord.ActiveDocument.saveas([ref]$path, [ref]$saveFormat)


#RTF
$saveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat], "wdFormatRTF");
$path = $LocalSignaturePath+'\'+$SignatureName+".rtf"
$MSWord.ActiveDocument.SaveAs([ref]$path, [ref]$saveFormat)


#TXT
$saveFormat = [Enum]::Parse([Microsoft.Office.Interop.Word.WdSaveFormat], "wdFormatText");
$path = $LocalSignaturePath+'\'+$SignatureName+".txt"
$MSWord.ActiveDocument.SaveAs([ref]$path, [ref]$SaveFormat)


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








#Prüft ob eine OFFICE2013 Version vorliegt. Falls ja wird Variable $SignatureForce beachtet.
If (Test-Path HKCU:Software\Microsoft\Office\15.0)


{
Write-Output "Einstellungen für Signatur in Office 2013 werden geändert..."


If ($SignatureForce -eq '0')


{
Write-Output "Änderungen der Einstellungen in Office 2013 sind möglich."


$MSWord = New-Object -ComObject word.application
$EmailOptions = $MSWord.EmailOptions
$EmailSignature = $EmailOptions.EmailSignature
$EmailSignatureEntries = $EmailSignature.EmailSignatureEntries


}


If ($SignatureForce -eq '1')
{
Write-Output "Einstellungen von Office 2013 werden geändert. Es sind keine manuellen Änderungen der Signatur möglich."
    If (Get-ItemProperty -Name 'NewSignature' -Path HKCU:'\Software\Microsoft\Office\15.0\Common\MailSettings') { } 
    Else { 
    New-ItemProperty HKCU:'\Software\Microsoft\Office\15.0\Common\MailSettings' -Name 'NewSignature' -Value $SignatureName -PropertyType 'String' -Force 
    } 
    If (Get-ItemProperty -Name 'ReplySignature' -Path HKCU:'\Software\Microsoft\Office\15.0\Common\MailSettings') { } 
    Else { 
    New-ItemProperty HKCU:'\Software\Microsoft\Office\15.0\Common\MailSettings' -Name 'ReplySignature' -Value $SignatureName -PropertyType 'String' -Force
    } 
}


}


Write-Output "Ihre Signatur ist auf dem neusten Stand!"
 

Fehler gelöst, es lag doch am fehlenden Assembly.

Konnte diesen mit folgender Scriptzeile nachladen:

add-type -AssemblyName “Microsoft.Office.Interop.Word” 


#2 daabm

daabm

    Expert Member

  • 2.111 Beiträge

 

Geschrieben 12. Mai 2017 - 17:56

Prima :)

 

Ein Tipp noch: Wir hängen alle viel zu sehr an Text-Massage... $LocalSignaturePath = $AppData+$SignaturePath - schau Dir mal Join-Path an.


Greetings/Grüße, Martin

Mal ein gutes Buch über GPOs lesen? Oder ein kleines, aber feines Blog darüber?

Und wenn mir die IT mal auf die Nerven geht - coke bottle design refreshment (-: