お手軽Office365 / Exchange Online 管理者向けPoweshellコマンド集

# 本項について
* PowerShellでExchange Onlineを管理する初期セットアップはここには書いてありません
* 全てのコマンドは自分が日常業務で使っている物です
* 検索した結果を自分で組み替えたりして動いているのを確認する程度なので、PowerShellを使いこなしている方からすると適切でない書き方も含まれているかもしれません
* Unified-Group(Office365グループ)はユーザーが勝手にメールアドレスを作れてしまうという問題があるので、基本的には未使用です
* もっとExcellentな書き方知ってるぜという方、改善案・ご指導は大歓迎なので是非コメントをください
* 「俺はこんなこともPowerShellで管理してるぜ！」ってのもぜひお寄せいただけると助かります。

# 設定されているライセンスを確認
```PowerShell
Get-MsolUser -All | Where-Object {$_.isLicensed -eq $True} | FL UserPrincipalName, DisplayName,Licenses
```
全ユーザーにどのライセンスが割り当てられているかを一覧で出力します。
デフォルトのままだと少し再利用しづらいフォーマットですね、課題が残ってます。


# 「アドレス一覧に表示しない」関連

## 特定文字列を含むDistributionGroupを「アドレス一覧に表示しない」のチェックを入れる
```PowerShell
$result=(Get-DistributionGroup -filter {DisplayName -like "無効*"})
ForEach($ml in $result){ Set-DistributionGroup  $ML.Identity -HiddenFromAddressListsEnabled $true }
```
一行目のGet-DistributionGroupに渡すFilterパラメータの式の中で絞り込みをかけています。
-Filter以降を削ると、全グループが対象になります
「○○で始まる」という形で絞り込むのであれば、この例にある「無効」の文字列を書き換えればOKです。

### 退職者の人をアドレス帳から外す
```PowerShell
Get-Mailbox -Filter {DisplayName -like "退職*"} | Where-Object {$_.HiddenFromAddressListsEnabled -eq $False} | Set-Mailbox -HiddenFromAddressListsEnabled $true
Get-Mailbox | Where-object { $_.HiddenFromAddressListsEnabled -eq $True};
```
パイプでつないで、表示名が「退職」という文字で始まっているのに、「アドレス一覧に表示しない」が設定されていないユーザーの設定をすべて変更しています。
2行目では「アドレス一覧に表示しない」が有効なメールボックスの一覧を取得しています。

# 訴訟ホールド関連

### 訴訟ホールドが無効なメールボックスを有効に
```PowerShell
Get-Mailbox -RecipientTypeDetails UserMailbox | where{$_.LitigationHoldEnabled -eq $false } | Set-Mailbox -LitigationHoldEnabled $True
```

# スケジューラ関連

### 特定ユーザのスケジューラの規定の共有設定を変更する
```PowerShell
Set-MailboxFolderPermission -Identity user@hoge.onmicrosoft.com:\予定表 -User "既定"  -AccessRights Reviewer
Add-MailboxFolderPermission -Identity "user@hoge.onmicrosoft.com:\予定表" -User "アシスタントチーム"  -AccessRights Owner

```
Outlookのデフォルト設定だと、スケジュールの有り/無ししか見えませんが、弊社ではスケジュールの内容も把握できるように設定しています(1行目)。
2行目では、アシスタントなどの方が管理職のスケジュールを代理設定できるようにもしています。

# ML管理
### MLを定型フォーマットで作成する

```PowerShell
$MLADR="ml-name"
$MLNAME="ML-DisplayName"
$MLDOMAIN="@hoge.co.jp"
#直接リストを設定するなら
$arMembers=@("user-a", "user-b", "user-c", "user-d", "user-e", "user-f")
#「"」の数を減らしてリスト記入の楽したいなら
$arMembers="user-a;user-b;user-c;user-d;user-e;user-f" -split ";"

New-DistributionGroup -Name $MLADR -Alias $MLADR -DisplayName $MLNAME -PrimarySmtpAddress $MLADR$MLDOMAIN -Type Security -MemberJoinRestriction Closed -MemberDepartRestriction Closed
Set-DistributionGroup -Identity $MLADR -RequireSenderAuthenticationEnabled $false
ForEach($mem in $arMembers){ Add-DistributionGroupMember -identity $MLADR -member $mem }
Get-DistributionGroup -Identity $MLADR
Get-DistributionGroupMember -Identity $MLADR
```

管理画面からMLを作成すると、どうしても名前の入力やらメールアドレスなどの部分でブレが発生してしまいます。
(Get-DistributionGroupの結果を見てその不揃いさに何度もガッカリしたりしてます…）
なので、定型のコマンドを作って、先頭の変数だけ書き換えて実行する事で、作成されるMLの統一感を出すようにしています。

### 全MLのML名とメンバーを出力
```PowerShell
$mls=(Get-DistributionGroup)
foreach($ml in $mls){
 $mems=(Get-DistributionGroupMember $ml.Name)
 foreach($member in $mems){
  echo $ML.name	$member.name >> mlmembers.txt
 }
}
```
全MLに対して、参加者を「ML名と氏名」で一覧したものをmlmembers.txtというファイルに出力します。
Excelなどで整形して、MLのメンバーメンテナンスに利用する事を想定しています。
MLの数だけGet-DistributionGroupMemberを呼び出すので、終了まで少し時間がかかります。
現時点ではまだ出力フォーマットに改行が入ってしまうという問題ありです。

### 指定されたMLを空にする
```PowerShell
$MLADR="ml-name"
$result=(Get-DistributionGroupMember $MLADR)
ForEach($member in $result){ Remove-DistributionGroupMember -identity $MLADR -member $member.Name -confirm:$false }
```
指定されたMLのメンバーを取り出して、全てにRemove-DistributionGroupMemberを発行しています

# ユーザー一覧系
### ユーザーのパスワード最終更新日を確認する
```PowerShell
Get-MsolUser | Where-Object { $_.isLicensed -eq $True} | Select-Object Section, DisplayName, UserPrincipalName, LastPasswordChangeTimestamp
```

### 転送設定が有効なメールボックスの一覧を取得する
転送設定って一覧で確認しないと忘れがちなので、たまに見ておいた方が良い項目の一つです。
弊社ではsmtpアドレスで転送先を設定するので、ForwardingSmtpAddressにsmtpで始まる文字列が入っていれば、ほぼ転送先アドレスの指定なので、それで転送設定されていると判断して一覧を作っています。

```PowerShell
Get-Mailbox | Where-Object {$_.ForwardingSmtpAddress -like "smtp*"} | FL Name, ForwardingSmtpAddress
```