Programeri jednostavno vole identifikatore. Jedina stvar koju preferiraju je njihova vlastiti okus identifikatora, pretpostavljam da ih sve čini posebnim. Što je sve u redu, sve dok niste prisiljeni sami kretati labirintom. Kao što je slučaj sa Exchange-om, gde moramo da se nosimo sa nekoliko tipova identifikatora u zavisnosti od zadatka koji je pred nama, posao kome ne pomaže nedostatak odgovarajuće (ili bilo kakve) dokumentacije, odbacivanje bez rešavanja pitanja pariteta, itd.
O tome smo već govorili, na primjer u ovom članku. U to vrijeme, zastarjelost EWS-a još nije bila objavljena, tako da je nova metoda translateExchangeIds zasnovana na Graphu bila samo novina na naslovnici. Međutim, s predstojećim nestankom EWS-a i bez očekivanja da ćete vidjeti podršku za konverziju StoreId vrijednosti putem grafova, sada je pravo vrijeme da se vratite na temu i pružite neke dodatne detalje/metode koje vam mogu pomoći dalje.
Imajte na umu da se rasprava u ovom članku fokusira samo na identifikatore fascikli, jer se slučajevi upotrebe koje ispitujemo vrte oko tipičnog iskustva „administratora“ (ili IT Pro), gde je PowerShell glavni alat. Drugim riječima, počinjemo s StoreId vrijednosti, dobijene kroz Get-ExOMailboxFolderStatistics ili ekvivalentne cmdlete (Get-MailboxFolderStatistics ili Get-MailboxFolder). The StoreId zatim se pretvara u entryIdkoje MAPI klijenti koriste. The entryId zauzvrat podržava Graph’s translateExchangeIds metoda koja nam omogućava da dobijemo RestIdšto je ono što koriste “Outlook” Graph API-ji. Slični koraci se mogu pratiti za stavke umjesto foldera, ako je potrebno.
Kao primjer, recimo da želimo raditi sa određenim folderom u našem poštanskom sandučetu. The Get-ExOMailboxFolderStatistics Cmdlet nam može dati početnu tačku, folder StoreId vrijednost, preko FolderId imovina:
Get-ExOMailboxFolderStatistics vasil | ? $_.Name -eq "Xbox" | select Name,FolderId Name FolderId ---- -------- Xbox LgAAAAChKSJAhlnUTIHtKSso30ThAQBIPfDMxyP/RYhY8M8xmAPVAAS8XYoAAAAB
Jedna praktična upotreba StoreId vrijednost je za eDiscovery/Content pretrage kroz tzv ciljane kolekcije karakteristika. Čini se da je iz nekog razloga Microsoft ukinuo relevantnu dokumentaciju, tako da možete pogledati moj prethodni članak na tu temu, ili Tonyjevu verziju ovdje. TL;DR – možete koristiti KeyQL-ove folderId ključna riječ za opseg operacije da pokrije samo određeni folder (ili skup foldera, sa izuzecima koji su također podržani). Da biste to učinili, prvo morate izvršiti konverziju StoreId vrijednost, kao što je gore dobijeno, u očekivani format. Evo primjera koda za to:
$folderId = [Convert]::FromBase64String($folderId)
$encoding = [System.Text.Encoding]::GetEncoding("us-ascii")
$nibbler = $encoding.GetBytes("0123456789ABCDEF")
$indexIdBytes = New-Object byte[] 48; $indexIdIdx = 0
$folderId | select -skip 23 -first 24 | % $indexIdBytes[$indexIdIdx++] = $nibbler[$_ -shr 4]; $indexIdBytes[$indexIdIdx++] = $nibbler[$_ -band 0x0F]
return $encoding.GetString($indexIdBytes)U našem primjeru, mapa Xbox StoreId vrijednost se transformira na sljedeći način:
#storeId LgAAAAChKSJAhlnUTIHtKSso30ThAQBIPfDMxyP/RYhY8M8xmAPVAAS8XYoAAAAB #eDiscovery folderId 483DF0CCC723FF458858F0CF319803D50004BC5D8A000000
Sada možemo koristiti ovu vrijednost za pokretanje pretraživanja eDiscovery u opsegu samo u fascikli Xbox. Kao što je prikazano na snimku ekrana, rezultati koje je vratio upit odgovaraju broju stavki trenutno u navedenoj fascikli, prema Outlookovom izveštaju.
Pored eDiscovery-a, možda će vam trebati identifikator za izvođenje različitih operacija putem cmdlet-a iz Graph SDK-a za PowerShell ili odgovarajućih metoda Graph API-ja. Dok možete koristiti dobro poznat vrijednosti za zadane foldere, tj Inbox ili RecoverableItemsDeletionsrad sa mapama koje kreiraju korisnici zahtijeva drugu vrstu identifikatora – RestId. nažalost, translateExchangeIds metoda trenutno ne podržava način konverzije StoreId preko PowerShell-a smo došli do a restId vrijednost, tako da ovdje moramo implementirati međukorak.
Kôd ispod je ljubaznošću Martina Macháčeka putem na Stack Overflow. Transformiše a StoreId vrijednost za an entryId jedan.
function FolderIdToEntryId
param([Parameter(Mandatory=$true)]$folderId)
# convert from base64 to bytes
$folderIdBytes = [Convert]::FromBase64String($folderId)
# convert byte array to string, remove '-' and ignore first byte
$folderIdHexString = [System.BitConverter]::ToString($folderIdBytes).Replace('-','')
$folderIdHexStringLength = $folderIdHexString.Length
# get hex entry id string by removing first and last byte
$entryIdHexString = $folderIdHexString.SubString(2,($folderIdHexStringLength-4))
# convert to byte array - two chars represents one byte
$entryIdBytes = [byte[]]::new($entryIdHexString.Length / 2)
For($i=0; $i -lt $entryIdHexString.Length; $i+=2)
$entryIdTwoChars = $entryIdHexString.Substring($i, 2)
$entryIdBytes[$i/2] = [convert]::ToByte($entryIdTwoChars, 16)
# convert bytes to base64 string
$entryIdBase64 = [Convert]::ToBase64String($entryIdBytes)
# count how many '=' contains base64 entry id
$equalCharCount = $entryIdBase64.Length - $entryIdBase64.Replace('=','').Length
# trim '=', replace '/' with '-', replace '+' with '_' and add number of '=' at the end
$entryId = $entryIdBase64.TrimEnd('=').Replace('/','_').Replace('+','-')+$equalCharCount
return $entryId
Jednom imamo entryId vrijednost, možemo koristiti grafikon translateExchangeIds metoda za dobijanje restIdili bilo koji drugi podržani identifikator (napomena immutableEntryId i restImmutableEntryId nije podržano za foldere). Za konverziju je potreban još jedan korak restId formatu koji koristi OWA.
Kombinujući sve ovo, možemo kreirati jednostavnu skriptu za generisanje izveštaja o svim fasciklama unutar određenog poštanskog sandučeta, zajedno sa njihovim ID-ovima. možete preuzeti skriptu iz mog GitHub repo. Biće vam potrebni moduli Exchange Online i Graph da biste ga pokrenuli, a trenutna verzija podržava samo delegirane dozvole. Ovo bi i dalje trebalo biti dovoljno za generiranje ID-ova u svim poštanskim sandučićima, sve dok korisnik s kojim se autentifikujete ima User.ReadBasic.All dozvolu. Na strani Exchangea, jedini cmdlet koji nam treba je Get-ExOMailboxFolderStatistics.
Skripta ima jedan obavezan parametar, –poštansko sandučeda označimo poštansko sanduče za koje smo zainteresovani. Možete koristiti bilo koji GUID (ExternalDirectoryObjectId) ili primarna SMTP adresa. Potonji se može koristiti samo ako odgovara UPN-u, zbog Graphovog dizajna. Podržan je jedan dodatni parametar koji signalizira da želite obraditi sve mape unutar poštanskog sandučeta, uključujući i one u stablu koje nije IPM. Imajte na umu da je u Exchange Online normalno da poštanski sandučići obuhvataju hiljade i hiljade fascikli koje nisu dostupne korisniku, pa koristite odgovarajući parametar (-Uključuje NonIPM) samo kada ste sigurni.
Evo nekoliko primjera kako pokrenuti skriptu:
#Run the script against the user@domain.com mailbox .\Mailbox_Folder_IDs.ps1' -Mailbox user@domain.com #Alternatively, you can specify ExternalDirectoryObjectId value as input .\Mailbox_Folder_IDs.ps1' -Mailbox 4ebd5057-4d61-4ca0-beb7-df3f1ebd1aa7 #Generate IDs for folders in the non-IMP tree .\Mailbox_Folder_IDs.ps1' -Mailbox user@domain.com -IncludeNonIPM
Osnovna funkcionalnost povezivanja je uključena u skriptu, koja bi također trebala provjeriti da li su prisutne potrebne Graph API dozvole (User.ReadBasic.All). Budući da je provjera grešaka minimalna i da se ne trudimo pokriti sve moguće scenarije, slobodno je zamijenite željenom metodom povezivanja na uslugu (linije 11-42).
Jednom kada se poveže, skripta će dohvatiti sve fascikle unutar navedenog poštanskog sandučeta, uključujući fascikle u ne-IPM stablu kada -IncludeNonIPM korišten je prekidač. Vraćena lista foldera se zatim obogaćuje sa eDiscoveryId i EntryId vrijednosti, za koje ne trebamo vršiti nikakve dodatne pozive. Sljedeći korak je pozivanje Graph-a translateExchangeIds metoda protiv skupa generiranih entryId vrijednosti, što se radi u serijama od 1000. Dobijeno RestId vrijednosti se pohranjuju u hash tablicu i koriste za obogaćivanje konačnog izlaza.
Kad smo kod toga, izlaz se zapisuje u CSV datoteku unutar radnog direktorija, koji sadrži sljedeće kolone:
- Ime – naziv foldera.
- FolderType – tip fascikle.
- Identitet – folder “putanja”. Imajte na umu da će poštanski sandučić biti označen identifikatorom koji ste unijeli kao unos, tako da možete očekivati da ćete ovdje vidjeti GUID-ove, ako ste ih unijeli.
- FolderId – to StoreId vrijednost karte.
- eDiscoveryId – vrijednost koju možete koristiti za ciljnu kolekciju eDiscovery.
- EntryId – MAPI id
- RestId – ID koji koristi Graph API
- OWAId – ID koji koristi OWA

Osim toga, generira se osnovna HTML datoteka sa istim podacima, upakovana u tablicu koja se može sortirati. Dva mala dodatka su dodana HTML-u: dugme koje otvara Graph explorer sa upitom da dobijete fasciklu o kojoj je reč, i drugo za navigaciju do fascikle direktno u OWA. Imajte na umu da će posljednja raditi samo za foldere korisničke pošte, bez kalendara, bez foldera kontakata, bez sistemskih. I to samo ako ste koristili UPN/primarnu SMTP adresu kao identifikator poštanskog sandučeta.

The Otvoreno u OWA dugme neće raditi ispravno ako ste dali ExternalDirectoryObjectId vrijednost kao ulaz. Ako namjeravate koristiti spomenuto dugme, uvijek proslijedite UPN/primarnu SMTP adresu. I, kao dodatni bonus, veza će raditi i za sve poštanske sandučiće za koje ste dobili potpune dozvole za pristup, ako ste odabrali fasciklu kojoj može pristupiti korisnik. Za dugme Otvori na grafikonu, scenariji „delegiranja“ su podržani samo ako imate Mail.ReadBasic.Shared odobrene dozvole.
I time možemo zatvoriti trenutni članak. Reci mi šta misliš o scenariju. Vidite li potrebu za uključivanjem drugih identifikatora? Što je s podrškom za dozvole aplikacija? Još nešto?