SaaS

Intuneの管理者テンプレートをMicrosoft Graph APIを利用しようと思ったらすごく沼ったのでその経緯をまとめてみた

こんにちは、臼田です。

みなさん、Intuneと戯れてますか?(挨拶

今回はタイトルのように、Microsoft Graph APIを使ってIntuneの管理者テンプレート(Administrative Templates)の情報を取得しようとしたらすごく大変だったので、その大変さを伝えるべく経緯も踏まえてどうやって取得したかを説明します。

結論が速く必要な方は、お手数ですがババっと下の方まで行ってください。私の苦労に「うんうん、わかるわかる」とか「いや〜これは大変だわ〜」と共感したい方は順にお読みください。

なお、私はMicrosoft IntuneもMicrosoft Graph APIも初心者なので、もっとうまいやり方とか良いドキュメントをご存じの方がいたら教えてください。

概要

Microsoft Intuneを設定するとき、みなさんはどのように行っていますか?Microsoft Intune管理センターはGUIでわかりやすくIntuneが管理できますので、多分GUIで行う事が多いのではないでしょうか?

でも、機械的に何かをチェックしたり突き合わせたり処理を自動化したいなーというときはAPIを利用したくなります。そんな時にMicrosoft Graph APIを使うと便利です。

今回はIntuneの各種設定をMicrosoft Graph APIを利用して取得して、そのあとゴニョゴニョしようと思っていた際に起きた出来事をまとめています。

主にデバイスの構成プロファイルなどを対象としています。

構成プロファイルを取得してみる

一口に構成プロファイルと言っても、いろんなプロファイルの種類がありますよね。以下はその一部です。

Intune上で一緒に表示される設定ですが、Microsoft Graph APIからすると違うものの扱いのようです。

「デバイスの制限」と「Endpoint Protection」をMicrosoft Graph APIから取得してみます。これはdeviceConfigurationに該当します。一覧(List)での取得方法はこちらにドキュメントがあります。ちなみにbeta APIなので、サポートされていないことに注意してください。GAされているv1.0のAPIもあるのですが、どうやらすべての処理には対応していないようです。

Microsoft Graph APIを試すには、Graph Explorerが非常にイケていて良いです。アクセスしたら右上のとこからサインインしましょう。

クエリのバージョンをbetaとし、URLに/deviceManagement/deviceConfigurationsを補完して入れます。ドキュメントの「HTTP 要求」にある内容を参考にします。すると以下のようにレスポンスが返ってきます。

「デバイスの制限」と「Endpoint Protection」はこの一覧での取得で一通りの設定値まで返ってくるので何も困りません。

問題は管理者テンプレートです。

管理者テンプレートを取得してみる

それでは、管理者テンプレートはどうやって取得するのでしょうか?いろいろ調べるとgroupPolicyConfigurationリソースとして取得可能なようでした。というわけでドキュメントに従ってListで取得してみましょう。

/deviceManagement/groupPolicyConfigurationsにGETしてみます。

管理者テンプレートの一覧は取得できましたが、なんだか様子が変です。圧倒的に量が少ない…。

どうやら管理者テンプレートの中身の値は取得できないようです。

どうやって取得するのか迷っていたところ、groupPolicyConfiguration resource typeのドキュメントのRelationshipsというところに、groupPolicyDefinitionValueというリソースが載っていました。

もしかしてこれでは?と思い、このリソースの一覧の取得方法をドキュメントで確認します。GET /deviceManagement/groupPolicyConfigurations/{groupPolicyConfigurationId}/definitionValuesとありますので、先程取得したIDも添えて、Graph Explorerからクエリしてみましょう。

すると正常に処理され、何やら4つのvalueレスポンスが返ってきました。今回管理者テンプレートには、スクリーン セーバーに関する4つの設定を入れていたので、なんだかそれっぽいです!

しかし、またもや中身がありません。どうすればいいのでしょうか?

さらに奥底を探索してみる

まずはさっきと同じようにドキュメントとにらめっこします。するとここにもRelationshipsがあり、groupPolicyPresentationValuegroupPolicyDefinitionがあります。PresentationはなんだかよくわかりませんがDefinitionは定義なのでさっきのdefinitionValuesの値の定義がありそうですね。

というわけでgroupPolicyDefinitionのドキュメントにやってきました。ここにはListがなくGetしか説明がありませんでした。

GET /deviceManagement/groupPolicyDefinitions/{groupPolicyDefinitionId}と書いてありますが、そもそもgroupPolicyDefinitionIdもわかりませんので、試しにListっぽくリクエストしてみるとうまくいきました。

めちゃくちゃ大量にレスポンスが返ってきて時間も少しかかったのですが、なにやら各種設定の定義がありそうな予感。⌘+Fで検索してみるとスクリーンセーバーの設定がありました!

しかしよく眺めると、groupPolicyDefinitionという名前だけあって当然定義だけです。さっきのdefinitionValuesgroupPolicyDefinitionを紐付ける情報はどこにあるのでしょうか?

行き詰まったのでさっきわからなかったgroupPolicyPresentationValueを確認してみます。説明文は「単一のグループ ポリシー プレゼンテーションの値を格納する基本プレゼンテーション値エンティティ。」と全くなんのことかわかりませんが、取得してみます。

groupPolicyPresentationValueの一覧GET /deviceManagement/groupPolicyConfigurations/{groupPolicyConfigurationId}/definitionValues/{groupPolicyDefinitionValueId}/presentationValuesで取得します。先程のクエリにさらに個別のgroupPolicyDefinitionValueIdを追加しつつクエリします。

すると何やら値が取れました!この600という値はおそらく、スクリーンセーバーのタイムアウトの値!取得する方向はまちがっていなかったと思われます。しかしこれは推測に過ぎません。実際にどうやったらこのgroupPolicyPresentationValuegroupPolicyDefinitionを紐づければいいのでしょうか?

わからないので、一旦groupPolicyPresentationを取得してみます。GET /deviceManagement/groupPolicyConfigurations/{groupPolicyConfigurationId}/definitionValues/{groupPolicyDefinitionValueId}/presentationValues/{groupPolicyPresentationValueId}/presentationとあるので先程のクエリのさらに派生です。

どうやらこれはスクリーンセーバーのタイムアウトの設定値の定義のようです。デフォルトの値や最小・最大の値、値の名前まであります。設定の定義に対する値がPresentationと考えれば良さそうです。

して、結局どうやってgroupPolicyPresentationValuegroupPolicyDefinitionを紐づければいいのでしょうか?

ODataの取得方法を知る

わからないまま参考になるコードがないか彷徨っていたところ、powershell-intune-samplesAdministrative Templatesの何やら気になる処理を見つけました。ここにはdeviceManagement/groupPolicyConfigurations?`$expand=assignmentsと書かれており、先程やった/deviceManagement/groupPolicyConfigurationsに対するクエリと異なる値を取得しようとしている様子。この記述方法について調べたところ、OData(Open Data Protocol)のクエリオプションであるとのこと。

$expandは取得する情報に紐づいた情報を一緒に取得する記述で、先程の記述はAdministrative Templatesのアサイン状況を拡張して取得するようでした。

これはgroupPolicyConfiguration resource typeのところのRelationshipsに記述されている値をexpandしているため、そこに書かれているdefinitionValuesも取得できるのでは?というわけでやってみます。

取れませんでした。

しかしめげずに他のものも試してみます。今度はdefinitionValuesからexpandしてみます。

なんと、先程のexpandがない状態では、4つのvalueレスポンスだけでほぼidのみだったレスポンスが、その定義も添えて返ってきました。私が求めていたものはこれです!なんでexpandしないと見れないのだ…。

ちなみにここではRelationshipsにpresentationValuesもありこれもexpandしてみたのですが(カンマ区切りで記述するか*で取得できますが)何故かこちらも中身がありませんでした。どれがexpandできてどれができないかはやってみないとわからないですね。

結論

というわけで、Microsoft Graph APIを使ってIntuneの管理者テンプレート(Administrative Templates)の情報を取得するには、

  • /deviceManagement/groupPolicyConfigurationsgroupPolicyConfigurationIdの一覧を取得し
  • /deviceManagement/groupPolicyConfigurations/{groupPolicyConfigurationId}/definitionValues?$expand=definitionで関連するdefinitionValuesの定義と設定の一覧を取得し
  • /deviceManagement/groupPolicyConfigurations/{groupPolicyConfigurationId}/definitionValues/{groupPolicyDefinitionValueId}/presentationValuesでその設定の値を取得する

という手順で良さそうでした。

いやー難しい。これを見つけるまでにここにはない試行錯誤もいろいろ試しています。これでもわからないところがたくさんあるので、詳しいドキュメントとか知っている方いたら教えてください。

まとめ

今回は以下2つの教訓が得られました

  • ドキュメントとひたすらにらめっこすれば答えが見つかる(こともある)
  • Relationshipsにあるものはexpandで取れる(こともある)

しかし、大前提としてもう一度書きますが、Microsoft Graph APIのbeta APIはサポートされるものではないため注意してください。私が確認した限りでは、このような方法でv1.0 APIではAdministrative Templateの情報は取得できませんし、他の取得方法も見当たらなかったため、v1.0で取得する方法は無いと思います。

ちゃんとサポートされたAPIの提供が待ち遠しいですね。

臼田 佳祐

AWSとセキュリティやってます。普段はクラスメソッドで働いてます。クラウドネイティブでは副業としてセキュリティサービスの検証とかやってます。