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.
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.
Please also mark the comments that contributed to the solution of the article
Content-ID: 554562
Url: https://administrator.de/contentid/554562
Printed on: December 14, 2024 at 16:12 o'clock
9 Comments
Latest comment
Servus DWW,
kleiner PS Schnippsel der das erledigt
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).
Grüße Uwe
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()}
# 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())
}
Freut mich wenn ich helfen konnte .
Für den ersten Code
Für den Zweiten
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
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.
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()
}
# 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
Servus DWW,
Grüße Uwe
Uwe, bist Du da draußen irgendwo ?
bin wieder von meinem Planeten zurückgekehrt, die Rakete hatte leider Verspätung .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."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?
# 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())
}