[GAS]Jamf Pro APIを利用してデバイス名に紐づいたアプリケーション情報を取得

2022.08.26

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

  • t_o_dと申します。
  • Jamf Proでのデバイス管理の際に、Jamf Pro APIを利用すると容易に情報を取得することができます。
  • そこでGASを利用してデバイス一覧から各種インストールされているアプリケーションをデバイス毎にシートに書き出す方法を記録いたします。

結果

  • 以下のデバイス一覧シートから、各種インストールされているアプリケーション一覧をデバイス毎にシートに書き出していきます。

  • 実行すると存在する「XXXXX」デバイスに紐づいたアプリケーション一覧がシート毎に追加されていきます。
    • 「存在しない」デバイスはシートに追加されません。

環境

  • mac OS Monterey 12.2
  • Google Apps Script

準備

  • Jamf Pro APIを利用するためのアカウントを用意してこちらを参考に以下の権限を付与してください。
    • Read Computers

手順

スプレッドシート作成

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

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

プロパティ設定

  • スクリプトエディタを開いたら、スクリプトプロパティに以下の内容を設定してください。
プロパティ
JAMF_API_BASE Jamf API URL
例: https://xxxxxxx.jamfcloud.com/api/v1
JAMF_API_BASIC_TOKEN Jamfユーザー名:Jamfパスワード
例: ユーザー名がaaa、パスワードがbbbであれば「aaa:bbb」となる。

コード記述

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

function main(){
  const bearerToken = getBearToken()

  // シート情報
  const sheetId = properties.SHEET_ID
  const spread = SpreadsheetApp.openById(sheetId);
  const sheet = spread.getSheetByName('シート1')
  const sheetValues = sheet.getDataRange().getValues()

  // デバイス名ごとに取得してシート追加
  sheetValues.forEach((pcName,index) => {
    if(index===0) return
    const pcId = getPcId(bearerToken,pcName);
    // 存在しない場合はシート追加しない。
    if(pcId === '') return
    const pcApplications = getPcApplications(bearerToken,pcId);
    let insertValues = [['アプリケーション名','バージョン','サイズ(MB)']]
    pcApplications.forEach(app => {
      insertValues.push([app.name,app.version,app.sizeMegabytes])
    })
    const applicationSheet = spread.insertSheet()
    applicationSheet.setName(pcName)
    applicationSheet.getRange(1,1,insertValues.length, insertValues[0].length).setValues(insertValues);
  })
}

// Bearerトークン取得
function getBearToken(){
  const basicToken = Utilities.base64Encode(properties.JAMF_API_BASIC_TOKEN)
  const res = UrlFetchApp.fetch(`${baseApi}/auth/token`, {
      method: 'post',
      headers: {
          'Authorization': `Basic ${basicToken}`,
      },
  });
  const json = JSON.parse(res.getContentText());
  return json.token
}

// 端末名からPCのIDを取得
function getPcId(bearerToken,pcName){
  try {
    const res = UrlFetchApp.fetch(`${baseApi}/computers-inventory?filter=general.name==${pcName}`,{
      method: 'get',
      headers: {
          'Authorization': `Bearer ${bearerToken}`,
      },
    })
    const json = JSON.parse(res.getContentText())
    return json.results[0].id
  }catch(e){
    return ''
  }
}

// PCのIDからアプリケーション情報を取得
function getPcApplications(bearerToken, pcId){
  const res = UrlFetchApp.fetch(`${baseApi}/computers-inventory-detail/${pcId}`,{
    method: 'get',
    headers: {
      'Authorization': `Bearer ${bearerToken}`,
    }
  })
  const json = JSON.parse(res.getContentText())
  return json.applications
}

実行

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

  • 以上です。

まとめ

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

参考

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

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