1. システムとオフィスの融合|株式会社QES
  2. media
  3. Googleソリューション Identity
  4. Google Admin SDK、.netを利用したGsuiteユーザCRUD

QESブログ

Google Admin SDK、.netを利用したGsuiteユーザCRUD

  • LINEで送る
  • このエントリーをはてなブックマークに追加

Gsuiteを利用していると、ユーザ管理したい、また作成、更新などの操作をGUIから行うのは面倒だ、ということがあるのではないでしょうか。
私達は日頃、Microsoft Identity Manager(MIM)を利用してオンプレミスとクラウド(Active Directory,AzureAD,o365などMicrosoft系中心)のID管理をしていますが、本記事では趣向を変えて、Google Admin SDKを使用し、.netで作成したプログラムでGsuiteユーザをCRUD操作する方法をご紹介しようと思います。
この内容を応用すれば、Azure(o365)やGCP(Gsuite)が共存するマルチクラウド環境のID管理ができるのではないでしょうか。

今回は簡単に、引数 [-list],[-add],[-upd],[del]を変えることよってユーザの一覧表示、追加、更新、削除ができるコンソールアプリケーションを作成しようと思います。

[事前準備]
 ・Gsuiteテナント
 ・Visual Studio (事前に開発環境にインストールしておきます。)
  ※今回は2019を使用しています。

早速作ってみよう

GCPへプロジェクトを作成します。
①GCPへサインインします。(https://console.cloud.google.com/)
ID_Google_01_18.png
②画面上部の▽を選択し、[新しいプロジェクト]を押下します。
ID_Google_01_36.png
③[プロジェクト名]に任意のプロジェクト名を入力し、[作成]を選択します。
 ※[GoogleSamplePrj]としました。
ID_Google_01_36.png
プロジェクトが作成されると以下の画面に遷移します。
ID_Google_01_36.png
④画面上部左のハンバーガーアイコンから[APIとサービス]-[ライブラリ]を選択します。ID_Google_01_05.png
⑤検索窓へ[Admin SDK]と入力し、検索結果の[Admin SDK]を選択します。
ID_Google_01_06.png
⑥[有効にする]を選択します。
ID_Google_01_07.png
有効にすると以下の画面へ遷移します。ID_Google_01_08.png
⑦画面上部左のハンバーガーアイコンから[APIとサービス]-[OAuth同意画面]を選択します。
ID_Google_01_09.png
⑧[内部]を選択し、[作成]を押下した後、以下を入力し、[保存して次へ]を押下します。
 アプリ名:G-UserCRUD
 ユーザサポートメール:ログインユーザーのメールアドレス
 デベロッパーの連絡先情報:ログインユーザーのメールアドレス
  ※アプリ名は任意名称です。
  ※ユーザサポートメール、デベロッパーの連絡先情報は任意のメールアドレスを指定してください。
ID_Google_01_10.png
ID_Google_01_11.png

⑨[保存して次へ]を押下します。
ID_Google_01_12.png
⑩[ダッシュボードに戻る]を押下します。
ID_Google_01_13.png
⑪画面左の[認証情報]を選択します。
ID_Google_01_14.png
⑫[認証情報を作成]を選択し、[OAuthクライアントID]を押下します。
ID_Google_01_15.png
⑬[アプリケーションの種類]を[デスクトップアプリ]にし、[名前]を任意名称で入力したうえ、[作成]を押下します。
ID_Google_01_16.png
下記画面が表示されるので[OK]を押下する。
ID_Google_01_17.png
⑭作成したOAuth クライアントIDを選択し、ダウンロードアイコンを押下し、Jsonファイルをダウンロードする。ID_Google_01_18.png
ここまでで下準備は整いました。

⑮次にVisual Studioでアプリケーションを作成します。
 今回は.net coreのコンソールアプリケーションを選択しました。
ID_Google_01_19.png
ID_Google_01_20.png
※プロジェクト名はG-UserCRUDSampleとしました。

⑯[Nugetパッケージの追加]から[Google.Apis.Admin.Directory]と検索し、[Google.Apis.Admin.Directory.directory_v1]をインストールします。
ID_Google_01_21.png
ダイアログが表示されるので、[OK]を押下します。
ID_Google_01_22.png
⑰⑭でダウンロードしたJsonファイルを[cred.json]へリネームし、プロジェクトのフォルダへ移動します。
ID_Google_01_23.png
⑱[cred.json]を右クリックし、[プロパティ]を選択、プロパティペインの[出力ディレクトリにコピー]を[常にコピーする]にする。
ID_Google_01_24.png
⑲[Program.cs]を以下に書き換えます。
using Google.Apis.Auth.OAuth2;
using Google.Apis.Admin.Directory.directory_v1;
using Google.Apis.Admin.Directory.directory_v1.Data;
using Google.Apis.Services;
using Google.Apis.Util.Store;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;

namespace G_UserCRUDSample
{
    class Program
    {
        static string[] Scopes = { DirectoryService.Scope.AdminDirectoryUserReadonly,
                                   DirectoryService.Scope.AdminDirectoryUser};

        static string domainName = "aaa.bbb"; // ←所有しているテナントのドメイン名を指定してください。
        static UserCredential credential;
        static void Main(string[] args)
        {
            if (args.Length != 1)
            {
                // エラー
                Console.WriteLine("引数が不足しています。[-list],[-add],[-upd],[del]のいずれかを指定してください。");
                return;
            }

            string credFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "cred.json");
            using (var stream = new FileStream(credFile, FileMode.Open, FileAccess.Read))
            {
                string credPath = "token.json";
                credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                    GoogleClientSecrets.Load(stream).Secrets,
                    Scopes,
                    "user",
                    CancellationToken.None,
                    new FileDataStore(credPath, true)).Result;
                Console.WriteLine("Credential file saved to: " + credPath);
            }

            string operation = args[0].ToLower();
            if (operation == "-list")
            {
                listUser();
            }
            else if (operation == "-add")
            {
                CreateUser();
            }
            else if (operation == "-upd")
            {
                UpdateUser();
            }
            else if (operation == "-del")
            {
                DeleteUser();
            }
            else
            {
                // エラー
                Console.WriteLine("引数に誤りがあります。[-list],[-add],[-upd],[del]のいずれかを指定してください。");
                return;
            }
            return;
        }


        // ユーザの表示
        static void listUser()
        {
            // Create Directory API service.
            var service = new DirectoryService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential,
            });

            string nextPageToken = string.Empty;
            do
            {
                // Define parameters of request.
                UsersResource.ListRequest request = service.Users.List();
                request.MaxResults = 1;
                request.Domain = domainName;
                request.PageToken = nextPageToken;
                request.OrderBy = UsersResource.ListRequest.OrderByEnum.Email;

                // List users.
                var ret = request.Execute();
                IList users = ret.UsersValue;
                if (users != null && users.Count > 0)
                {
                    foreach (var userItem in users)
                    {
                        Console.WriteLine("{0} ({1})", userItem.PrimaryEmail, userItem.Name.FullName);
                    }
                }
                else
                {
                    Console.WriteLine("No users found.");
                    break;
                }

                if (!string.IsNullOrEmpty(ret.NextPageToken))
                {
                    nextPageToken = ret.NextPageToken;
                }
                else
                {
                    nextPageToken = string.Empty;
                }

            } while (!string.IsNullOrEmpty(nextPageToken));
        }

        // ユーザの作成
        static void CreateUser()
        {
            try
            {
                // Create Directory API service.
                var service = new DirectoryService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                });

                // Define parameters of request.
                User uParam = new User();
                uParam.Name = new UserName();

                Console.WriteLine("姓を入力してください。:");
                uParam.Name.FamilyName = Console.ReadLine();
                Console.WriteLine("名を入力してください。:");
                uParam.Name.GivenName = Console.ReadLine();
                Console.WriteLine("初期パスワードを入力してください。:");
                uParam.Password = Console.ReadLine();
                Console.WriteLine("メールアドレスを入力してください。(ドメインなし):");
                uParam.PrimaryEmail = Console.ReadLine() + @"@" + domainName;

                UsersResource.InsertRequest request = service.Users.Insert(uParam);
                User ret = request.Execute();

                Console.WriteLine("[{0}]の作成に成功しました。", ret.PrimaryEmail);
            }
            catch (Exception ex)
            {
                Console.WriteLine("ユーザの作成に失敗しました。[{0}]", ex.ToString());
            }
        }

        // ユーザの更新
        static void UpdateUser()
        {
            try
            {
                // Create Directory API service.
                var service = new DirectoryService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                });

                Console.WriteLine("更新対象ユーザのメールアドレスを入力してください。(ドメインなし):");
                string userKey = Console.ReadLine() + @"@" + domainName;

                // Define parameters of request.
                User uParam = new User();
                uParam.Name = new UserName();

                Console.WriteLine("変更後の姓を入力してください。:");
                uParam.Name.FamilyName = Console.ReadLine();
                Console.WriteLine("変更後の名を入力してください。:");
                uParam.Name.GivenName = Console.ReadLine();

                UsersResource.UpdateRequest request = service.Users.Update(uParam, userKey);
                User ret = request.Execute();

                Console.WriteLine("{0}の更新に成功しました。", userKey);
            }
            catch (Exception ex)
            {
                Console.WriteLine("ユーザの更新に失敗しました。[{0}]", ex.ToString());
            }
        }

        // ユーザの削除
        static void DeleteUser()
        {
            try
            {
                // Create Directory API service.
                var service = new DirectoryService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                });

                Console.WriteLine("削除対象ユーザのメールアドレスを入力してください。(ドメインなし):");
                string userKey = Console.ReadLine() + @"@" + domainName;

                UsersResource.DeleteRequest request = service.Users.Delete(userKey);
                var ret = request.Execute();

                Console.WriteLine("{0}の削除に成功しました。", userKey);
            }
            catch (Exception ex)
            {
                Console.WriteLine("ユーザの削除に失敗しました。[{0}]", ex.ToString());
            }
        }
    }
}

コード解説

定義部

以下の部分は各ユーザのCRUD操作で使用するAPIに必要なスコープとなります。
別のAPIを使用する際はそのAPIに必要なスコープを定義する必要があります。
static string[] Scopes = { DirectoryService.Scope.AdminDirectoryUserReadonly,
                                   DirectoryService.Scope.AdminDirectoryUser};

Main()

Cred.jsonによりOAuth認証をおこなったうえ、引数[-list],[-add],[-upd],[del]どれが指定されたかによってCRUDどれを行うか振り分けています。

listUser()

DirectoryServiceオブジェクトを作成、リクエストパラメータを設定したうえ、API[Users.List()]を実行しています。
[Users.List()]はGsuiteへ存在するユーザを一覧で取得するAPIです。
[Users.List()]へ指定できるリクエストパラメータ、スコープ等詳細情報は以下に記載があります。
<https://developers.google.com/admin-sdk/directory/v1/reference/users/list>
ここではMaxResultsを1に指定しているので、1ユーザづつ取得しています。
ここに10を指定すると10ユーザまで取得します。(最大500)
例えばGsuiteへ大量にユーザ存在し、1回で全ユーザ取得できない場合、1回目の[Users.List()]の戻り値にNextPageTokenという値が入っていますので、その値をリクエストパラメータへ含め、2回目[Users.List()]を実行、まだ全部取れない場合は2回目[Users.List()]戻り値のNextPageTokenをリクエストパラメータへ入れて3回目・・というかたちでループ実行していけば全ユーザ取得が可能です。
また、リクエストパラメータのDomainは必須ですので指定するのを忘れないようにしてください。

CreateUser()

DirectoryServiceオブジェクトを作成、リクエストパラメータを設定したうえ、API[Users.Insert()]を実行しています。
[Users.Insert()]はGsuiteへユーザを作成するAPIです。
[Users.Insert()]へ指定できるリクエストパラメータ、スコープ等詳細情報は以下に記載があります。
<https://developers.google.com/admin-sdk/directory/v1/reference/users/insert>
ここでは姓、名、初期パスワード、メールアドレスを標準入力から取得しています。
これらは[Users.Insert()]でユーザ作成するために必須のリクエストパラメータとなります。
また、リクエストパラメータはUserオブジェクトに設定したうえ、[Users.Insert()]へ渡していますが、
APIによってリクエストパラメータとして渡すオブジェクトは異なってきますので、上記URLを参考にリクエストパラメータを生成してください。

UpdateUser()

DirectoryServiceオブジェクトを作成、リクエストパラメータを設定したうえ、API[Users.Update()]を実行しています。
[Users.Update()]はGsuiteユーザの属性情報を更新するAPIです。
[Users.Update()]へ指定できるリクエストパラメータ、スコープ等詳細情報は以下に記載があります。
<https://developers.google.com/admin-sdk/directory/v1/reference/users/update>
ここでは対象ユーザの一意キーを取得する必要があるので、メールアドレスを標準入力から取得しています。
更新可能な属性情報は上記URLにも記載がありますが、数多くあります。今回はサンプルということで姓、名のみ更新するようにしています。
 

DeleteUser()

DirectoryServiceオブジェクトを作成、リクエストパラメータを設定したうえ、API[Users.Delete()]を実行しています。
[Users.Delete()]はGsuiteユーザを削除するAPIです。
[Users.Delete()]へ指定できるリクエストパラメータ、スコープ等詳細情報は以下に記載があります。
<https://developers.google.com/admin-sdk/directory/v1/reference/users/delete>
ここでは更新同様、対象ユーザの一意キーを取得する必要があるので、メールアドレスを標準入力から取得しています。

実行してみよう

まずは[-list]を指定して実行し、Gsuiteのユーザ一覧をコンソールへ表示してみましょう。
実行すると認証画面が表示されますので、ログインします。
ID_Google_01_25.png
次にアクセス権の許可画面が出ますので、[許可]を押下します。
[ドメインのユーザの表示]、[ドメインのユーザのプロビジョニングの表示と管理]は前述のスコープを変更するとここも変わります。
ID_Google_01_26.png
ブラウザに以下が表示されますので、指示通りウィンドウを閉じます。
ID_Google_01_27.png
コンソールへGsuiteに存在するユーザ一覧が表示されました。
ID_Google_01_28.png
Gsuiteの管理画面から見ても、全ユーザ取得できていることがわかります。
ID_Google_01_29.png
[※補足]
 認証及びアクセス許可画面は一度許可すると、次からは表示されません。
 しかしスコープを変更すると、再度認証、アクセス許可する必要があります。
 (再度認証、許可しないとアクセス権エラーとなる場合があります。)
 その場合、exeが入っているフォルダにcred.jsonがコピーされていますので、このcred.jsonを削除したうえ、再度exeを実行すると認証、アクセス許可画面が表示されます。
 ですので、スコープを変更する際はこの点留意してください。


次はユーザ作成を試してみましょう。
[-add]を引数へ指定して実行します。
姓、名、初期パスワード、メールアドレス(ドメインなし)を入力します。
ID_Google_01_30.png
無事ユーザが作成されています。
ID_Google_01_31.png
では上で作成したユーザの更新をしてみましょう。
[-upd]を引数へ指定して実行します。
更新したいユーザのメールアドレス、変更後の姓、名を入力します。
(今回姓、名それぞれ”CHG”を末尾に追加しました。)
ID_Google_01_32.png
姓、名が変更されていることが確認できます。
ID_Google_01_33.png
ID_Google_01_34.png
最後にユーザの削除をしてみましょう。
[-del]を引数へ指定して実行します。
ID_Google_01_35.png
削除できました。
ID_Google_01_36.png
このようにプログラムを使用して簡単にGsuiteユーザのCRUD操作が可能です。
例えば、GoogleスプレッドシートにGsuiteユーザ一覧を出力する、Googleスプレッドシートから値を読み込んでユーザの属性情報に何かしらの値を書き込む、
ユーザの状態、属性情報を判定して、削除する、など様々なことに応用可能です。

最後に

今回はGsuiteユーザのCRUDについて、簡単なサンプルをご紹介しました。
サンプルではAdmin SDKしか使用してませんが、予定表の操作やドライブの操作など多くのAPIが用意されています。
<https://developers.google.com/apis-explorer>
今後はグループやリソースの操作についてもご紹介しようと思います。

QESでは様々なアプリケーションの開発・導入を行っております。
私共が提供するサービス・ソリューションにつきましてはこちらに掲載しております。
また、現在Power Platform に力を入れて取り組んでいます。Power Apps等のPower Platformについては、こちらをご覧ください。

システム開発・構築でお困りの問題や弊社が提供するサービス・ソリューションにご興味を抱かれましたら、是非一度お問い合わせください。


・このブログで参照されている、G suite、GCP、Googleロゴ、その他のGoogle製品およびサービスは、Google LLCの商標です。
・このブログで参照されている、Active Directory、Office 365、Windows Azure、Visual Studio、その他のマイクロソフト製品およびサービスは、米国およびその他の国におけるマイクロソフトの商標または登録商標です。

  • LINEで送る
  • このエントリーをはてなブックマークに追加

お気軽にお問い合わせください。

ページのトップへ