[GAS]Microsoft Graphを利用してデバイス名に紐づいたユーザー情報を取得

2022.08.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

  • t_o_dと申します。
  • AzureADでのデバイス管理の際に、Graph APIを利用すると容易に情報を取得することができます。
  • そこでGASを利用してデバイス一覧シートに各種紐づいたユーザー名とメールアドレスを取得してシートに追加する方法を記録いたします。

結果

  • 今回は以下のデバイス一覧シートに、各デバイスに紐づいた「ユーザー名とメールアドレス」を追加していきます。

  • 実行すると存在する「XXXXX」デバイスに紐づいたユーザー名とメールアドレスが2列目以降に追加されます。
    • 「存在しない」デバイスにはnullを入れています。

環境

  • mac OS Monterey 12.2
  • Google Apps Script

準備

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

手順

スプレッドシート作成

  • 新規でスプレッドシートを作成して、以下のような内容にしてください。
    • ※デバイス名は各環境に合わせてください。

  • その後、シート内の「拡張機能」タブから「Apps Script」でスクリプトエディタを開いてください。

プロパティ設定

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

コード記述

  • プロパティ設定後、以下の内容をスクリプトエディタの任意のgsファイルに記述。
const baseApi = 'https://graph.microsoft.com/v1.0'
const properties = PropertiesService.getScriptProperties().getProperties();

function main() {
  // シート情報
  const sheetId = properties.SHEET_ID
  const spread = SpreadsheetApp.openById(sheetId);
  const sheet = spread.getSheetByName('シート1')
  const sheetValues = sheet.getDataRange().getValues()
  let insertValues = [['ユーザー名','メールアドレス']]

  // Graph情報
  const token = getToken()
  const devices = getDevices(token)

  // 1行ずつ登録ユーザー取得処理
  sheetValues.forEach((v,i) => {
    if(i === 0) return
    const deviceConf = devices.filter(device => device.displayName === v[0])
    const deviceId = deviceConf?.length ? deviceConf[0].id : '';
    if(deviceId === ''){
      insertValues.push(['null', 'null'])
      return
    }
    const users = getRegisteredUser(token, deviceId)
    insertValues.push([users[0].displayName,users[0].mail])
  })

  // シートに値追加
  sheet.getRange(
    1,
    2,
    insertValues.length,
    insertValues[0].length
  ).setValues(insertValues);
}

// 認証トークン取得
function getToken(){
  // 認証情報
  const authApi = 'https://login.microsoftonline.com'
  const clientId = properties.CLIENT_ID // クライアントID
  const clientSecret = properties.CLIENT_SECRET // クライアントシークレット
  const tennantId = properties.TENNANT_ID // テナントID

  // トークン取得
  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
}

// Graph上に登録されたデバイス一覧取得
function getDevices(token){
  let result = [];
  let link = `${baseApi}/devices?$select=id,deviceId,displayName&$top=999`;
  do {
    const res = UrlFetchApp.fetch(link,{
      method: 'get',
      headers: {
        'Authorization': `Bearer ${token}`,
      },
    })
    const json = JSON.parse(res.getContentText());
    result = [...result, ...json.value];
    // 999件超えていたらページング
    link = json['@odata.nextLink'] ?? '';
  }while(link)

  return result
}

// 登録ユーザー情報取得
function getRegisteredUser(token, deviceId){
  const res = UrlFetchApp.fetch(`${baseApi}/devices/${deviceId}/registeredUsers`, {
    method: 'get',
    headers: {
      'Authorization': `Bearer ${token}`,
    },
  });
  const json = JSON.parse(res.getContentText());
  return json.value;
}

実行

  • コード記述後、main関数を実行して、スプレッドシートが以下の内容となることを確認する。

  • 以上です。

まとめ

  • デバイスとユーザーの紐付けは情報の参照において重要であるが、GASとGraph APIを利用すれば簡単に行うことができると実感しました。
  • 今後もMicrosoft Graphのさまざまなサービスを適宜利用していき、日々の業務改善に努めてまいります。

参考

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

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