Power Platform でメーリングリスト作成申請を自動化してみる


# はじめに

Microsoft 365 を導入している組織では、Teams のチーム作成、ゲストユーザー招待、メーリングリストの作成といった作業を申請ベースで受け付けて処理している場合が多いかと思います。

これらの業務は、Power Platform を活用することで自動化が可能です。
今回はその一例として、メーリングリスト作成申請業務を Power Platform で自動化する方法をご紹介します。

# アプローチ考察

個人的に、メーリングリスト作成含め、Power Platform で Micrsoft 365 関連の運用業務を自動化する場合、
Microsoft Graph で API が存在するかを確認しています。

https://learn.microsoft.com/ja-jp/graph/api/resources/groups-overview?view=graph-rest-1.0&tabs=http

当然出来るものと思っていたのですが、リファレンスを見ると、Microsoft 365 グループだといけるのですが、メールが有効なセキュリティグループは Microsoft Graph では作成できないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/a731688f-025b-0e38-110e-bf47eb6bb625.png)

実際にテストしてみると、以下のようなエラーで失敗します。この辺は Exchange Online との関係性もあるのかもしれないですが、個人的には Microsoft Graph で作成出来てほしかったです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/3ccb6845-dae3-81fd-3e51-178136d866fa.png)

そのため、Exchange Online 側に対してリクエストするアプローチが考えられます。大分前に書いた以下の記事のように、Azure Automation との連携になりそうです。

https://qiita.com/Takashi_Masumori/items/0662d54d35cee57d64d2

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/6e7be266-4f4c-363b-47b3-c626dea13975.png)

こちらのアプローチについて深堀していきます。

# 全体像

構成部品の全体像は以下のような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/7bf13a92-f4ce-097e-0852-69976b8934d7.png)

例えば、申請用のアプリは以下のような感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/3b0b1cd7-94b7-4371-240d-0f0955148ff7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e9772f65-65de-9443-074b-095a6449199b.png)

技術的にコアな部分は以下の 2 つです。それぞれについて詳しく説明します。

* Azure Automation で Exchange Online PowerShell を無人実行する
* Power Automate から Azure Automation を利用する

# Azure Automation で Exchange Online PowerShell を無人実行する

まず、ずいぶん前に Exchange Online の PowerShell は基本認証が廃止されたため、こちらを参考に証明書ベースで認証するようにしました。

https://learn.microsoft.com/ja-jp/powershell/exchange/app-only-auth-powershell-v2?view=exchange-ps#step-5-assign-microsoft-entra-roles-to-the-application

Azure Automation では、証明書を共有リソースとして追加でき、PowerShell から利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/36ac43db-30bf-48a3-e18c-52a6d0ed2891.png)

そして、Azure Automation から Exchange Online 管理シェルを実行するためにモジュールをインポートします。最初ランタイムバージョン 7.2 をインポートしたのですが、何度やっても上手くいかんかったため、最終的に、5.1 にしました。依存関係のあるモジュールもすべて 5.1 のものをインポートする必要があるため、ここでちょっとはまりました。。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/2957f475-b12f-94a5-63bc-fa5b3bd9f6ba.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e93f7cd8-3bf3-4b31-3679-afdf514bee28.png)

PowerShell 用の Runbook を作成し、そちらにコードを書きます。追加した証明書を選ぶとコードを追加できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/b3d1f4ad-379e-7453-96db-d65abf0f01a3.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/4ac07b99-4332-116b-1c7e-cc8c13875d86.png)

```
param(
    [Parameter(Mandatory=$true)]
    [string]$DisplayName,
    [Parameter(Mandatory=$true)]
    [string]$Alias,
    [Parameter(Mandatory=$true)]
    [string]$PrimarySmtpAddress,
    [Parameter(Mandatory=$true)]
    [string]$OwnerAddress,
    [Parameter(Mandatory=$true)]
    [array]$MemberEmails # メンバーのメールアドレスを受け取る
)

$ErrorActionPreference = "Stop"

# Exchange Online PowerShellに接続

$cert = Get-AutomationCertificate -Name 'ExchangeCert'
$appId = "*****"
$orgName = "*****.onmicrosoft.com"

Write-Host "Exchange Online PowerShellに接続しています..."

Connect-ExchangeOnline -appid $appId -certificateThumbprint $cert.thumbprint -organization $orgName

try {
    # メールが有効なセキュリティグループの作成
    Write-Output "メールが有効なセキュリティグループを作成しています: $DisplayName"
    $group = New-DistributionGroup -Name $DisplayName -Alias $Alias -PrimarySmtpAddress $PrimarySmtpAddress -Type Security -ManagedBy $OwnerAddress

    # 作成したグループのIDを取得
    $groupId = (Get-DistributionGroup -Identity $group.Alias).ExternalDirectoryObjectId
    Write-Output "グループが正常に作成されました。グループID: $groupId"

    # グループにメンバーを追加
    foreach ($email in $MemberEmails) {
        Write-Output "メンバーを追加しています: $email"
        Add-DistributionGroupMember -Identity $group.Alias -Member $email -BypassSecurityGroupManagerCheck
    }
    Write-Output "すべてのメンバーが正常に追加されました。"

} catch {
   
    $ErrorMessage = $_.Exception.Message
    Write-Output "Error Occurred: Message: $ErrorMessage"

    # ジョブが Failed になるようにする
    throw "Runbook failed with error: $ErrorMessage"

} finally {
    # Exchange Online PowerShellから切断
    Disconnect-ExchangeOnline -Confirm:$false
    Write-Host "Exchange Online PowerShellから切断しました。"
}


```

テストウインドウからテストしましょう。上手く動きました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/46467798-cd2b-0ed3-83ff-76943146ac3a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/bd5f8cd3-724d-73e8-693e-159c0de86be5.png)

ちなみに、失敗したときは以下のような感じでエラーメッセージが出力されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/f397d4c5-6ac5-2a35-b1ca-e4eef5909d90.png)

ここまでで Azure Automation 側の準備が出来ました。

# Power Automate から Azure Automation を利用する

まず、PowerAutomate の全体像は以下のような感じです。今回は、あくまでテストのため承認プロセスは入れていませんが、必要に応じて入れてあげてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/c3f641d3-0bfd-633f-4224-e27ab9f69fa2.png)

申請があったら、メンバー一覧を取得します。メンバー一覧は配列情報を渡します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/de001ee2-60ca-d23e-0315-fd4c86cf57c5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e1d20c51-7bdd-a54d-708e-568c8734667d.png)

ジョブの状態で結果を判定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/d0e4877c-0e92-cb45-178c-4a069f98d656.png)

最初、実際にはコマンドの実行に失敗し、グループの作成に失敗しているのですが、ジョブの状態が Failed ではなく、Completed になってしまい、色々上手くいかなかったのですが、以下を入れることで、コマンドの実行に失敗した際、Failed になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/5c78d61c-c8cd-07f8-4541-0beed8771968.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/13bf4d12-44a0-91b2-73cc-8899df98b5c5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/5f84546d-b4b9-0d76-a3d3-818ed8f32773.png)

こちらで上手く連携できました。

# まとめ

今回は、Power Platform を活用し、Azure Automation を経由して Exchange Online に PowerShell 接続し、メーリングリスト作成申請を自動化するアプローチをご紹介しました。

運用業務によっては、Exchange Online への PowerShell 接続が必要となる場合もあります。このようなシナリオにおいて、本アプローチが業務効率化に役立つ可能性があります。

ちなみに、以下を見る限り、相当な時間動かさなければ費用は発生しなさそうです。

https://azure.microsoft.com/ja-jp/pricing/details/automation/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/4ace9ba0-90ff-508c-6bef-82bd6322722b.png)