Восстановление удаленного элемента с помощью API Microsoft Graph

 (Пример сценария для этой статьи можно найти здесь https://github.com/gscales/Powershell-Scripts/blob/master/Graph101/Dumpster.ps1 )

В качестве предварительного запроса для этой статьи он строится на этом и этом

Когда элемент электронной почты удаляется в почтовом ящике, для него устанавливается специальное свойство Last Active Parent FolderId (LAPFID). Это позволяет использовать исходную функцию восстановления элементов папок, которая была развернута как в Exchange Online, так и в Exchange OnPrem (2016) в прошлом году. Чтобы получить доступ к свойству LAPFID вам нужно использовать расширенное определение свойства для него например


В Microsoft Graph это означает выполнение следующего запроса

https://graph.microsoft.com/v1.0/users('user@domain.com')/MailFolders('RecoverableItemsDeletions')/messages?$Top=10&$expand=SingleValueExtendedProperties($filter=(Id%20eq%20'Binary%200x348A')) 


Это значение представляет собой кодированную Base64 версию шестнадцатеричной строки в первом изображении

Чтобы понять, что представляет собой это значение идентификатора свойства, вам нужно сначала немного больше узнать о формате EntryId папки (PR_EntryId), который использует exchange и который задокументирован в этом документе протокола Exchange https://msdn.microsoft.com/en-us/library/ee217297 (v=exchg. 80). aspxДругое визуальное представление этого с выделенными отдельными компонентами будет выглядеть примерно так

адеюсь, из этого вы можете видеть, что LAPFID состоит из DatabaseGUID и GlobalCounter составляющих FolderEntryId. Чтобы понять смысл LAPFID, вам нужно разрешить его обратно в фактическую папку почтового ящика, которую он представляет. Чтобы решить эту проблему обратно в реальную папку почтового ящика, вы можете либо перечислить все папки, разобрать их и проиндексировать идентификатор, либо построить его с помощью существующего идентификатора папки, если вы уверены, что он выходит в том же почтовом ящике (например, он не из онлайн-архива).

В Примере сценария я использовал первый подход который делает пакетный запрос всех папок в почтовом ящике и индексирует идентификатор папки поэтому когда вы делаете любой запрос элемента вы должны видеть папки из которых они были удалены например

PS C:\> Get-RecoverableItemsDeletions -Mailbox gscales@datarumble.com -filter "internetMessageId eq '<SIXPR04MB07943FE6A08A363FD78084F3C81B0@SIXPR04MB0794.apcprd04.prod.outlook.com>'"                                                         

                            : 1
LastActiveParentFolderPath                  : \\Sent Items
LastActiveParentFolder                      : @{id=AQM....==;
                                              childFolderCount=0; unreadItemCount=0; totalItemCount=832; singleValueExt
                                              endedProperties@odata.context=https://graph.microsoft.com/v1.0/$metadata#
                                              users('gscales%40datarumble.com')/mailFolders('msgfolderroot')/childFolde
                                              rs('A...D%3D')/singleValueExte
                                              ndedProperties; singleValueExtendedProperties=System.Object[];
                                              FolderPath=\\Sent Items; FolderRestURI=https://graph.microsoft.com/v1.0/u
                                              sers('user@domain.com')/MailFolders('AQMkADczNDE4YWEAMC03ZWZiLTQyM
                                              2QtODA1Yi02MmIyNmJkYWMyNmQALgAAA74c3T2WBidIkPPeS33fvkkBAHUQR-0Y6jBNnUCxQo
                                              usINAAAAIBCQAAAA=='); PR_ENTRYID=00000000BE1CDD3D9606274890F3DE4B7DDFBE49
                                              0100751047FD18EA304D9D40B1428BAC20D00000000001090000}

Чтобы восстановить элемент обратно в его последнюю родительскую папку id вам просто нужно переместить его используя FolderId целевой папки в которую вы его перемещаете например запрос на восстановление вышеуказанного элемента обратно в его последнюю активную папку Вам нужно будет использовать запись в графическом API которая выглядит следующим образом

POST https://graph.microsoft.com/v1.0/users('gscales@datarumble.com')/MailFolders('AQMkAD....')/messages/AAMkA.../move

{
        "destinationId": "AQMkADczNDE4....."
}

В Примере сценария

$Item = Get-RecoverableItemsDeletions -Mailbox user@domain.com -filter "internetMessageId eq '<SIXPR04MB07943FE6A08A363FD78084F3C81B0@SIXPR04MB0794.apcprd04.prod.outlook.com>'"                                              Invoke-RestoreItemToLastActiveParentFolderId -Item $Item -MailboxName user@domain.com  

(Пример сценария для этой статьи можно найти здесь https://github.com/gscales/Powershell-Scripts/blob/master/Graph101/Dumpster.ps1 )