U posljednje vrijeme bilo je nekih nedoumica u Exchange Onlineu, uglavnom zbog nekih nadolazećih obustava. EWS odlazi, kao i neki cmdleti povezani s revizijom. S druge strane, Microsoft je bio zauzet ažuriranjem pozadine kako bi proveo ove zastare. Ali tamo gdje ima promjena, postoji i mogućnost da se uvuče neželjeno ponašanje… posebno s obzirom na loše kontrole kvalitete na koje smo navikli u usluzi u oblaku.
Namjerno ili ne, sada možemo pristupiti sadržaju Exchange Online neaktivni poštanski sandučići putem EWS API-ja. Da se osvježimo, neaktivni poštanski sandučići su poštanski sandučići koji su stavljeni na čekanje prije brisanja odgovarajućeg korisničkog računa. Postavljeni su kao alternativa tipu scenarija “pretvori ovaj poštanski sandučić u zajednički za čuvanje podataka”, u usporedbi s kojim nude neke pogodnosti. Najvažnija od njih je da su neaktivni poštanski sandučići besplatni, a podatke u njima možete čuvati neograničeno dugo.
S druge strane, krajnji korisnici ne mogu pristupiti neaktivnim poštanskim sandučićima i ne mogu se konfigurirati u klijentima e-pošte. Stoga nisu prikladni za scenarije u kojima trebate često pristupati sadržaju koji se u njima nalazi. Osim toga, neaktivni poštanski sandučići ne mogu se koristiti za primanje ili slanje poruka. Možete ih zamisliti kao “hladnu” pohranu, s podacima koji se čuvaju samo u svrhu usklađenosti, za razliku od toga da su dostupni za rad. Neaktivni poštanski sandučići transparentni su i za većinu administratorskih alata. Jedini način pristupa sadržaju unutar neaktivnog poštanskog sandučića je izvršavanje upita eDiscovery ili pretraživanja sadržaja. Administratori također mogu obnoviti ili oporaviti neaktivne poštanske sandučiće kako bi omogućili pristup njihovom sadržaju.
Dakle, to je teorija. Međutim, kako se ispostavilo, u trenutku pisanja ovog članka možemo koristiti EWS API za pristup sadržaju neaktivnih poštanskih sandučića, bez potrebe za administriranjem ili alatima za usklađenost. Pa, još uvijek morate imati konfiguriranu aplikaciju s dovoljnim dopuštenjima, posebno opseg oponašanja EWS-a. Osim toga, nema preduvjeta. Pretpostavljam da biste trebali znati i SMTP adresu dotičnog poštanskog sandučića jer nam je potrebna za bitove lažnog predstavljanja.
Da bismo ilustrirali kako možete iskoristiti EWS API za pristup sadržaju pohranjenom u neaktivnim poštanskim sandučićima, možemo upotrijebiti standardni tok: pribavite pristupni token za ExO resurs, stvorite objekt usluge Exchange i utisnite token na njega, zatim oponašajte korisnika i pokrenite neke upite prema poštanskom sandučiću. U donjem primjeru koristit ćemo dopuštenja aplikacije jer je s njima lakše rukovati provjerom autentičnosti. Osim toga, u svakom slučaju morate oponašati korisnika.
#Load the MSAL binaries Add-Type -Path "C:\Program Files\WindowsPowerShell\Modules\MSAL\Microsoft.Identity.Client.dll" #Obtain an access token $app = [Microsoft.Identity.Client.ConfidentialClientApplicationBuilder]::Create("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx").WithClientSecret("xxxxxxxxxxxxxxxxxxxxxxxx").WithTenantId("tenant.onmicrosoft.com").Build() $Scopes = New-Object System.Collections.Generic.List[string] $Scope = "https://outlook.office365.com/.default" $Scopes.Add($Scope) $token = $app.AcquireTokenForClient($Scopes).ExecuteAsync().Result #Load the EWS binaries Add-Type -Path 'C:\Program Files\Microsoft\Exchange\Web Services\2.2\Microsoft.Exchange.WebServices.dll' #Create Exchange service $global:exchangeService = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013) $exchangeService.Url = "https://outlook.office365.com/EWS/Exchange.asmx" $exchangeService.Credentials = New-Object Microsoft.Exchange.WebServices.Data.OAuthCredentials -ArgumentList $token.AccessToken #Impersonate the user $exchangeService.ImpersonatedUserId = New-Object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, "inactive@domain.com")
Od sada biste trebali moći koristiti bilo koju od standardnih EWS metoda za rad sa stavkama pohranjenima u neaktivnom poštanskom sandučiću. Na primjer, možemo nabrojati sve mape pod Top of Information trgovina preko FindFolders metoda:
$RootFolderID = New-Object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot) $RootFolder = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($exchangeService,$RootFolderID) $View = New-Object Microsoft.Exchange.WebServices.Data.FolderView(10000) $View.Traversal = [Microsoft.Exchange.WebServices.Data.FolderTraversal]::Deep $res = $RootFolder.FindFolders($View)
Snimka zaslona u nastavku daje nam brzu usporedbu između skupa mapa dobivenih gornjom metodom i skupa mapa dobivenih putem Get-MailboxFolderStatistics cmdlet (ne zaboravite koristiti –IncludeSoftDeletedRecipients prekidač). U oba slučaja primijenio sam filtar za prikaz samo mapa sa stavkama različitim od nule.
Na isti način možete iskoristiti FindItems metoda za dohvaćanje stavki pohranjenih unutar zadane mape unutar neaktivnog poštanskog sandučića. Ovo uključuje stavke u RecoverableItems podstablo. Na primjer, za upit o sadržaju Čišćenja mapu, možemo upotrijebiti nešto ovako:
$SearchFilter = New-Object Microsoft.Exchange.WebServices.Data.SearchFilter+IsEqualTo([Microsoft.Exchange.WebServices.Data.EmailMessageSchema]::ItemClass, "IPM.Note") $View = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000) $Result = $exchangeService.FindItems([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::RecoverableItemsPurges,$SearchFilter,$View) $Result.Items[0] $Result.Items[0].Load() $Result.Items[0].Body.Text
Imajte na umu da Vrhunska trgovina informacijama/korisnički dostupno podstablo moglo bi biti malo neplodno, ovisno o obradi politike zadržavanja i tome je li poštanski sandučić imao omogućenu mrežnu arhivu (budući da se obrada MRM-a na neaktivnim poštanskim sandučićima još uvijek događala nekada). U svakom slučaju, kao što je prikazano u gornjem primjeru, možemo koristiti istu metodu za pokrivanje sadržaja RecoverableItems podstablo, gdje se čuvaju sve stavke na čekanju. Slično tome, ako poštanski sandučić ima mrežnu arhivu, možete postaviti upit ArchiveRecoverableItemsRoot umjesto toga podstablo.
Također je vrijedno napomenuti da pristup nije ograničen na operacije samo za čitanje. Zapravo, možete premještati i brisati postojeće stavke i mape, stvarati nove i tako dalje. Dobra vijest je da se provjere sukladnosti i kontrole i dalje primjenjuju – ne možete ukloniti stavke iz Čišćenja mapu na primjer. Na istoj napomeni, možete koristiti (većinu) drugih EWS metoda, kao što je GetDelegates jedan. Pomalo zabrinjavajuća činjenica je da možete pristupiti i sadržaju revizije folder, što do sada nije bilo moguće.
Za razliku od korištenja EWS metoda, nijedna od gore navedenih neobičnosti ne može se reproducirati putem Graph API-ja. Međutim, zanimljivo je da neki od poziva upućenih putem Grapha rezultiraju 504 Gateway Timeout odgovor, što ostavlja prostora za tumačenje. Pa opet, Graph API nije poznat po tome što je vrlo dosljedan u odjelu za obradu pogrešaka, zar ne…
Dakle, ukratko, nešto sumnjivo se događa s EWS-om u Exchange Onlineu, budući da vam API sada omogućuje pristup sadržaju koji je povijesno bio nedostupan. Svi znakovi upućuju na to da se radi o nenamjernoj promjeni, koja iskreno nema smisla, s obzirom na nadolazeću obustavu podrške za EWS API u usluzi. Bez obzira na razlog, ostaje činjenica da trenutno možemo koristiti EWS API metode za pristup sadržaju pohranjenom unutar neaktivnih poštanskih sandučića, za što čvrsto vjerujem da bi korisnici Microsofta 365 trebali biti svjesni!
PS Ako radije ne koristite primjere temeljene na kodu, dobri stari EWS urednik alat bi vam trebao dati jednostavan način da to testirate.