[GAS]Microsoft Graphを利用してAzure管理上のMacのMDM情報を取得

2022.10.31
  • t_o_dと申します。
  • AzureADでのデバイス管理の際に、Graph APIを利用すると容易に情報を取得することができます。
  • そこでGASを利用して、Azure上で管理されている指定のMacのPCのMDM情報(Jamf等)を取得する方法を記録いたします。

環境

  • mac OS Monterey 12.6
  • Google Apps Script

準備

  • Graph API認証のため以下の値を公式サイトこちらの記事を参考に取得してメモしておいてください。
    • client_id : クライアントID
    • client_secret : クライアントシークレット
    • tennant_id : テナントID

手順

スクリプトエディタ起動

  • Googleドライブを開き、新規で「Google Apps Script」を作成してスクリプトエディタを起動してください。

プロパティ設定

  • スクリプトエディタを開いたら、スクリプトプロパティに上記でメモした内容を以下のように設定してください。
プロパティ
CLIENT_ID 上記でメモしたクライアントID
CLIENT_SECRET 上記でメモしたクライアントシークレット
TENNANT_ID 上記でメモしたテナントID

コード記述

  • プロパティ設定後、以下の内容をスクリプトエディタの任意のgsファイルに記述してください。
    • ※一部Beta版APIを利用しているため、ご利用の際は十分にご検討ください。
const baseApi = 'https://graph.microsoft.com/v1.0'
const betaApi = 'https://graph.microsoft.com/beta'
const authApi = 'https://login.microsoftonline.com'
const properties = PropertiesService.getScriptProperties().getProperties()

function main(){
  const token = getToken();
  const deviceName = '対象MacPC名';
  const deviceId = getDeviceId(token, deviceName);
  const managedDevice = getManagedDevice(token, deviceId);

  console.log(`デバイス管理 : ${managedDevice.managementAgent}`)
  console.log(`プラットフォーム : ${managedDevice.deviceType}`)
}

function getToken(){
  // 認証情報
  const clientId = properties.CLIENT_ID // クライアントID
  const clientSecret = properties.CLIENT_SECRET // クライアントシークレット
  const tennantId = properties.TENNANT_ID // テナントID

  // トークン取得
  try {
    const res = UrlFetchApp.fetch(`${authApi}/${tennantId}/oauth2/v2.0/token`,{
      method: 'post',
      payload: {
        'client_id': clientId,
        'scope': 'https://graph.microsoft.com/.default',
        'client_secret': clientSecret,
        'grant_type': 'client_credentials'
      }
    })
    const json = JSON.parse(res.getContentText());
    return json.access_token;
  }catch(err){
    throw new Error('トークン取得エラー');
  }
}

// デバイス情報取得
function getDeviceId(token, deviceName){
  try {
    const res = UrlFetchApp.fetch(`${baseApi}/devices?$filter=displayName eq '${deviceName}'&$select=id,deviceId`, {
      method: 'get',
      headers: {
        'Authorization': `Bearer ${token}`,
      },
    });
    const json = JSON.parse(res.getContentText());
    return json.value[0].deviceId;
  } catch (err) {
    throw new Error('デバイスID取得エラー');
  }
}

// 管理情報取得
function getManagedDevice(token, deviceId){
  try {
    const res = UrlFetchApp.fetch(`${betaApi}/deviceManagement/managedDevices/${deviceId}`,{
      method: 'get',
      headers: {
        'Authorization': `Bearer ${token}`,
      }
    })
    return JSON.parse(res.getContentText());
  } catch(err){
    throw new Error('管理情報取得エラー');
  }
}

実行

  • コード記述後、8行目の「対象MacPC名」を任意のPC名に修正します。
  • 修正後、main関数を実行して実行ログを確認します。
  • 例としてMDMにJamfを利用しているPCであれば、ログが以下となれば正常です。

  • 以上です。

まとめ

  • 今後もMicrosoft Graphのさまざまなサービスを適宜利用していき、日々の業務改善に努めてまいります。

参考

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。