Jump to content

CrissGross

Members
  • Gesamte Inhalte

    4
  • Registriert seit

  • Letzter Besuch

Fortschritt von CrissGross

Apprentice

Apprentice (3/14)

  • Erste Antwort
  • Erster eigener Beitrag
  • Eine Woche dabei
  • Einen Monat dabei
  • 1 Jahre dabei

Neueste Abzeichen

0

Reputation in der Community

  1. 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. Für die Nachwelt, eine Lösung via PowerShell. Leider hab ich es nicht mehr geschafft die IDs der Postfächer auszulesen und musste Sie vorher "manuell" bestimmen. Schön wäre evtl auch, das bei einem Fehler nicht in einen anderen Ordner verschoben wird sondern eine Kategorie Namens Fehler hinzugefügt wird. Ich kann damit aber erstmal leben :) #PowerShell Retrieves Outlook Email Subject Clear-Host $Outlook = New-Object -ComObject Outlook.Application # Move Emails from Inbox to Test folder $EmailIToMove = $Outlook.Session.Folders.Item(2).Folders.Item("INBOX").Folders.Item("TESTEINGANG").Items $EmailIToMove | ft SentOn, Sensitivity, Categories, SenderName, Subject, to -AutoSize -Wrap $NewFolder = $Outlook.Session.Folders.Item(8).Folders.Item("INBOX") $BackupFolder = $Outlook.Session.Folders.Item(8).Folders.Item("INBOX").Folders.Item("Eingehende Nachrichten") $FailureFolder = $Outlook.Session.Folders.Item(2).Folders.Item("INBOX").Folders.Item("TESTEINGANG").Folders.Item("FEHLER") $SuchwertCategory = "AUTOMATISCH" $SuchwertSenderName = "Eigener Mailboxname" $runde = 0 FOREACH($Email in $EmailIToMove) { $runde = $runde + 1 write-host -nonewline "E-Mail" $runde $Categories = ($Email|Select Categories) $SenderName = ($Email|Select SenderName) if($Categories -match $SuchwertCategory -and $SenderName -notmatch $SuchwertSenderName) { $Email.Move($NewFolder) $Email.Copy($BackupFolder) echo " erfolgreich verschoben!" } elseif($SenderName -match $SuchwertSenderName) { $Email.Move($FailureFolder) echo " überprüfen! In Fehler-Ordner verschoben!" } else { echo " nicht verschoben, da Bedingungen nicht erfüllt!" } } if($runde -le 1) { $wort1 = "wurde" $wort2 = "E-Mail" } else { $wort1 = "wurden" $wort2 = "E-Mail(s)" } echo "--------------------------------------------------------" write-host -nonewline "Insgesamt"$wort1 $runde $wort2 "gefunden"
  3. Das ist leider nicht möglich, denn das 2. Postfach ist ein "lokales Imap Postfach" auf einem Server der im Firmennetzwerk steht. Somit wäre das 2. Postfach in welches die Mails verschoben werden sollen nur über den Client sichtbar, also über Outlook. EDIT NUMMER 1 Im übrigen haben wir als Gesellschaft nur FULL ACCESS Berechtigungen auf unsere Exchange Postfächer. Wir haben leider keinen Zugriff auf die Administrationstools des Exchange Servers. EDIT NUMMER 2 Wobei?! Hab mich damit gerade mal kurz auseinander gesetzt... via Remote Shell hätte ich Zugriff :D Nach Eingabe meiner Nutzerkennung und meines PWs... SET-ExecutionPolicy RemoteSigned $UserCredential = Get-Credential $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection Import-PSSession $Session Jetzt verstehe ich das Prinzip allerdings nicht... eine Transportregel wird doch ausgeführt, bevor diese E-Mail in dem ursprünglichen Postfach eintrifft? Das heisst, ein Mitarbeiter könnte dieser Nachricht keine Kategorie mehr mitgeben, bzw. diese Email würde vorher in dem zentralen Postfach nicht in einen bestimmten Ordner wandern? Oder verstehe ich das Prinzip gerade nicht.... :-( Ich sitz schon seit heute morgen 7:30 an dem Problem, da ich morgen mit dem neuen System Produktiv gehen muss... PS EDIT ist mein zweiter Name^^ EDIT NUMMER 3 (15:20 Uhr) Habe gerade eben noch folgenden Code zusammengeschnippselt. Für mich hört sich dieser Sehr vielversprechend an. Nur verstehe ich nicht, wie ich $Namespace.Store[iD] <<< die ID herbekomme... habe jetzt etwas gegoogled, werde aber nicht schlauer. Befasse mich erst seid ein paar Stunden mit Powershell. Zum Testen habe ich nun in meinem persönlichen Postfach unter der Inbox einen Ordner TESTAUSGANG und einen Ordner TESTEINGANG. $outlook = New-Object -ComObject outlook.application $namespace = $Outlook.GetNameSpace("mapi") $namespace.Logon("Outlook") $LocalStore = $Namespace.Stores[1] $RemoteStore = $Namespace.Stores[1] $LocalFolders = $LocalStore.GetRootFolder().folders $RemoteFolders = $RemoteStore.GetRootFolder().folders $RemoteInbox = $RemoteFolders | ? {$_.Name -eq "Inbox\TESTEINGANG"} $LocalInbox = $LocalFolders | ? {$_.Name -eq "Inbox\TESTAUSGANG"} $RemoteInbox.CopyTo($LocalInbox.Parent) Foreach ($Item in $RemoteInbox.Items){ $Copy = $Item.Copy() [void]$Copy.Move($TargetFolder) } EDIT NUMMER 4 (16:32 Uhr) Ok ich habe die einfache Lösung via PowerShell! Clear-Host $Outlook = New-Object -ComObject Outlook.Application # Move Emails from Mailbox "2" INBOX/TESTEINGANG to Mailbox "8" INBOX $EmailIToMove = $Outlook.Session.Folders.Item(2).Folders.Item("INBOX").Folders.Item("TESTEINGANG").Items $EmailIToMove | ft SentOn, Subject, SenderName, To, Sensitivity -AutoSize -Wrap $NewFolder = $Outlook.Session.Folders.Item(8).Folders.Item("INBOX") FOREACH($Email in $EmailIToMove ) { $Email.Move($NewFolder) } Würde jetzt gerne noch die Mailboxen anstatt mit einer ID mit dem geneuen oder ähnlichen Namen ansprechen. Damit später bei Einrichtung bzw. entfernen einer Mailbox die ID's nicht zufällig durch andere ersetzt werden. Das wäre Fatal. Vielleicht kann mir hierzu noch einer helfen. Nice to Have, wäre auch, wenn das Script die Bedingung einer Kategorie prüft. Aber das sollte ich wohl noch ergoogeln können. Trotzdem Danke an Nobbyaushm, der mich auf die Idee mit Powershell gebracht hat.
  4. Hallo zusammen! Folgendes Problem, ich habe 1 bzw. 2 Regeln erstellt. Eine Regel davon beinhaltet folgendes. Nach Erhalt einer Nachricht, über das Konto "ZENTRALES-POSTFACH" und die an "ZENTRALES-POSTFACH" gesendet wurde und die Kategorie "AUTOMATISCH" zugeordnet ist und nur auf diesem Computer diese in den Ordner "INBOX/(POSTFACH B)" verschieben eine Kopie davon in den Ordner "INBOX/(POSTFACH C)" verschieben. außer der Absender der Nachricht ist "ZENTRALES-POSTFACH" Auf dieses zentrale Postfach greifen 50 Mitarbeiter zu, das "Postfach B" und "Postfach C" wo bestimmte Mails mit der zugewiesenen Kategorie hinverschoben werden sollen, ist nur auf einem "Server" bzw. auf einem einzigen Client-Rechner in Outlook eingebunden. Jetzt greifen die Regeln aber leider nicht automatisch. Also habe ich mir ein VB Script zusammengetragen das alle X Sekunden alle Regeln ausführen soll. Das funktioniert auch. Allerdings läuft das Script nicht, welches die Regeln anstoßen soll. Es lässt die Client Regel leider aussen vor. Anbei das Script um die Regeln anzustoßen. Im übrigen funktionieren die Regeln wenn ich diese manuell Starte. Public Sub RunRules() Dim RunEnabledRules As Boolean Dim RunDisabledRules As Boolean Dim ExecuteOption As Long Dim IncludeSubfolders As Boolean Dim Inbox As Boolean 'Aktivierte Regeln ausführen (true/false) RunEnabledRules = True 'Deaktivierte Regeln ausführen (true/false) RunDisabledRules = False 'Auf welche Nachrichten sollen die Regeln angewendet werden? '0 = alle Nachrichten '1 = nur gelesene Nachrichten '2 = nur ungelesene Nachrichten ExecuteOption = 0 'Startordner ist der Posteingang (true) oder der aktuelle Ordner (false) Inbox = True 'Regeln nur auf den Startordner anwenden (false) oder auch auf dessen Unterordner (true) IncludeSubfolders = False RunRules_ex RunEnabledRules, RunDisabledRules, ExecuteOption, IncludeSubfolders, Inbox End Sub Private Sub RunRules_ex(ByVal RunEnabledRules As Boolean, ByVal RunDisabledRules As Boolean, _ ByVal ExecuteOption As Long, ByVal IncludeSubfolders As Boolean, ByVal Inbox As Boolean) Dim Store As Outlook.Store Dim Rules As Outlook.Rules Dim Rule As Outlook.Rule Dim Folder As Outlook.Folder If Inbox Then Set Folder = Application.Session.GetDefaultFolder(olFolderInbox) Else Set Folder = Application.ActiveExplorer.CurrentFolder End If Set Store = Application.Session.DefaultStore Set Rules = Store.GetRules For Each Rule In Rules If Rule.RuleType = olRuleReceive Then If Rule.Enabled Then If RunEnabledRules Then Rule.Execute , Folder, IncludeSubfolders, ExecuteOption End If Else If RunDisabledRules Then Rule.Execute , Folder, IncludeSubfolders, ExecuteOption End If End If End If Next End Sub Muss ich die Client Regeln evtl. im Script irgendwie anders ansprechen? Geht das überhaupt? Falls ja, wie geht das? Bin übrigen die nächsten 8 Stunden dauer online hier im Forum, ich werde schnell antworten ;-) falls es Fragen gibt. Also vielleicht noch zu meiner Person, da dies auch der erste Beitrag bei euch im Forum ist. Ich persönlich bin Programmcodeafin ;-) habe zwar nicht IT studiert, betreue allerdings bei meinem Arbeitgeber genügend Programme, Server, Websiten & Datenbanken. Sicherlich bin ich kein Profi, aber Abläufe von Programmcodes sind für mich zu verstehen. Im übrigen gehört auch zu meinem Motto, sobald ich eine Lösung für ein Problem habe, werde ich das auch in jedem meiner Beitrage als Finale Version klarstellen... damit die Nachweld auch was davon hat. EDIT 13:47 Uhr Mir ist gerade noch eine Idee gekommen, via Powershell würde sich doch ebenfalls das ganze Konstruk umsetzen lassen? Quasi E-Mails aus einem bestimmten Ordner in den Posteingang einer anderen Mailbox verschieben. Das Script könnte ich dann theoretisch sogar über den Aufgaben/ Taskplaner von Windows ablaufen lassen. Vielleicht stößt ja der ein oder andere Powershell Enthusiast dazu... Grüße Chris
×
×
  • Neu erstellen...