自動化厨のプログラミングメモブログ │ CODE:LIFE

Python/VBA/GAS/JavaScript/Raspberry Piなどで色んなことを自動化

Google Workspace管理者必須のCLIツール GAM でいつもの作業をコマンドで出来るか試してみる

前回、前々回まででWindowsでもMacでもセットアップ手順を確認できたので、今回はGAMコマンドをいろいろ試してみます。

↓セットアップ手順はこちら↓ codelife.cafe codelife.cafe

いつもの作業 といいつつ世の中の情シスの人が実際によくやっている業務ランキングとかに合わせたほうが良いかなと思ったのでGPT-5に「よくある業務ランキングTOP10」でディープリサーチを依頼。 上位3種類の業務をGAMコマンドでやってみることにします。(上位5種にしようと思ったけど予想してたより検証大変で3にしましたm( )m)


🥇 第1位:ユーザーアカウント管理

主な内容

  • アカウント作成/削除
  • ライセンス割り当て
  • 部署異動に伴う権限変更

作業手順例(新入社員アカウント作成)

  1. 管理コンソールにログインhttps://admin.google.com/
  2. ユーザー → ユーザーを追加 を選択
  3. 氏名・メールアドレスを入力
  4. 初期パスワードを設定(ユーザーに初回変更を強制)
  5. 必要な ライセンス(Business/Enterprise等)を割り当て
  6. 部署に応じた グループに追加(例:営業部、全社通知グループ)

GAMでやると...?

コマンド例

基本的にコマンドの構成としては gam <操作> <対象> <オプション> のような形。

# 新規ユーザー作成
gam create user user@example.com firstname "太郎" lastname "山田" password "InitPass123"

# ユーザー削除
gam delete user user@example.com

# Business Standardライセンスを割当
gam user user@example.com add license 1010020028

# グループにユーザーを追加
gam update group team@example.com add member user@example.com

まずはユーザー作成を試します。

gam create user taro.yamada@codelife.cafe firstname "太郎" lastname "山田" password "InitPass123"

Created と表示されれば成功。管理画面を確認するとユーザーが作成されておりアクティブになってます。

ライセンス付与。ライセンスのIDは数字でもいいですがぱっと見てわかりにくいので、https://github.com/GAM-team/GAM/wiki/l-LicenseExamples#license-types に記載されている略称みたいなやつでやるのが良さそうです。

Google Workspace Business Starter wsbizstart
Google Workspace Business Standard wsbizstan
Google Workspace Business Plus wsbizplus
Google Workspace Enterprise Essentials wsentess
Google Workspace Enterprise Standard wsentstan
Google Workspace Enterprise Plus wsentplus
Google Workspace Essentials wsess

試したけど無いものは付与できないということでエラー…w

gam user taro.yamada@codelife.cafe add license wsbizstan

さすがにこのためだけに1ライセンス買うのはもったいないので許してください

グループにユーザー追加。

gam update group infosys@codelife.cafe add member taro.yamada@codelife.cafe

ユーザー削除もやってみた。

gam delete user taro.yamada@codelife.cafe

Deletedと表示されれば成功。


🥈 第2位:セキュリティ設定・監査

主な内容

  • 2段階認証(2SV)ポリシー適用
  • 不審ログインの確認
  • 強制パスワードリセットやアカウントの一時停止

作業手順例(不審ログイン調査)

  1. 管理コンソール → セキュリティ → セキュリティダッシュボード
  2. アラートセンターで「異常なログイン試行」を確認
  3. 対象ユーザーの ログイン監査ログを参照
  4. 必要に応じて:
    • 強制パスワードリセット
    • アカウント一時停止

GAMでやると...?

コマンド例

# 対象ユーザーを2SV必須OUに移動(OU側にポリシー設定済み前提)
gam update user user@example.com org "/2SV必須OU"

# ログイン失敗イベントを確認
gam report login start 2025-01-01 end 2025-01-31 event login_failure user user@example.com

# 強制パスワードリセット
gam update user user@example.com password "NewPassw0rd!" changepassword on

# アカウント一時停止
gam update user user@example.com suspended on

# アカウント再開
gam update user user@example.com suspended off

2段階認証必須のOUに移動

直接個別ユーザーに対して設定できないのであらかじめ以下のようにセキュリティ設定を組織部門に適用しておく必要ありです。

以下のようにコマンドを実行します。

gam update user taro.yamada@codelife.cafe org "/2SV必須OU"

Updatedと表示されれば成功です。

実際に組織部門が「2SV必須OU」になっていることを確認できました。

もし複数階層ある場合はスラッシュ区切りで指定します。

例) gam update user taro.yamada@codelife.cafe org "/2SV必須OU/テストユーザー"

ログイン失敗イベントを確認

これに関しては別にGAMでやらずとも管理コンソールのレポート>監査と調査画面でやればOKな気がしますが、頻度が多くて完全自動化したい場合はコマンドを定期実行すると良いかも。

gam report login start 2025-08-01 end 2025-08-31 event login_failure user taro.yamada@codelife.cafe

今回作ったアカウントはぜんぜん使ってないので0件でした。

失敗履歴がある場合だとこんなかんじ。

出力される項目は

name,login_challenge_method,login_type,type,actor.email,actor.profileId,id.applicationName,id.customerId,id.time,id.uniqueQualifier,ipAddress,networkInfo.ipAsn,networkInfo.ipAsn.0,networkInfo.regionCode,networkInfo.subdivisionCode

IPアドレスやリージョンコードで海外からのアクセスは危険度高と判定したりできそうですね。

ただ、これがコンソールに直接出ても見づらすぎるので、コマンドの最後に todrive と付けてみましょう。

gam report login start 2025-08-01 end 2025-08-31 event login_failure user taro.yamada@codelife.cafe todrive

todriveオプションを付けると結果をスプレッドシートに出力してくれます。これ超便利。

ユーザー指定無しで gam report login start 2025-08-01 end 2025-08-31 event login_failure todrive とすれば今月の全ユーザーのログイン失敗履歴をスプレッドシートにまとめることも可能。

ログイン失敗以外にも パスワード変更 = password_edit 、 アカウント復元用のメールアドレスの変更 = recovery_email_edit などいろいろ指定可能。イベントの種類については公式のリファレンス Login Audit Activity Events のイベント名部分を参照するのがよいでしょう。

強制パスワードリセット

これはシンプル。 changepassword on を付けることで初回ログイン時のパスワード変更要求が設定されます。

gam update user taro.yamada@codelife.cafe password "NewPassw0rd!" changepassword on

Updatedと表示されれば成功。

アカウントの休止・再開

これもシンプルですね。suspended のon/off指定のみです。

# アカウント一時停止
gam update user taro.yamada@codelife.cafe suspended on

# アカウント再開
gam update user taro.yamada@codelife.cafe suspended off

Updatedと表示されれば成功。管理コンソールを確認すると停止中となっています。


🥉 第3位:メール(Gmail)管理

主な内容

  • 迷惑メール対策
  • メール転送ルール監視
  • メールトレース

作業手順例(メールトレース)

  1. 管理コンソール → レポート → メールログ検索
  2. 送信元/宛先メールアドレス・時間を指定
  3. メール配送状況(成功/失敗/スパム判定)を確認
  4. ユーザーへ結果を共有し、必要に応じてルール追加(例:ドメインホワイトリスト)

GAMでやると...?

コマンド例

# 全ユーザーのメールボックスを検索
gam all users print messages query 'subject:"重要" after:2025-01-01 before:2025-01-31' todrive

# 特定ユーザーのメールボックス内で件名にキーワードがあるメールをスパム扱い
gam user user@example.com modify messages query 'subject:"【期間限定】"' addlabel SPAM removelabel INBOX doit

# 転送アドレス追加
gam user user@example.com add forwardingaddress forward@domain.com

# 転送有効化(受信トレイに残す)
gam user user@example.com forward on forward@domain.com keep

これのすごいところは全ユーザーのGmailを操作できる点。

全ユーザーのメール検索を試してみます。

重要メールがないので gam all users print messages query 'subject:"invoice"' todrive で実行。

ユーザー、日時、件名、送信者、メッセージIDなどが出力されました。本文はなさそう。

queryに in:sent to:"taro.yamada@codelife.cafe" みたいにすれば送信済みメールをチェックしたりもできそう。

queryの詳細は公式ヘルプセンターのGmail で検索を絞り込むを参照ください。

Gmailの画面上部で検索すると検索バーにquery形式に変換されたものが出てくるのでこれをコピペでもOK。

件名に特定の文字列を含むメールをスパムとする

gam user taro.yamada@codelife.cafe modify messages query 'subject:"【期間限定】"' addlabel SPAM removelabel INBOX doit

迷惑メールに移動してました。 gam all users modify messages query 'subject:"【期間限定】"' addlabel SPAM removelabel INBOX doit のように all でやれば全ユーザーのメールのラベルを操作できそう。

メールの転送設定追加と有効化

# 転送アドレス追加
gam user taro.yamada@codelife.cafe add forwardingaddress marumo@codelife.cafe

addした段階では転送は実行されず、内部的にアドレスが追加されただけの状態っぽい。これはフィルタ設定ではなく、設定画面の「メール転送とPOP/IMAP」> 転送部分に該当する。

末尾に keep が設定されていると転送しつつも受信トレイに残す設定が反映された。

# 転送有効化(受信トレイに残す)
gam user taro.yamada@codelife.cafe forward on marumo@codelife.cafe keep

多分 delete にしたら削除されるのだろうと試したところ当たり。転送後に削除される設定が反映された。 gam user taro.yamada@codelife.cafe forward on marumo@codelife.cafe delete

keep=受信トレイに残す、archive=アーカイブする、delete(trashでも可)=削除する、mark_read=既読にする でした。

転送を無効化するには off を指定するだけ。

 gam user taro.yamada@codelife.cafe forward off marumo@codelife.cafe

ついでにフィルタ設定で転送を行う場合も紹介しておくとこんなかんじ。

山田さんのGmailに「bossから来たメールをmarumoに転送する」フィルタを作成

 gam user taro.yamada@codelife.cafe add filter from "boss@example.com" forward "marumo@codelife.cafe"

組織全体でフィルタ設定を定義したい場合は all users を指定すれば設定配布できるので便利かも。


まとめ

以上、Google Workspace管理者が実際によく行う作業とGAMコマンドでの実現方法を見てきました。一般的なユーザー管理、セキュリティ監査、メール管理などがコマンドラインから効率的に実行可能なことが確認できました。

CLIで操作することで、繰り返し作業の自動化やスクリプト化も容易になり、管理業務の効率化に大きく貢献すると言えるでしょう。

この記事では検証ログのような形で雑多に書いちゃいましたが、個人的にはチートシート(よくあるコマンドを一覧にしたもの)が欲しい。今回もChatGPTなりGeminiなりに聞けばすぐ使えるコマンド作ってくれるだろうと思ったら意外と間違ってて修正が必要だったりして結局Wiki見たりReddit見たりしてました。

誰かチートシート作ってくれてないかなぁ…。