derwowusste
Goto Top

Kalender in Outlook-Datendatei per Skript von Notizen befreien

Moin Kollegen.

Hat sich jemand mal damit befasst? Die Anforderung ist schon sehr speziell.
Ich finde mehrere Tools, die per Skript alle Anhänge aus einer PST nehmen, aber noch keins, welches auch alle Notizen aus Terminen im Kalender dieser PST entfernt - das ist hier erwünscht, die Termine selbst (Zeiten, Betreff, Teilnehmer) sollen bestehen bleiben.

Content-ID: 554562

Url: https://administrator.de/contentid/554562

Printed on: December 14, 2024 at 16:12 o'clock

colinardo
Solution colinardo Mar 05, 2020 updated at 15:12:40 (UTC)
Goto Top
Servus DWW,
kleiner PS Schnippsel der das erledigt
[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")  
$objOL = [microsoft.visualbasic.interaction]::GetObject($null,"Outlook.Application")  
if (!$objOL){$objOL = New-Object -Com Outlook.Application}
$objOL.GetNamespace("MAPI").GetDefaultFolder(9).Items | ?{$_.Body -ne ''} | %{$_.Body = "";$_.Save()}  
Der Code oben macht das bei der momentan eingebundenen Standard-PST, falls du das bei einer anderen PST-Datei machen willst geht das auch mit ein paar Erweiterungen. (Pfad zur PST anpassen).
# pst path
$pst = "E:\backup.pst"  
# ===================
# load outlook com object
[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")  
$objOL = [microsoft.visualbasic.interaction]::GetObject($null,"Outlook.Application")  
if (!$objOL){$objOL = New-Object -Com Outlook.Application}
# namespace object
$ns = $objOL.GetNamespace("MAPI")  
# add pst to session
$ns.AddStore($pst)
# get added store for pst
$ns.Stores | ?{$_.FilePath -eq $pst} | %{
    # find all calendars in root
    $_.GetRootFolder().Folders | ?{$_.DefaultItemType -eq 1} | %{
        # remove body of all messages with body content
        $_.Items | ?{$_.Body -ne ''} | %{$_.Body = '';$_.Save()}  
    }
    # close store
    $ns.RemoveStore($_.GetRootFolder())
}
Grüße Uwe
DerWoWusste
DerWoWusste Mar 05, 2020 at 14:40:32 (UTC)
Goto Top
Servus!

Wie ich Dich kenne, läuft das wie geschmiert. Habe jedoch schon Feierabend gemacht für heute und teste es morgen.
Danke
DerWoWusste
DerWoWusste Mar 06, 2020 at 08:28:44 (UTC)
Goto Top
Nicht weniger als "perfekt".

Vielen Dank ein weiteres Mal!
Wenn Du so im Stoff stehst, kannst Du noch eine Zeile hinzupacken, die auch die Teilnehmerliste entfernt? Hier greift sicherlich bald wieder die Paranoia um sich und das wird auch noch gewünscht.
colinardo
colinardo Mar 06, 2020 updated at 09:03:26 (UTC)
Goto Top
Freut mich wenn ich helfen konnte face-smile.

Zitat von @DerWoWusste:
Wenn Du so im Stoff stehst, kannst Du noch eine Zeile hinzupacken, die auch die Teilnehmerliste entfernt? Hier greift sicherlich bald wieder die Paranoia um sich und das wird auch noch gewünscht.

Für den ersten Code
[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")  
$objOL = [microsoft.visualbasic.interaction]::GetObject($null,"Outlook.Application")  
if (!$objOL){$objOL = New-Object -Com Outlook.Application}
$objOL.GetNamespace("MAPI").GetDefaultFolder(9).Items | %{  
    $_.Body = ''  
    $_.RequiredAttendees = ''  
    $_.OptionalAttendees = ''  
    $_.Resources = ''  
    $_.Save()
}
Für den Zweiten
# pst path
$pst = "E:\backup.pst"  
# load outlook com object
[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")  
$objOL = [microsoft.visualbasic.interaction]::GetObject($null,"Outlook.Application")  
if (!$objOL){$objOL = New-Object -Com Outlook.Application}
# namespace object
$ns = $objOL.GetNamespace("MAPI")  
# add pst to session
$ns.AddStore($pst)
# get added store for pst
$ns.Stores | ?{$_.FilePath -eq $pst} | %{
    # find all calendars in root
    $_.GetRootFolder().Folders | ?{$_.DefaultItemType -eq 1} | %{
        # clear message properties
        $_.Items | %{
            $_.Body = ''  
            $_.RequiredAttendees = ''  
            $_.OptionalAttendees = ''  
            $_.Resources = ''  
            $_.Save()
        }
    }
    # close store
    $ns.RemoveStore($_.GetRootFolder())
}

Entfernt in beiden Fällen zusätzlich die "RequiredAttendees", "OptionalAttendees" und alle "Resource" Objects aus den Terminen. Kann du ja jetzt nach belieben anpassen.
Weitere Eigenschaften von Terminen (AppointmentItems) kannst du in der API-Doku nachschlagen falls noch was gewünscht sein sollte:
https://docs.microsoft.com/de-de/office/vba/api/outlook.appointmentitem# ...

Schönes WE
Uwe
DerWoWusste
DerWoWusste Mar 06, 2020 at 09:24:10 (UTC)
Goto Top
Top, auch das funktioniert.
Danke auch für den Link zur Doku!
DerWoWusste
DerWoWusste Nov 28, 2024 at 17:24:11 (UTC)
Goto Top
Uwe, bist Du da draußen irgendwo face-wink ?

Jahre später
Ich möchte den zweiten Code noch einmal anpassen und weiß nicht, wie.
Mein Problem ist, dass bei signierten Terminen interaktiv eine Frage kommt, die lautet
"You have changed this message. If you save the changes, the message will no longer be digitally signed. Save changes? Yes No"
Kann man das Speichern enforcen und die Frage umgehen?
colinardo
colinardo Nov 29, 2024 updated at 09:19:24 (UTC)
Goto Top
Servus DWW,
Uwe, bist Du da draußen irgendwo face-wink ?
bin wieder von meinem Planeten zurückgekehrt, die Rakete hatte leider Verspätung face-smile.
Mein Problem ist, dass bei signierten Terminen interaktiv eine Frage kommt, die lautet
"You have changed this message. If you save the changes, the message will no longer be digitally signed. Save changes? Yes No"
Kann man das Speichern enforcen und die Frage umgehen?
Das programmatische Verändern von digital signierten Nachrichten ist mithilfe der COM-API nur über einem Workaround möglich. Und zwar das Erstellen einer Dublette des Termins und übertragen von den Eigenschaften und entfernen des Originals. Habe dir mal eine Version erstellt bei der du die gewünschten Eigenschaften selbst noch ergänzen kannst. Im jetzigen Zustand sind diees nur Subject, Start, Duration und Location das musst du auf deine Anforderungen anpassen. Probiere es mal aus ob das für dich so in Frage kommt.
# pst path
$pst = "E:\backup.pst"    
# load outlook com object
$objOL = $null
try{
	$objOL = [System.Runtime.InteropServices.Marshal]::GetActiveObject('Outlook.Application')  
}catch{
	$objOL = New-Object -Com Outlook.Application
}
# namespace object
$ns = $objOL.GetNamespace("MAPI")    
# add pst to session
$ns.AddStore($pst)
# get added store for pst
$ns.Stores | ?{$_.FilePath -eq $pst} | %{
    # find all calendars in root
    foreach($folder in $_.GetRootFolder().Folders | ?{$_.DefaultItemType -eq 1}){
             $items = $folder.Items
             foreach($item in $items){
                 # check if message has security flags (signed/encrypted)
                 if ([int]$item.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x6E010003") -gt 0){  
                     # if yes, create new appointment item
                     $new = $folder.Items.Add(1)
                     # ... and copy the desired properties over to new item and save to folder
                     $new.Subject = $item.Subject
                     $new.Start = $item.Start
                     $new.Duration = $item.Duration
                     $new.Location = $item.Location
                     $new.Save()
                     # delete original signed item
                     $item.Delete()
                   }else{
                     # normal is unsigned/unencrypted message, only clear message properties and save
                     $item.Body = ''    
                     $item.RequiredAttendees = ''    
                     $item.OptionalAttendees = ''    
                     $item.Resources = ''    
                     $item.Save()
                   }
              }
    }
    # close store
    $ns.RemoveStore($_.GetRootFolder())
}
Grüße Uwe
DerWoWusste
DerWoWusste Nov 29, 2024 at 20:51:57 (UTC)
Goto Top
Du bist ein Fuchs. Ich werde es Montag testen, vielen Dank!
DerWoWusste
DerWoWusste Dec 10, 2024 at 14:40:37 (UTC)
Goto Top
Moin. Kurze Rückmeldung: der Code tat hier nicht das, was er sollte, und dann wurde ich krank. Ich meine, die Powershell meldete nach einer Weile, das etwas nicht ginge, wenn Outlook offen wäre (dabei startet das Skript doch unweigerlich Outlook, oder nicht?).

Bei meiner Kontrolle waren dann sofort noch Attachments in Terminen zu finden.

Ich schau mir das vor Weihnachten sicherlich noch einmal an.