目次
GASとLogic Appsで実現する自動化の全体像
こんにちは!
Azureのユーザー管理者として、社員からパスワードリセットやユーザーの新規作成をお願いされることがよくあります。しかし、都度ログインしてパスワードを発行し、メールで対象者にお知らせする…という手作業が重なると非常に面倒です。ただ、セキュリティの観点から、ユーザー管理を社内で誰でも自由にできるようにするわけにもいきませんよね。
この「定型業務の自動化」という課題に対し、私は生成AI(Gemini)をパートナーとすることで、一つのツールを完成させることができました。
具体的には、Google Apps Script(以下、GAS)とAzure Logic Appsを連携させ、Googleフォームからメールアドレスなどを入力するだけで、ユーザー管理操作から対象者への通知までを一貫して自動化する仕組みを構築しました。
具体的なコード生成や複雑なAPIの呼び出し方、エラーチェックや権限設定に至るまで、Geminiと二人三脚で対話を重ねながら実装を進めました。本記事では、AIを味方につけることで、どのように自動化を実現したのか、その手順をご紹介します。
ツールの大まかな処理の流れとしては以下の通りです。
- メールにてパスワードリセットの依頼が届きます。
- Googleフォームにリセット対象のアカウントのメールアドレスと対象者の苗字を入力します。
- Googleスプレッドシートに入力内容が記録されGASが起動します。
- GASでランダムパスワードを生成し、そのパスワードをAzure Logic Appsに送信します。
- Azure Logic AppsがMicrosoft Entra ID(ユーザーを管理するサービス)にアクセスしパスワードをリセットします。
- その結果をGASに通知し、メールを対象者に送信します。管理者のもとには結果のログとしてメールが届きます。

Googleフォームの設定
Googleフォームの入力例は以下の通りです。必要に応じて、社内メールアドレスの形式に合致するよう、正規表現で入力値を制限するなどすると良いでしょう。
また、フォームの回答権限については他のAzure管理者のみにするなど、絞り込むようにしましょう。
- リセット対象者のメールアドレス
- 対象者に一時パスワードをメールで送信するために使います。
- リセット対象者の苗字
- 対象者にメールを送信する際の宛名に使います。

GASの設定
GASは、Google Workspace(スプレッドシートやフォームなど)の操作や自動化を、JavaScriptを用いて簡単に実現できるプラットフォームです。
そのGASを用いて、Googleフォームで入力した内容をAzure Logic Appsに転送します。
Googleフォームの回答記録先であるスプレッドシートを開き、拡張機能からApps Scriptを選択しましょう。
イベントの種類をフォーム送信時にすればGoogleフォームの入力内容送信時に動作します。

第三者がURLや実行履歴にアクセスできないよう、スプレッドシートとGASプロジェクトの編集・閲覧権限は、管理者(自分)のみに限定しましょう。コードは以下の通りです。
コードの細かな記述やパスワード生成のロジックは、Geminiに「こんな条件で作って」とリクエストして出してもらったものです。私は全体の設計や動作チェックに専念し、実作業はAIにお願いするというスタイルで進めました。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
// --- 設定値 --- const SCRIPT_PROPERTIES = PropertiesService.getScriptProperties(); const LOGIC_APPS_URL = SCRIPT_PROPERTIES.getProperty("LOGIC_APPS_URL"); const GROUP_EMAIL = SCRIPT_PROPERTIES.getProperty("GROUP_EMAIL"); /** * メイン処理:フォーム送信時に実行される関数 */ function sendToLogicApp(e) { // ■ フォームの項目を減らした前提の列番号 // [0]: タイムスタンプ // [1]: リセット対象者のメールアドレス (1問目) // [2]: リセット対象者の苗字 (2問目) var targetEmail = e.values[1]; var targetName = e.values[2]; if (!targetEmail || !targetName) { console.error("データ不足: " + JSON.stringify(e.values)); return; } // パスワード生成 var tempPassword = generateRandomPassword(); // Logic Appsへの送信 var payload = { "email": targetEmail.trim(), "target_name": targetName.trim(), "password": tempPassword }; var options = { "method": "post", "contentType": "application/json", "payload": JSON.stringify(payload), "muteHttpExceptions": true }; try { var response = UrlFetchApp.fetch(LOGIC_APPS_URL, options); var responseCode = response.getResponseCode(); if (responseCode === 200) { // 1. ユーザーへ通知 (パスワードあり) // 差出人はグループ、返信先もグループになります GmailApp.sendEmail( targetEmail, `【重要】パスワードリセットのお知らせ: ${targetName}様`, createUserMailBody(targetName, tempPassword), { from: GROUP_EMAIL, name: "Microsoftユーザーサポート" } ); // 2. グループへ実行ログ通知 (成功) GmailApp.sendEmail( GROUP_EMAIL, `【自動処理成功】パスワードリセット実行完了: ${targetName}様`, createAdminLogBody(targetName, targetEmail, "成功", responseCode), { from: GROUP_EMAIL } ); } else { throw new Error(`Logic Apps returned unexpected code. Code: ${responseCode}`); } } catch (err) { console.error("Error: " + err); // 3. エラー通知 GmailApp.sendEmail( GROUP_EMAIL, `【自動処理エラー】パスワードリセット失敗: ${targetName}様`, createAdminLogBody(targetName, targetEmail, "失敗", err), { from: GROUP_EMAIL } ); } } // --- ヘルパー関数 --- function generateRandomPassword() { const upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; const lower = "abcdefghijklmnopqrstuvwxyz"; const numbers = "0123456789"; let p = ""; // 1. 最初に英大文字1字 p += upper.charAt(Math.floor(Math.random() * upper.length)); // 2. 次に英小文字3文字 for (let i = 0; i < 3; i++) { p += lower.charAt(Math.floor(Math.random() * lower.length)); } // 3. その後半角数字4文字 for (let i = 0; i < 4; i++) { p += numbers.charAt(Math.floor(Math.random() * numbers.length)); } return p; } /** * パスワード生成関数 * パスワードリセットの時は英大文字1字+英小文字3字+半角数字4字で構成 * ユーザー作成の時は英大文字1字+英小文字3字+半角数字6字で構成 */ function createUserMailBody(name, password) { return `${name} 様\n\n` + `申請に基づき、アカウントのパスワードをリセットしました。\n` + `以下の新しい一時パスワードでサインインしてください。\n\n` + `--------------------------------------------------\n` + `新しいパスワード: ${password}\n` + `--------------------------------------------------\n\n` + `※サインイン後、必ずご自身でパスワードを変更してください。\n` + `※本メールに心当たりがない場合や不明点がある場合は、このメールへの返信にてご連絡ください。`; } // ログ用本文:「誰がやったか」の情報はなくなります function createAdminLogBody(name, email, status, detail) { return `自動パスワードリセット処理が実行されました。\n\n` + `--------------------------------------------------\n` + `実行日時: ${new Date().toLocaleString("ja-JP")}\n` + `対象者: ${name} (${email})\n` + `処理結果: ${status}\n` + `詳細情報: ${detail}\n` + `--------------------------------------------------`; }<code> |
設定が必要な変数は、以下の2つです。これらの値はGASのスクリプトプロパティに設定することで、コードの保守性を高められます。
- LOGIC_APPS_URL:Azure Logic AppsにアクセスするためのURLです。「Azure Logic Appsの設定」パートで作成する最初のステップ(トリガー)に表示される「HTTP POST の URL」の値を入力してください。
- GROUP_EMAIL:Azure管理者のグループメールアドレスです。アカウント操作後のメール送信に使います。
コード内のコメントにも記載していますが、Microsoft Entra IDのパスワードポリシーを満たす必要があるため、パスワード生成部分は不用意に変えないようにしましょう。
Azure Logic Appsの設定
Azure Logic Appsとは、Azureの「ワークフロー(業務の手順)」を視覚的に設定し、そのまま実行できるクラウドサービスです。
GUIベースでワークフローを構成することができます。今回、この設定に関してもGeminiに案を出してもらい、実行結果をフィードバックしながら現在の形にしていきました。
Azure Logic Appsの作成
まず、Azure Logic Appsを新規作成します。事前に、自身の環境で使用しているサブスクリプションを調べておくとスムーズです。
- ホームから、「Logic Apps」を検索して進んだ後、「create」をクリックし、「マルチテナント」を選択します。
- 自身の環境に合ったサブスクリプションを選択し、リソースグループは新規作成します。今回のリソースグループは「AzureUserAutomation」としました。
- ロジックアプリ名に今回作成するツールの名称を入れます。今回は「PasswordReset」としました(権限設定の際にこの名前を使います)。
リージョンには、「Japan East」を選択します。 - 「確認および作成」をクリックした後、画面が切り替わったら「作成」をクリックします。
- デプロイが終わったら「リソースに移動」をクリックします。

Azure Logic Apps本体の設定
今回の構成は以下の図のようになっています。

- トリガー(HTTP要求の受信)でGASから変数を受け取ります。
- 次に、HTTPコネクタを配置して、Microsoft Entra ID(Microsoft Graph API)に対してパスワード更新のリクエストを送信します。
- 実行結果に応じて、成功時には200、失敗時には500のステータスコードを返すよう構成します。
Azure Logic Appsには「Microsoft Entra IDコネクタ」が用意されており、ユーザー作成などの操作は「標準アクション」として簡単に選べます。
しかし、パスワードリセットの場合は、強引に標準アクションを組み合わせて構築しようとしても失敗してしまうので、必ず「HTTPコネクタ」を使いましょう。
パスワード更新のHTTPコネクタの設定は以下の通りです。


Graph APIを使ってパスワードを更新するため、HTTPアクションを以下のように設定します。
- Method (メソッド): PATCH(ユーザー情報更新のため)
- URI:
- https://graph.microsoft.com/v1.0/users/ の後に、
対象者のメールアドレスをURLエンコードして繋げます。 - encodeURIComponent(triggerBody()?[‘email’])
- https://graph.microsoft.com/v1.0/users/ の後に、
- Headers (ヘッダー):
- キー: Content-Type
- 値: application/json
- Body (本文): 以下のJSONを設定します。
- forceChangePasswordNextSignIn を trueにすることで、
ユーザーの次回サインイン時にパスワード変更を強制できます - “password” の値には、トリガーから受け取った新しいパスワードを割り当てます。
- forceChangePasswordNextSignIn を trueにすることで、
|
1 2 3 4 5 6 7 |
{ "passwordProfile": { "forceChangePasswordNextSignIn": true, "password": "@{triggerBody()?['password']}" } } |
- 認証 (Authentication) の設定
- Authentication type: Managed identity (マネージド ID)
- マネージド ID: システム割り当てマネージド ID
- Audience: https://graph.microsoft.com
実行権限の設定
- Logic Apps >「設定」>「ID」と進んで、「システムの割り当て済み」の状態をオンにして保存します。
この時に表示されるオブジェクトIDをメモ帳などに控えておきましょう。 - ホームに戻り、「Microsoft Entra ID」>「管理」>「ロールと管理者」と進みます。
- 一覧から「パスワード管理者」をクリック(選択ではない)します。
- 「割り当ての追加」> PasswordReset を検索して選択し「追加」をクリックします。
- 同様にして、「ユーザー管理者」も割り当てます。
応用:新規アカウント作成
今回と同じような仕組みで新規アカウント作成ツールも作成できます。パスワードリセットツールとの違いは以下の点です。
- Googleフォームでは、苗字の代わりに、Azure上の登録名としてフルネームを入力するようにします。
- GASではパスワードリセットとパスワードポリシーが異なるのでその文字数を変更する必要があります。メール送付用の文章も変えましょう。
- Azure Logic Appsについては、パスワードリセットの時とは違い、Microsoft Entra IDコネクタに「ユーザーの作成」があるのでそれを使えばOKです。
権限ですが、ユーザー作成の場合は Microsoft Entra ID コネクタを使用するため、細かな権限設定は不要です。

完成イメージ
ここまでの設定を行うことで、Googleフォームに入力するだけで対象者にリセット後の一時パスワードが送れるようになります!(パスワードは念のためマスクしてあります)

同じような仕組みでアカウント作成も可能です!

おわりに
今回は「Googleフォームに入力するだけでAzureのパスワードリセットを行い、対象者に一時パスワードを送信する」ツールをご紹介しました。
今回の実装においては、主にGASのコード実装とAzure Logic Appsの設定でGeminiを活用しました。自動化アプリを作るうえで生成AIは単なる時短ツールではなく、強力な実装パートナーとなりますので皆様もぜひ活用ください!
執筆者プロフィール
- TDI デジタルイノベーション技術部
- インフラ・セキュリティを軸に、現在はAWSの高度な専門資格の取得を目指しています。着実なスキルアップを通じて、より精度の高いアウトプットを目指して活動中です。

