見出し画像

PowerShell で Exchange Online を操作する 初回設定と7つの使用例

Exchange 管理センター のボタンポチポチでいろいろ操作するのって、
ちょっとしんどくないですか?
特に複数の対象を操作するときなんか
「この20個のメールグループ全部にボタンポチポチするの?」
と気が遠くなりました。

なんとかしてボタン操作を減らせるいい方法はないかな、
と思っていたところ、
Microsoft のドキュメントで操作方法を調べるとだいたい下半分くらいに掲載されている PowerShell でやれそうな感じがしました。

でも PowerShell そんなに使いこなせてないし、なんならドキュメントからそのままコピペしても Exchange Online に接続が必要とかで、
初めのころはよくわかりませんでした(今も)。
ということで少しとっつきにくい気がするので、
いろいろ試して徐々に使えるようになってきたことをまとめておきます
(私用PCの買い替えと、Microsoft 365 開発者プログラムに参加して私用のE5環境が手に入ったというのが大きい)。

▼ こんなところで使える

複数の対象のプロパティを一括で変更する、というのが強みです。
しかも、Excel に対象の一覧とコマンド生成式を書いておけば、あとはコピペでコマンド生成、そのコピペで繰り返し使えます。

例:

  • メールボックスの一覧をCSVで出力する

  • CSV中の一覧にある各メールボックスに対して変更処理する

  • 複数のグループを作成して表示名を変更する

  • 予約日数を指定して複数のリソース用メールボックスを作成する

  • 複数のメールボックスの言語とタイムゾーン、予定表のアクセス権を変更する

  • 複数のメールボックスをそれぞれ別のグループに追加する

  • Outlook の宛先で出てくるアドレス帳の「アドレス一覧」作成と変更


▼ はじめの設定

1. 私の環境

Windows 10 もしくは Windows 11 から
Windows PowerShell  5.1 を使って操作しています( PowerShell 7 でも接続までは確認した( PowerShell 7 インストールのときの変態仮面みたいなキャラ、誰なの?))
職場での使用ライセンスは Microsoft 365 Business Premium です。追加はありません。
グローバル管理者の権限を使うことができます(以下の例もグローバル管理者で検証しています)。

2. PowerShell の初期設定

  1. PowerShell でスクリプト実行を許可

  2. Exchange Online 操作用モジュールのインポート

参考:Exchange Online PowerShell V2 モジュールのバージョン情報 | Microsoft Docs

上記リンクの内容を以下のように進めます。
1.まずスクリプト実行を許可するため、管理者として PowerShell を起動し、次のコマンドを実行します。

Set-ExecutionPolicy RemoteSigned

説明:
PowerShell はそのままでは、モジュールやスクリプトを実行できません。
そのため、そのままモジュールをインストールしようとすると、スクリプトの実行が無効というエラーになります。
そのため、スクリプトの実行を許可するためにポリシーを変更します。

ポリシーを変更した

2.次に、Exchange Online PowerShell V2 モジュール ( EXO V2 モジュール)をインストールするため、次のコマンドを実行します。

Install-Module -Name ExchangeOnlineManagement


▼ Exchange Online に接続する

1. 接続

Exchange Online に接続するには、管理者として PowerShell を実行し、次のコマンドを実行します。サインインします。
その後は Exchange Online を操作するコマンドを実行できます。

Connect-ExchangeOnline


2. 切断

Exchange Online での作業が終わったら、次のコマンドを実行して接続を切断します( MaxConcurrency 最大接続数が3セッションまでなので、4つ目の実行空間(?)を開くとエラーがでます)。

Disconnect-ExchangeOnline


▼ コマンド例

もっとうまくやる方法はあると思うのですが、、、
私の場合、以下のようなコマンドを下記 Excel の式から生成して、PowerShell に複数個コピペすることで一括処理しています。

1. ユーザメールボックスの一覧をCSVで出力する

Get-Mailbox -RecipientTypeDetails 'UserMailbox' | Export-Csv C:\Users\gennai-hiraga\デスクトップ\365mailbox.csv

指定の場所(gennai-hiraga のデスクトップ)に 365mailbox.csv を作成して、そこに UserMailbox の一覧を出力する

参考:ユーザー メールボックスを管理Exchange Online | Microsoft Docs


2. CSV中の一覧にある各メールボックスに対して処理する

Import-Csv -Path "C:\Users\gennai-hiraga\デスクトップ\365mailbox.csv" | ForEach-Object {Set-MailboxRegionalConfiguration -Identity $_.PrimarySmtpAddress -DateFormat "yyyy/MM/dd" -TimeFormat "H:mm" -TimeZone "Tokyo Standard Time" -LocalizeDefaultFolderName:$True -Language "ja-JP"}

指定の場所(gennai-hiraga のデスクトップ)にある 365mailbox.csv の PrimarySmtpAddress 列の各メールボックスに対して、言語とタイムゾーンを変更する
なお、1. で出力されたCSVは1行目が不要なので行ごと削除しておく。なんなら、PrimarySmtpAddress 列だけあればいい。

同様に、次のコマンドで結果を確認できる。ログファイルを出力させてもいいと思う。

Import-Csv -Path "C:\Users\gennai-hiraga\デスクトップ\365mailbox.csv" | ForEach-Object {Get-MailboxRegionalConfiguration -Identity $_.PrimarySmtpAddress}


3. メールが有効なセキュリティ グループ を作成して表示名を変更する

New-DistributionGroup -Type Security -Name "大名グループ" -Alias g_daimyo -ManagedBy "nobunaga-oda@conto.com","mitsuhide-akechi@conto.com" -Members "nobunaga-oda@conto.com","mitsuhide-akechi@conto.com","hideyoshi-toyotomi@conto.com" | Set-DistributionGroup -EmailAddresses SMTP:g_daimyo@conto.onmicrosoft.com,SMTP:g_daimyo@conto.com -CustomAttribute1 "管理職グループ"
Set-DistributionGroup -Identity g_daimyo -DisplayName "管理職" -Name "管理職"

名前:大名グループ→ 2つ目のコマンドで 管理職 に変更
エイリアス:g_daimyo
所有者:nobunaga-oda@conto.com と mitsuhide-akechi@conto.com
メンバー:nobunaga-oda@conto.com と mitsuhide-akechi@conto.com と hideyoshi-toyotomi@conto.com
SMTP:g_daimyo@conto.com(そのままだとドメイン作成時のドメインのメールアドレス g_daimyo@conto.onmicrosoft.com がプライマリメールアドレスになってしまう。カスタムドメインを使用している場合はこのように変更する。カスタムドメインを使用していなければここは不要。)
カスタム属性:管理職グループ(他のシステムと連携するときとかに使う)

同様に、次のコマンドで結果を確認できる。

 Get-DistributionGroup -Identity g_daimyo

参考:メールが有効なセキュリティ グループを管理Exchange Online | Microsoft Docs


4. 会議室メールボックス を作成する

New-Mailbox -Name r_ousetsu -DisplayName "応接室" -Room -Office "4名まで" | Set-CalendarProcessing -BookingWindowInDays 365 -MaximumDurationInMinutes 44640

名前:r_ousetsu(メールアドレスにも使われる)
表示名:応接室
場所:4名まで(備考として使っている)
最長予約リード タイム:365日(定期的な予約で「毎月」を選択すると既定で1年後まで繰り返し予約が作成されるが、リードタイムの既定値が180日なのでそのままだとエラーになる。これを回避するため365日前から予約できるようにする)
最大期間:44640分(31日間の連続使用に対応する)

同様に、次のコマンドで結果を確認できる。本当は一行で書きたい。

Get-Mailbox -Identity r_ousetsu | Format-Table Identity, Displayname, Office
Get-Mailbox -Identity r_ousetsu | Get-CalendarProcessing | Format-Table Identity, BookingWindowInDays, MaximumDurationInMinutes

参考:Exchange Online でリソース メールボックスを管理する | Microsoft Docs


5. 備品用メールボックス を作成する

New-Mailbox -Name r_car -DisplayName "本社社用車" -Equipment | Set-CalendarProcessing -BookingWindowInDays 365 -MaximumDurationInMinutes 44640
Set-Mailbox r_car -Office "4人乗り"

名前:r_car
表示名:本社社用車
最長予約リード タイム:365日
最大期間:44640分
場所:4人乗り(なぜか備品用メールボックスではパイプでOfficeを指定できなかったため別コマンドに分割した)

同様に、次のコマンドで結果を確認できる。本当は一行で書きたい。

Get-Mailbox -Identity r_car | Format-Table Identity, Displayname, Office
Get-Mailbox -Identity r_car | Get-CalendarProcessing | Format-Table Identity, BookingWindowInDays, MaximumDurationInMinutes

参考:Exchange Online でリソース メールボックスを管理する | Microsoft Docs


6. メールボックスの言語とタイムゾーン、予定表のアクセス権を変更する

Set-MailboxRegionalConfiguration -Identity perry -DateFormat "yyyy/MM/dd" -TimeFormat "H:mm" -TimeZone "Tokyo Standard Time" -LocalizeDefaultFolderName:$True -Language "ja-JP"
Get-MailboxRegionalConfiguration -Identity perry

perry  の言語とタイムゾーンを日本に変更し、結果を確認する

参考:タイムゾーン設定をPowerShellで行う – もくだいさんのOffice365至高のレシピ (mokudai.jp)

Set-MailboxFolderPermission -Identity perry@contoso.com:\予定表 -User Default -AccessRights Editor
Get-EXOMailboxFolderPermission -Identity perry@contoso.com:\予定表

perry@conto.com の予定表へのアクセス権を既定で編集者に変更し、結果を確認する
(なぜかタイムゾーンが英語の人がいて、その場合は perry@conto.com:\calendar と指定する必要がある。面倒なのでタイムゾーンを先に日本に変更してからアクセス権を変更する)

参考:予定表の既定のアクセス権限を変更する – もくだいさんのOffice365至高のレシピ (mokudai.jp)
(もくだいさんすげぇ、、、)

7. メールが有効なセキュリティ グループ にメンバーを追加する

Add-DistributionGroupMember -Identity g_daimyo -Member ieyasu-tokugawa
Get-DistributionGroupMember -Identity g_daimyo

メールが有効なセキュリティ グループ g_daimyo に、ieyasu-tokugawa を追加し、結果を確認する
ただし、この操作は自分がそのグループの所有者の1人であることが必要。所有者でなければエラーになる。

▼ Excel でコマンド式を生成する

メールアドレスや表示名を参照するようにしておくとコマンドが生成できる

Excel で作成した管理表に式を埋め込んでコマンドを生成させています。
生成したコマンドは、値貼り付けではなく、そのままセルをコピーしてPowerShell に貼り付けると実行できます。
また、複数行分をそのままコピペできるので、一括で処理が可能です。これが便利。
この xlsx をデータソースにしたPower Platform でコマンド実行までできそうな気配。

※  このとき、ダブルクォーテーションをダブルクォーテーションとして PowerShell に出力する必要がある。そのため、式の文字列中ではダブルクォーテーションの前にダブルクォーテーションを1つ追加する。
 例:コマンド中で "大名グループ" とダブルクォーテーション付きで組み立てたい場合、式中での該当部分は""大名グループ""となる。式中でセル指定するなら、A2セルの値を 大名グループ として、""""&A2&"""" となる。

以上です。
今のところ私がよく使うのはこのへん。他にはアドレス一覧やGALを変更したり作成したりもなんとなくできたのですが、Outlookからアドレス帳検索するとメンバーが含まれていなかったりしてよくわからんので、ちゃんと動けば書きます。

便利そうだしMicrosoft Graphでも使えるので、PowerShell でできそうだと思ったところは積極的に使って PowerShell Powerを高めていきたいです。


この記事が気に入ったらサポートをしてみませんか?