Microsoft Graphを使ったプログラミングにまつわる苦労

Microsoft Graphを使い始める記事はいくつも出てくるのですが、込み入った使い方をしようとすると急に情報が少なくなる印象があるので、この記事を書いてみることにしました。

使い始める際の情報はこれらを見るとよいです

Microsoft Graph を使ってみた! – Livestyleクラウドサービス

www.youtube.com

シンプルな使い方

Microsoft Graphを使うにあたって、シンプルなタスクであればわりとすぐに使うことができます。Linuxなどからcurlコマンドライン経由で使えます。また、ワークフローに組み込んで、入ってきたデータに対してユーザーのグループ移動とかはシュッと作ることができます。userPrincipalNameを使ってidを取得して、そのユーザーのidと所属させたいグループのidの情報を渡してあげるだけです。curlで実行する際には、末尾の $ref が変数として認識されてしまわないようにシングルクォートで囲う必要があることに注意が必要です。

トークン取得処理 (xxxxx.onmicrosoft.comのxxxxxにはお使いのテナント名が入ります)

TOKEN=`curl -d "client_id=xxxxxxxxxxxxxx" -d "scope=https%3A%2F%2Fgraph.microsoft.com%2F.default" -d client_secret=xxxxxxxx -d "grant_type=client_credentials" -H "Content-Type: application/x-www-form-urlencoded"  -X POST https://login.microsoftonline.com/xxxxx.onmicrosoft.com/oauth2/v2.0/token | jq -r .access_token`

userPrincipalNameを使ってidを取得する処理

curl -H "Authorization: $TOKEN" -H "Content-Type: application/json" https://graph.microsoft.com/v1.0/users/<userPrincipalName>

learn.microsoft.com

グループへメンバーを追加する処理

curl -D- -XPOST -H "Authorization: $TOKEN" -H "Content-Type: application/json" -d '{"@odata.id": "https://graph.microsoft.com/v1.0/directoryObjects/<user id>"}' 'https://graph.microsoft.com/v1.0/groups/<group id>/members/$ref'

learn.microsoft.com

少し込み入った使い方

SDKまわり

仕事でMicrosoft 365のライセンス回りの棚卸しを行う必要がでてきました。ユーザー数 x ライセンス割り当て情報の数で、シンプルなタスクよりも扱う情報量が急に増えることになりました。 最初はMicrosoft GraphのHTTP APIを使い、AzureADのユーザー情報をJSONに出力して、jqを用いてライセンス割り当て状況に応じてグループ分けを行ってみました。ユーザー一覧のJSONファイルを手元に持つことになるうえに、jqでの検索が遅いという問題が出てきました。

では何かMicrosoft GraphのSDKを使おうとなり、私が使い慣れているRubySDKを検討したのですが、RubySDKは"Microsoft Graph Ruby client library is not actively supported"となっており悲しみにくれました。

learn.microsoft.com

github.com

大学の研究室にいたころや、就職したての頃はJavaを少し書いていましたが、Javaで書く気持ちになれず、JavaScriptは得意ではないし、などと考えた結局 .NET で実装してみることにしました。意外とできましたが苦労はありました。

認証まわり

Microsoft GraphをC#から使ううえで、どの認証ライブラリを使えばいいのか自信を持てませんでした。結局のところ、 Azure.IdentityとMicrosoft.Graphを組み合わせて使うことでうまくいきました。

またMicrosoft Graphは複数の認証方法をサポートしていますが、ドキュメントを読んでどの方法を使えばいいのか判断するのに苦労しました。

これを使えばよいことがわかりました learn.microsoft.com

最初にこのページを見ると、大変そうだしどれを使ったらいいかわからないので、そっとタブを閉じたくなってきます learn.microsoft.com

ライセンスまわり

ライセンスの棚卸しをしたいので、各ユーザーが使用しているライセンスを特定する必要があります。ここも苦労しました。EMS E3やE5などライセンスの種類がありますが、これらのライセンスはSkuIDが付与されています。最初はSkuIDで特定できることもわかりませんでしたし、下記ページを見つけられていなかったので、なんだこれはとなりました。以下ページ覚えておくと便利です。URLが変わってしまうかもしれないですが。 learn.microsoft.com

ユーザー情報にライセンス割り当ての属性(LicenseAssignmentStates)がありますが、ユーザーは複数のライセンスを持つ可能性があるうえに、SkuIDで識別されているので、よく使うSkuIDをハードコーディングする必要がありました。(今思えば別ファイルに切り出しておいても良かったかもしれないですね。

ライセンス割り当て方法に実は複数の種類があり、直接付与とグループによる割り当てがあります。LicenseAssignmentStatesのassignedByGroupというプロパティで取得することができます。AzureADの画面で、直接ライセンスを割り当ててしまうと直接となります。管理の観点からは、グループでのライセンス割り当てが望ましいので、これらを区別する必要がありました。そのため、各ライセンスが直接割り当てされているユーザーリストや、グループにより各ライセンスが割り当てられているユーザーリストを作成して棚卸しをしました。

紛らわしい話題

最後に紛らわしい話題だけどAD Graphは非推奨になっています。Microsoft Graphは便利なので廃止されないで残ってほしいです。

jpazureid.github.io

Google WorkspaceのユーザーをエクスポートしてAzureADにインポートする際のCSV変換スクリプトを書いた

面倒なので背景をすっ飛ばすけどGoogle WorkspaceのユーザーをAzureADにもっていきたいことありますよね。Google WorkspaceでエクスポートしたCSVをAzureADでインポートするだけですが、だけと言うには面倒なCSVのフォーマット変換処理が必要です。そのCSVフォーマット変換スクリプトRubyでチャッと書きました。

プログラミングができる人ならば、この処理はパッと書けると思うのでブログにするつもりはなかったのですが、情シス界隈でこれからプログラミングを学んでいこうという人とかのニッチな困りがあるかもしれないと思って書くことにしました。

Google WorkspaceからエクスポートしたCSVを各行ごとに処理し、AzureADのCSVインポートフォーマットに変更していくだけの適当なスクリプトを書きました。各自のパスワードをバラバラに作れるようにはできていないし、jobTitleやdepartmentは入ってないこと前提になっているし、usageLocationもJapan決め打ちでとてもアレだけどGoogle Workspaceに情報が入っていればそれを使うようにしてあげればいいですね。

ちなみに、Google WorkspaceのCSVフォーマットか、AzureADのCSVフォーマットのどちらかが変更されると使えません。

gist.github.com

このスクリプトの動作には、Google WorkspaceからエクスポートしてきたCSVと、AzureADのCSVインポートをしようとしたときのCSVテンプレートをダウンロードしてazuread_header.csvという名前で保存しておく必要があります。

CSVのヘッダーと、データが別の2ファイルから1つのCSVファイルを作る方法は以下の記事のyancyaさんによる技を使いました。

qiita.com

learn.microsoft.com

最近気がついたこと

自分の身体に関わることで、最近気がついたことがあった。メモしておく

  • 週一度スーパー銭湯に行くと、肩こりのレベルが下がる。月一度の鍼のときに痛いところが減ってて気がついた
  • お風呂でしっかり体をあたためておくと、一度のぬるめサウナと水風呂でもいい感じのすべてがどうでもよいあの状態になれることがわかった

経営って何なんですかね

かけだし経営者として、経営って何なのだろうと考えたところ「会社存続と運営の無限責任を負っている」というのが自分的にはしっくりくると思うようになった。

最終的な責任を負う立場ですね、というのはわかっていたのだが、この表現がしっくりきてからは従業員のときとの違いがじわじわとわかってきたと感じている。これは楽ではないぞ、と思ったので気が引き締まる思いだ

仕事ノートPCでWSL2使うのをやめた

仕事ノートPCのストレージ容量が足りなくて、仕事で使っているTeamsすらまともに起動しなくなってしまい困ってしまった。一番容量を食っていたWSL2のUbuntuを消し、別マシンのHyper-V上で動いているLinuxで開発などを行うことにした。こういうときにはデスクトップPCが便利だ

 

消すのはこれを参考にした

yanor.net

FPからもらったアドバイス

かつての上司であり、今の会社の社長がファイナンシャルプランナー通称FPの資格を持っており、独身時代に貯金なしだった僕にアドバイスをくれました。そのおかげで3年で150万程度金融資産を持つところまで育てることができました。(わりとゆっくりです)当時は本当にお金なくて車買うとか全く考えたことかありませんでした。今ではこの状況を脱していますが、同様の状況におかれている人に有用かもしれないので書き残しておきます。

 

  • 収支の図示でいくら使える、いくら無駄省けるかを把握し、改善につなげる
  • 投資や貯金は予算として確保して、給料日を起点として使うよりも前にお金が移動されるようにしておく
  • NISAやiDeCoといった制度は最大限活用する

 

この3つだったと思います。普通はまずファイナンシャルプランナーと知り合うところからやる必要があるので、自分はラッキーな境遇でした。

保険屋さんがファイナンシャルプランナー資格持ってるパターンもあると思いますが、ある会社の製品を担いでいないファイナンシャルプランナーと知り合ったのも良かった点でした。

投資については、月数百円の積立から始めました。お金の余裕がなくても数百円なら負担感なく始められました。

収支の図示は今でも収入や支出に変化があればやっています。マネーフォワードなどのサービスを使って把握するのもいいですね。

この記事がなにかの役にたてばうれしいです。