2026. je godina u kojoj Microsoft planira isključiti EWS, a prije nego što se to dogodi, odvojit ću malo vremena da pregledam svoje uzorke koda kako bih ih ažurirao na Graph API ili alternative, prema potrebi. Jedan takav uzorak koda koji sam koristio tijekom godina služi kao brzi način za čišćenje korisničke mape Izbrisane stavke, koja u Exchange Online ne podliježe zadanom razdoblju od 30 dana “recikliranja”, jer mi prethodno raspravljeno.
Dok se politike zadržavanja doista mogu konfigurirati za čišćenje izbrisanih stavki, u većini slučajeva neće djelovati odmah, stoga u scenarijima u kojima je možda potreban brži pristup, moraju se ispitati druga rješenja. Get-RecoverableItems izvrstan je za nabrajanje izbrisanih stavki, ali ne postoji popratni PowerShell cmdlet za njihovo stvarno uklanjanje (samo za oporavak). I kao stari dobri Traži-Poštanski sandučić također više nije opcija, i ne prava alternativa objavljen i na tom planu, zapeli smo s Graph API-jem.
Nažalost, niti u priči o Graphu nije bilo gotovo nikakvih poboljšanja. Jedino što ovdje vrijedi spomenuti je dodatak Metoda popisa stavkikao dio API-ja za uvoz/izvoz poštanskog sandučića. Navedena metoda je jedina koja vam daje puni inventar svih stavki unutar mape Izbrisane stavke, dok “izvorna” još uvijek zanemaruje određene vrste stavki (tj. Kontakti, Zadaci ili Sastanci se ne vraćaju). Ovo je ilustrirano na snimci zaslona u nastavku:
#Count of Deleted item as per the Import/Export API GET https://graph.microsoft.com/beta/admin/exchange/mailboxes/vasil@Michev.info/folders/deletedItems/items?$count=true #Count of Deleted items via the "standard" endpoint GET https://graph.microsoft.com/beta/me/mailFolders/deletedItems/messages/$count #Count of Deleted items via Get-RecoverableItems (Get-RecoverableItems -Identity vasil -SourceFolder DeletedItems).Count
Iako imamo nekoliko načina za dobivanje odgovarajućeg broja Izbrisanih stavki, njihovo uklanjanje je druga priča. Još uvijek nema podrške za EWS-ove Mapa.Prazna metoda, tako da smo zapeli s uklanjanjem svake stavke pojedinačno. Krajnje točke API-ja za uvoz/izvoz ne podržavaju nikakve operacije brisanja stavki, tako da ni s te strane nema poboljšanja. I dok ih možemo iskoristiti da dobijemo skup ID-ova stavki za sve vrste stavki koje se trenutačno nalaze unutar Izbrisanih stavki, samo one koje predstavljaju valjanu “poruku” mogu se ukloniti putem IZBRIŠI poruku metoda.
Ipak, postoji zaobilazno rješenje koje možemo koristiti za objekte Kontakta, kao što je podijelio Glen u ova nit.
Imajući sve gore navedeno na umu, evo kako možete iskoristiti Graph API ili Graph SDK za PowerShell za čišćenje mape Izbrisane stavke. Kao i obično, počinjemo s dopuštenjima. Uklanjanje predmeta zahtijeva Mail.ReadWritea također možemo iskoristiti Kontakti.ČitajPiši opseg, ako planirate ukloniti i izbrisane objekte Kontakti. Imajte na umu da ako namjeravate koristiti dopuštenja delegata, morate pokrenuti kod ili kao vlasnik poštanskog sandučića ili imati dodijeljena Puna dopuštenja uz Mail.ReadWrite.Shared djelokrug.
Connect-MgGraph -Scopes "Mail.ReadWrite.Shared" -NoWelcome
Iako je cilj očistiti starije stavke i osloboditi nešto prostora u procesu, ipak biste mogli nametnuti razdoblje oporavka kako bi korisnik mogao jednostavno vratiti stavke izbrisane greškom. Kako bismo to olakšali, možemo dodati razdoblje “prekida” (u danima) i uzeti ga u obzir pri ispitivanju “starosti” svake stavke. Iako ovdje postoje neka upozorenja, kako bismo pojednostavili stvari, samo ćemo ispitati LastModifiedDateTime vrijednost. Primjenjuje se zadani 30-dnevni prozor i uvodi se parametar za njegovu kontrolu.
[Parameter(Mandatory = $false)] [int]$DaysToKeep = 30
Nakon što se povežemo s Graphom, možemo započeti s obradom skupa poštanskih sandučića koji su navedeni kao ulaz i djelovati na stavke pronađene u njihovoj odgovarajućoj mapi Izbrisane stavke. Kako bi stvari bile jednostavne, oslanjamo se na ugrađenu logiku Graph i rukovanje pogreškama kao osnovni oblik provjere valjanosti. Srećom the Get-MgUserMailFolder cmdlet nam može pomoći u rješavanju scenarija u kojima poštanski sandučić ne postoji, odgovarajuća mapa nije pronađena ili nemamo dozvole za pristup.
try { $deletedItemsFolder = Get-MgUserMailFolder -UserId $mbx -MailFolderId DeletedItems -ErrorAction Stop }
catch {
Write-Warning "Mailbox $mbx not found or inaccessible."
continue
}
Kao što možete primijetiti iz gornjeg isječka, možemo iskoristiti “dobro poznatu” vrijednost Izbrisane stavkeumjesto da morate koristiti dodatna traženja za dobivanje objekta mape. A budući da svojstva objekta mape uključuju TotalItemCountkoristimo ga za postavljanje ispravnih očekivanja. Kao što je gore navedeno, ne možemo se osloniti na grafikon (Get-MgUserMailFolderMessage) na toj fronti, budući da pokrivaju samo određene “vrste” stavki, stoga će broj objekata koje dohvatimo pomoću njih obično biti podcijenjen.
Na kraju, uspoređujemo LastModifiedDateTime svih stavki pronađenih u mapi Izbrisane stavke u odnosu na naše ograničenje, a zatim pokušajte sa stvarnim brisanjem. Neki osnovni izlazni podaci proizvode se u obliku naziva poštanskog sandučića – ukupni broj stavki pronađenih u Izbrisanim stavkama s brojem stavki koje možemo obraditi, brojem preskočenih i uspješno izbrisanih stavki. Primjer u nastavku pokazuje kako pokrenuti funkciju i ogledni izlaz:
Remove-DeletedMailboxItems -Mailbox sharednew@michev.info,shared@michev.info -DaysToKeep 10
Funkciju možete dobiti kao Uzorak osnovnog koda. Budući da je ovdje cilj bio jednostavno ilustrirati trenutno stanje stvari, nemojte na ovo gledati kao na potpuno razvijen kod ili kod spreman za proizvodnju. Za robusnije rješenje, možete pogledati Tonyjev scenarij ovdje.
Ukratko, Graph API još uvijek nema osnovnu funkcionalnost u usporedbi s dobrim starim EWS-om, a čak i tako jednostavni scenariji kao što je pražnjenje mape mogu se pokazati prilično izazovnim. Nema podrške za pristup arhivi. Nema načina za popis svih stavki unutar Izbrisanih stavki ili djelovanje na njima. Nema teškog brisanja (iako možete premjestiti stavke u mapu Čišćenja da biste postigli isto). Kako se datum obustave približava, nisam baš optimističan da ćemo ikada postići jednake rezultate u ovom i mnogim drugim scenarijima.