PR_ENTRYID を Microsoft Graph の REST ID に変換する

MFCMAPI で確認できるアイテムやフォルダーの PR_ENTRYID の値を、Microsoft Graph で使用できる REST ID 形式に変換する方法を紹介します。

たとえば PR_ENTRYID の値が以下だったとします。

000000008D6CA63CDFB18D44933B27DCE7E85C5207001E0CC5CE7C4D0446BE4F970F82B9B02600000000010C00001E0CC5CE7C4D0446BE4F970F82B9B0260002FC5A18060000

これはバイナリ データを 16 進数で表現しています。Microsoft Graph の translateExchangeIds で PR_ENTRYID からの変換ができますが、このままでは使用できません。以下の処理を行います。

  1. バイト配列に変換し、
  2. Base64 でエンコードして、
  3. URL Safe に書き換える

PowerShell であれば、以下のように上記のステップ 1 と 2 を行うことができます。$Base64EntryId には Base64 エンコードされた結果が入っています。

$PR_ENTRYID = "000000008D6CA63CDFB18D44933B27DCE7E85C5207001E0CC5CE7C4D0446BE4F970F82B9B02600000000010C00001E0CC5CE7C4D0446BE4F970F82B9B0260002FC5A18060000"
$Base64EntryID = [Convert]::ToBase64String((0..($PR_ENTRYID.Length - 1) | ?{$_ % 2 -eq 0} | %{[Convert]::ToByte($PR_ENTRYID.Substring($_, 2), 16)}))

さらにこれに対して「+」を「-」に置換し、「/」を「_」に置換して、末尾の「=」を「=」の数を表す数字に置き換えます。

$Base64EntryID = $Base64EntryID.Replace('+', '-').Replace('/', '_')
$Base64EntryID -match "=+?$" ? ($Base64EntryID.Replace($Matches.Values, $Matches.Values.Length)) : $Base64EntryID

$Base64EntryID には URL Safe に書き換えられた値が入っています。以下のような値になっているはずです。

AAAAAI1spjzfsY1Ekzsn3OfoXFIHAB4Mxc58TQRGvk-XD4K5sCYAAAAAAQwAAB4Mxc58TQRGvk-XD4K5sCYAAvxaGAYAAA2

これで translateExchangeIds で使用できる形式になりました。以下のようにリクエストを実行することで REST ID へ変換されます。

POST https://graph.microsoft.com/v1.0/me/translateExchangeIds
{
  "inputIds" : [
    "AAAAAI1spjzfsY1Ekzsn3OfoXFIHAB4Mxc58TQRGvk-XD4K5sCYAAAAAAQwAAB4Mxc58TQRGvk-XD4K5sCYAAvxaGAYAAA2"
  ],
  "sourceIdType": "entryId",
  "targetIdType": "restId"
}

以下のようなレスポンスを取得できれば成功です。targetId は REST ID 形式になっていますので、Microsoft Graph で Id として使用できます。

{
  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(microsoft.graph.convertIdResult)",
  "value": [
    {
      "sourceId": "AAAAAI1spjzfsY1Ekzsn3OfoXFIHAB4Mxc58TQRGvk-XD4K5sCYAAAAAAQwAAB4Mxc58TQRGvk-XD4K5sCYAAvxaGAYAAA2",
      "targetId": "AAMkADY0MzFiYWE4LTM2YzUtNDFjZi05MDEyLTg5NjNhZjQ4ZmM5MgBGAAAAAACNbKY837GNRJM7J9zn6FxSBwAeDMXOfE0ERr5Plw_CubAmAAAAAAEMAAAeDMXOfE0ERr5Plw_CubAmAAL8WhgGAAA="
    }
  ]
}