Microsoft Graph で MAPI プロパティを取得する

Microsoft Graph で標準的に取得できるアイテムのプロパティは、Microsoft Graph で用意されているものだけです。例えばメールを表す message では以下のページにプロパティが書いてあります。

message resource type
https://docs.microsoft.com/en-us/graph/api/resources/message?view=graph-rest-1.0

この一覧にない情報であっても、拡張プロパティとして取得することが可能です。Property Set によって取得方法が少し異なるので、例としてメッセージ クラスの取得の仕方と CleanGlobalObjectId の取得の仕方を紹介します。

メッセージ クラス

IPM.Note のような、アイテムのメッセージ クラスを取得するには以下のようなリクエストをします。

GET https://graph.microsoft.com/v1.0/me/messages?$expand=singleValueExtendedProperties($filter=id eq 'String 0x001A')&$select=subject

ここでは拡張プロパティの ID の指定として、”{type} {proptag}” 形式を使用しています。メッセージ クラスを表す MAPI プロパティは PidTagMessageClass で、これは Common の Property Set (Area) の文字列型の 0x001A となるので、このようなリクエストになります。MFCMAPI でプロパティを見ると以下のようになっています。

PidTagMessageClass Canonical Property
https://docs.microsoft.com/en-us/office/client-developer/outlook/mapi/pidtagmessageclass-canonical-property

CleanGlobalObjectId

予定表アイテムの CleanGlobalObjectId (Clean Global Object ID) を取得するには以下のようなリクエストをします。

GET https://graph.microsoft.com/v1.0/me/calendar/events?$expand=singleValueExtendedProperties($filter=id eq 'Binary {6ED8DA90-450B-101B-98DA-00AA003F1305} Id 0x0023')&$select=subject

ここでは拡張プロパティの ID の指定として、”{type} {guid} Id {id}” 形式を使用しています。CleanGlobalObjectId を表す MAPI プロパティは PidLidCleanGlobalObjectId で、これは PSETID_Meeting の Property Set のバイナリ型の 0x0023 となるので、このようなリクエストになります。MFCMAPI でプロパティを見ると以下のようになっています。

PidLidCleanGlobalObjectId Canonical Property
https://docs.microsoft.com/en-us/office/client-developer/outlook/mapi/pidlidcleanglobalobjectid-canonical-property

ちなみに取得できる値は Base64 エンコードされたバイナリ値なので、以下のようにすれば iCalUId のような 16 進数ベースの文字列に変換できます。(Microsoft Graph の iCalUId は Clean じゃない方の GlobalObjectId になっています。)

$original="BAAAAIIA4AB0xbcQGoLgCAAAAACAfVYIHprVAQAAAAAAAAAAEAAAADFhMMGhCTxEi7gYjhazW4M="
$byte = [System.Convert]::FromBase64String($original)
$buf = ""
foreach($a in $byte)
{
    $buf += $a.ToString("X2")
}
Write-Output $buf