のいのログ

Power AutomateでTeamsの共有チャネルにメンバーを追加する方法

Power AutomateにはTeamsコネクタには、「チャネルにメンバーを追加する」アクションがありません。

通常のチャネルであればチーム内のメンバーは自由にアクセスできるため特に問題ありませんが、プライベートチャネルと共有チャネルはメンバーの管理が必要です。

今回はMicrosoft Graph APIとPower Automateを組み合わせて、共有チャネルにメンバーを追加する方法をご紹介します。

この記事で紹介するフローではプレミアム コネクタを使用するため、実装にはPower Automate プレミアムライセンスが必要です。

目次(クリックでジャンプできます)

Graph APIからの共有チャネル操作

共有チャネルにメンバーを追加する方法

Graph APIにはプライベートチャネルや共有チャネルにメンバーを追加するエンドポイントが用意されています。

URI
POST https://graph.microsoft.com/teams/{team-id}/channels/{channel-id}/members
Request Body
{
    "@odata.type": "#microsoft.graph.aadUserConversationMember",
    "roles": ["owner"],
    "user@odata.bind": "https://graph.microsoft.com/v1.0/users('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')"
}

user@odata.bindのIDには、Entra IDのObject IDを指定します。

共有チャネル作成時にはアクセスした本人のみ追加可能

ちなみにGraph APIから共有チャネルを作成することもできます。

HTTP
POST https://graph.microsoft.com/teams/{team-id}/channels
Request Body
{
  "displayName": "共有チャネル名",
  "description": "",
  "membershipType": "shared",
  "members": [
    {
      "@odata.type": "#microsoft.graph.aadUserConversationMember",
      "user@odata.bind": "https://graph.microsoft.com/v1.0/users('xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')",
      "roles": [
        "owner"
      ]
    }
  ]
}

しかし、このときのメンバー追加には制限があります。

  • 要求を送信した本人1人のみ
  • 絶対に所有者(owner)に指定

membersが配列になっていることから複数人追加もできそうな雰囲気はありますが、2人以上記述するとエラーになり、メンバー追加のみならずチャネルの作成も行われません。

かつてはmembersに自分を記述せずに、別のユーザー1人のみを指定することで、自分+1人の合計2人までの所有者を追加できたという情報もありましたが、私が試した限りではできませんでした。

Teamsコネクタの「Microsoft Graph HTTP 要求を送信する」では不可

Power AutomateにはTeamsコネクタの「Microsoft Graph HTTP 要求を送信する」アクションがありますが、チャネルのメンバー追加・削除には対応していません。

この「Microsoft Graph HTTP 要求を送信する」アクションはGraph APIのTeamsリソースにアクセスできるものですが、実はTeamsに関係するすべての権限を有しているわけではありません。

POST /teams/{team-id}/channels/{channel-id}/membersにはChannelMember.ReadWrite.GroupまたはChannelMember.ReadWrite.All権限が必要ですが、あらかじめ用意されている「Microsoft Graph HTTP 要求を送信する」はこの権限を有していません。

有していない権限が必要な処理を実行しようとすると、以下のようなエラーが出力されます。

Scopes on the requestのあとに続くのが「Microsoft Graph HTTP 要求を送信する」が有している権限の全てです。ここに書かれていない権限が必要なアクションは、Teams関係であっても実行することができません。

HTTP with Microsoft Entra ID (事前承認)でも不可

もう一つGraph APIにリクエストを送信できるコネクタに、「HTTP with Microsoft Entra ID (事前承認)」がありますが、こちらでも不可です。

「HTTP with Microsoft Entra ID (事前承認)」は、このコネクタに対してMicrosoftがあらかじめ持たせている権限の範囲内でしかGraph APIのアクションを実行できません。

付与されている権限は公開されていないらしいです。とりあえずアクセスして試すほかないって感じですかね…。

【解決法】Entraアプリ+HTTPコネクタ

Microsoftによって用意されたアクションで対応できないGraph APIのエンドポイントにアクセスする場合は、

  • Entraに必要な権限を持ったアプリを作成
  • HTTPコネクタでアプリのシークレットキーを持たせたリクエストを飛ばす

という対応が必要です。

Entraアプリを登録する

アプリを新規作成する

Entra管理センターでアプリを登録します。

既定の設定ではEntra管理者でなくてもアプリケーションの登録は可能です。しかし、テナント管理者によってはアプリケーションの登録が制限されていたり、Entra管理センターのアクセス自体に禁止されていたりします。その場合は、管理者に相談しましょう。

[アプリの登録] → [新規登録]の順にクリックします。

表示名を入力し、サポートされているアカウントの種類は「この組織ディレクトリのみに含まれるアカウント」を選択して登録します。

APIのアクセス許可を追加する

アプリが作成されたら、[APIのアクセス許可]を開きます。

初期状態では「User.Read」が自動で付与されていますが、今回は使用しないため削除します。

削除したら[アクセス許可の追加] をクリックします。

[Microsoft Graph] を選択します。

アプリケーションに必要なアクセス許可の種類は、「アプリケーションの許可」を選択します。

追加する権限にチェックを入れていきます。

今回はChannelMember.ReadWrite.Allが必要なので、検索してチェックを入れ、[アクセス許可の追加] をクリックします。

アクセス許可に管理者の同意を与える

アクセス許可を追加しただけではダメで、実際に機能させるには管理者の同意を与える必要があります。

作成者自身がEntra管理者であれば問題ありませんが、通常ユーザーの場合はアプリケーションの登録自体は許可されていても、Entra管理者による同意は絶対に必要なります。登録が終わったら、Entra管理者に同意を付与してもらうようにお願いしましょう。

自身がEntra管理者であれば、管理者の同意を与えるボタンを押すことができる
一般ユーザーは管理者の同意を与えることができず、権限を有効化できない

シークレットを作成

次にシークレットを作成します。

[証明書とシークレット] を開き、新しいクライアント シークレットを発行します。

シークレットの有効期限は最大で730日(2年)です。仮にカスタムを選択しても、2年以内の期間しか設定できないようになっています。

シークレットを発行したら「値」を控えます。

シークレットの値は、今のセッションが終了する(ブラウザのタブやウィンドウを閉じる)と確認できなくなるので注意です!

最後に概要ページに戻って、「アプリケーション (クライアント) ID」と「ディレクトリ (テナント) ID」も控えます。

Power Automateフローを作成する

必要な準備は揃ったので、Power Automateのクラウドフローを作成しましょう。

フローの全体図は以下のとおりです。

「チームの取得」・「チームの特定チャネルの詳細の取得」・「ユーザー プロフィールの取得 (V2)」はそれぞれのIDを取得するために使用します。

HTTPアクション

HTTPアクションでは、以下のようにパラメータを設定します。

URIhttps://graph.microsoft.com/v1.0/teams/@{outputs(‘チームの取得’)?[‘body/id’]}/channels/@{outputs(‘チームの特定チャネルの詳細の取得’)?[‘body/id’]}/members
MethodPOST
HeadersContentType: application/json
Body{
“@@odata.type”: “#microsoft.graph.aadUserConversationMember”,
“roles”: [
“owner”
],
“user@odata.bind”: https://graph.microsoft.com/v1.0/users/@{outputs(‘ユーザープロフィールの取得(V2)’)?[‘body/id’]}”
}

// rolesは空([])を指定すると、一般メンバーになります。
Authentication認証タイプActive Directory Auth
テナント「ディレクトリ (テナント) ID」を入力
対象者https://graph.microsoft.com
クラインアント ID「アプリケーション (クライアント) ID」を入力
資格情報の種類シークレット
シークレットシークレットの「値」を入力

フローの実行結果

フローを実行すると、「ユーザー プロフィールの取得 (V2)」で指定したユーザーが共有チャネルに所有者として追加されました。

追加するユーザーには「めと」を指定
フロー実行前のチャネルメンバーは「なつぐれ」一人のみ
フロー実行後に確認すると「めと」が所有者として追加されている

【まとめ】事前承認されていない権限を使ったGraph APIの操作は結構めんどくさい

事前に用意されたアクションを封じられると、チャネルにメンバーを追加するだけでこれだけのステップを踏まなくてはならないのが結構面倒くさいですね。

事前承認されたGraph APIの権限は、いずれのコネクタ・アクションにおいても公開されていません。そのため、Graph APIのアクセスはとりあえず試して、401や403などの権限系のエラーが発生したらEntraアプリを登録する、という手探りでやっていく他ないです。

Entraアプリの登録は面倒ですが、自動化するインパクトは大きいと思いますので、Power Automate プレミアムライセンスを持っている方はぜひ試してみてください。

シェアしていただけると嬉しいです!
  • URLをコピーしました!

この記事を書いた人

ローコード・RPAエンジニア。DX・業務効率化を専門に開発。

前職では鉄道運転士として働きながら、社内複業でSwift・Power Platformで業務効率化を推進していた。

応援する

コメント

コメントする

CAPTCHA


目次(クリックでジャンプできます)