PowerShellでExchangeメールボックスの代理送信権限を一括管理する方法

PowerShellを活用して、Exchangeメールボックスの代理送信権限を一括管理する方法を解説します。企業環境では、複数のユーザーが同じメールボックスを使用するケースが多く、管理者は適切な権限設定を行う必要があります。しかし、手作業での設定は時間がかかり、設定ミスのリスクもあります。

PowerShellを使用すれば、代理送信権限の付与・削除をスクリプトで一括管理でき、作業の効率化と正確性の向上が可能になります。本記事では、代理送信権限の基本概念から、PowerShellによる権限管理、CSVファイルを活用した一括設定、自動化の方法まで詳しく解説します。特にExchange Online環境での適用方法についても取り上げるため、オンプレミス環境だけでなく、クラウド環境でも活用できる内容となっています。

PowerShellを活用し、メールボックスの権限管理を効率的に行うことで、運用負荷を軽減し、よりスムーズなメール管理を実現しましょう。

目次

代理送信権限とは

Exchangeにおける代理送信権限の概要

代理送信権限とは、特定のユーザーが別のメールボックスの送信者としてメールを送信できるようにする権限のことです。これにより、例えば、部下が上司のメールボックスを使用してメールを送信する、またはチームメンバーが共通のメールボックス(例:[email protected])から送信することが可能になります。

Exchange環境では、以下の3つの主要な送信権限が存在します:

  1. 送信者として送信(Send As)
  • 他のユーザーになりすましてメールを送信する権限。送信されたメールの差出人は、元のメールボックスの所有者として表示される。
  • 例:部下が上司のメールアカウントになりすましてメールを送る場合に使用。
  1. 代理送信(Send on Behalf)
  • 他のユーザーの代理としてメールを送信する権限。送信されたメールの差出人は「User A から User B に代わって送信」と表示される。
  • 例:秘書が上司の代理でメールを送信する場合に使用。
  1. フルアクセス(Full Access)
  • メールボックス内のすべてのコンテンツにアクセスし、メールを閲覧・削除・整理できる権限。ただし、送信権限は含まれない。
  • 例:サポートチームのメンバーが共通のサポートメールボックスを管理する際に使用。

代理送信権限の必要性

代理送信権限を適切に設定することで、以下のようなメリットがあります。

  • 業務効率の向上
    チームで共通のメールボックスを活用し、適切に代理送信できることで、業務の流れがスムーズになります。
  • セキュリティの強化
    ユーザーごとに適切な権限を付与することで、不適切なアクセスや誤送信を防ぎます。
  • 管理負荷の軽減
    PowerShellを使用した一括管理により、管理者が効率的に権限を設定・確認できるようになります。

このように、代理送信権限の正しい管理は、Exchangeメールボックスの運用において非常に重要な要素となります。次のセクションでは、PowerShellを使用して既存の代理送信権限を確認する方法を解説します。

PowerShellで代理送信権限を確認する方法

既存の代理送信権限を確認する重要性

Exchange環境では、代理送信権限(Send As, Send on Behalf)を適切に管理することが重要です。しかし、多くのユーザーや共有メールボックスを手作業で確認するのは非常に手間がかかります。PowerShellを活用すれば、一括で権限を一覧表示し、不要な権限の整理や権限設定の見直しをスムーズに行うことができます。

代理送信権限(Send As)を確認する

Exchange OnlineやオンプレミスのExchange Serverでは、Get-RecipientPermission コマンドを使用して Send As 権限を確認できます。

Get-RecipientPermission -Identity "メールボックス名" | Where-Object { $_.AccessRights -eq "SendAs" }

例:[email protected] の Send As 権限を確認

Get-RecipientPermission -Identity "[email protected]"

このコマンドを実行すると、該当メールボックスに対して Send As 権限を持つユーザーの一覧が表示されます。

代理送信権限(Send on Behalf)を確認する

Get-Mailbox コマンドを使うことで、代理送信権限を持つユーザーを確認できます。

Get-Mailbox -Identity "メールボックス名" | Select-Object DisplayName,GrantSendOnBehalfTo

例:[email protected] の代理送信権限を確認

Get-Mailbox -Identity "[email protected]" | Select-Object DisplayName,GrantSendOnBehalfTo

このコマンドを実行すると、指定したメールボックスの代理送信を許可されたユーザーの一覧が表示されます。

すべてのメールボックスの代理送信権限を一覧表示

組織内のすべてのメールボックスの代理送信権限を一括で確認するには、以下のコマンドを使用します。

Get-Mailbox -ResultSize Unlimited | Select-Object DisplayName,GrantSendOnBehalfTo

このスクリプトは、組織内のすべてのメールボックスを取得し、それぞれに付与されている代理送信権限を表示します。

すべてのメールボックスの Send As 権限を一覧表示

以下のスクリプトを実行すると、組織内のすべてのメールボックスに設定された Send As 権限を一覧表示できます。

Get-RecipientPermission -ResultSize Unlimited | Where-Object { $_.AccessRights -eq "SendAs" } | Select-Object Identity,Trustee,AccessRights

出力例

Identity               Trustee             AccessRights
--------------------------------------------------------
[email protected]    [email protected]   {SendAs}
[email protected]    [email protected]   {SendAs}

CSVファイルにエクスポート

権限の確認結果をCSVファイルに出力し、Excelで整理することも可能です。

Get-RecipientPermission -ResultSize Unlimited | Where-Object { $_.AccessRights -eq "SendAs" } | Select-Object Identity,Trustee,AccessRights | Export-Csv -Path "C:\Exchange_SendAs_Permissions.csv" -NoTypeInformation

このスクリプトを実行すると、C:\Exchange_SendAs_Permissions.csv に Send As 権限の一覧が保存されます。

まとめ

PowerShellを活用すれば、Exchangeの代理送信権限を一括で確認し、管理を効率化できます。
次のセクションでは、PowerShellを使って代理送信権限を付与する方法を解説します。

代理送信権限を付与するPowerShellコマンド

PowerShellで代理送信権限を設定する重要性

Exchange環境では、特定のユーザーに対して適切な代理送信権限(Send As, Send on Behalf)を付与することで、業務の効率化を図れます。手動で設定するのは非効率なため、PowerShellを使って迅速かつ正確に権限を付与する方法を紹介します。


1. Send As 権限を付与する

Send As 権限を付与すると、対象ユーザーが別のメールアドレスになりすましてメールを送信できるようになります。

コマンド:

Add-RecipientPermission -Identity "メールボックス名" -Trustee "ユーザー名" -AccessRights SendAs -Confirm:$false

使用例:

Add-RecipientPermission -Identity "[email protected]" -Trustee "[email protected]" -AccessRights SendAs -Confirm:$false

このコマンドにより、[email protected] は [email protected] のメールアドレスを使ってメールを送信できるようになります。

設定の確認方法

Get-RecipientPermission -Identity "[email protected]" | Where-Object { $_.AccessRights -eq "SendAs" }

2. Send on Behalf 権限を付与する

Send on Behalf 権限を付与すると、メールの送信者が「User A から User B に代わって送信しました」と表示されるようになります。

コマンド:

Set-Mailbox -Identity "メールボックス名" -GrantSendOnBehalfTo "ユーザー名"

使用例:

Set-Mailbox -Identity "[email protected]" -GrantSendOnBehalfTo "[email protected]"

この設定を適用すると、[email protected] が [email protected] の代理でメールを送信できるようになります。

設定の確認方法

Get-Mailbox -Identity "[email protected]" | Select-Object GrantSendOnBehalfTo

3. フルアクセス権限を付与する(補足)

Full Access 権限を付与すると、対象のユーザーはメールボックス内のすべてのメールを閲覧・管理できるようになります。ただし、送信権限は含まれません。

コマンド:

Add-MailboxPermission -Identity "メールボックス名" -User "ユーザー名" -AccessRights FullAccess -InheritanceType All

使用例:

Add-MailboxPermission -Identity "[email protected]" -User "[email protected]" -AccessRights FullAccess -InheritanceType All

設定の確認方法

Get-MailboxPermission -Identity "[email protected]"

4. CSVを活用して一括設定

多くのユーザーに一括で代理送信権限を付与する場合、CSVファイルを利用すると効率的です。

CSVファイルの例(C:\MailPermissions.csv)

Mailbox,User,PermissionType
[email protected],[email protected],SendAs
[email protected],[email protected],SendOnBehalf

CSVを読み込んで一括適用するスクリプト

$permissions = Import-Csv -Path "C:\MailPermissions.csv"

foreach ($entry in $permissions) {
    if ($entry.PermissionType -eq "SendAs") {
        Add-RecipientPermission -Identity $entry.Mailbox -Trustee $entry.User -AccessRights SendAs -Confirm:$false
    } elseif ($entry.PermissionType -eq "SendOnBehalf") {
        Set-Mailbox -Identity $entry.Mailbox -GrantSendOnBehalfTo $entry.User
    }
}

5. 代理送信権限をリアルタイムで適用する(Exchange Onlineの場合)

Exchange Online環境でPowerShellスクリプトを実行するには、まずセッションを確立する必要があります。

Exchange Online PowerShellに接続

Connect-ExchangeOnline -UserPrincipalName [email protected]

その後、通常の Add-RecipientPermission や Set-Mailbox コマンドを実行できます。

セッションの終了

Disconnect-ExchangeOnline -Confirm:$false

まとめ

PowerShellを活用することで、Exchangeメールボックスの代理送信権限を迅速かつ効率的に管理できます。

  • Send As:メールを他のユーザーになりすまして送信
  • Send on Behalf:代理で送信(送信者が明示される)
  • Full Access:メールの閲覧・管理が可能(送信は不可)
  • CSVを利用すれば、大規模環境でも一括設定が可能

次のセクションでは、不要になった代理送信権限を削除する方法を解説します。

代理送信権限を削除するPowerShellコマンド

代理送信権限を削除する重要性

適切な権限管理を行わないと、退職者や役割変更のあったユーザーが引き続きメールボックスを利用できる状態になり、セキュリティリスクが発生する可能性があります。PowerShellを活用することで、不要になった代理送信権限(Send As、Send on Behalf)を迅速に削除できます。


1. Send As 権限を削除する

コマンド:

Remove-RecipientPermission -Identity "メールボックス名" -Trustee "ユーザー名" -AccessRights SendAs -Confirm:$false

使用例:

Remove-RecipientPermission -Identity "[email protected]" -Trustee "[email protected]" -AccessRights SendAs -Confirm:$false

このコマンドを実行すると、[email protected] は [email protected] のメールアドレスを使って送信する権限を失います。

削除後の確認

Get-RecipientPermission -Identity "[email protected]" | Where-Object { $_.AccessRights -eq "SendAs" }

2. Send on Behalf 権限を削除する

コマンド:

Set-Mailbox -Identity "メールボックス名" -GrantSendOnBehalfTo @{remove="ユーザー名"}

使用例:

Set-Mailbox -Identity "[email protected]" -GrantSendOnBehalfTo @{remove="[email protected]"}

このコマンドを実行すると、[email protected] は [email protected] の代理送信権限を失います。

削除後の確認

Get-Mailbox -Identity "[email protected]" | Select-Object DisplayName,GrantSendOnBehalfTo

3. フルアクセス権限を削除する(補足)

Full Access 権限が不要になった場合も削除できます。

コマンド:

Remove-MailboxPermission -Identity "メールボックス名" -User "ユーザー名" -AccessRights FullAccess -Confirm:$false

使用例:

Remove-MailboxPermission -Identity "[email protected]" -User "[email protected]" -AccessRights FullAccess -Confirm:$false

削除後の確認

Get-MailboxPermission -Identity "[email protected]"

4. CSVを活用して一括削除する

複数のユーザーから権限を削除する場合、CSVファイルを利用すると便利です。

CSVファイルの例(C:\RemoveMailPermissions.csv)

Mailbox,User,PermissionType
[email protected],[email protected],SendAs
[email protected],[email protected],SendOnBehalf

CSVを読み込んで一括削除するスクリプト

$permissions = Import-Csv -Path "C:\RemoveMailPermissions.csv"

foreach ($entry in $permissions) {
    if ($entry.PermissionType -eq "SendAs") {
        Remove-RecipientPermission -Identity $entry.Mailbox -Trustee $entry.User -AccessRights SendAs -Confirm:$false
    } elseif ($entry.PermissionType -eq "SendOnBehalf") {
        Set-Mailbox -Identity $entry.Mailbox -GrantSendOnBehalfTo @{remove=$entry.User}
    }
}

このスクリプトを実行すると、CSVファイルに記載されたすべてのユーザーの代理送信権限が削除されます。


5. Exchange Online環境での削除

Exchange Online環境では、PowerShellセッションを確立してからコマンドを実行する必要があります。

Exchange Online PowerShellに接続

Connect-ExchangeOnline -UserPrincipalName [email protected]

その後、通常の Remove-RecipientPermission や Set-Mailbox コマンドを実行できます。

セッションの終了

Disconnect-ExchangeOnline -Confirm:$false

まとめ

PowerShellを使うことで、不要になった代理送信権限を効率的に削除できます。

  • Send As 権限の削除は Remove-RecipientPermission を使用
  • Send on Behalf 権限の削除は Set-Mailbox で @{remove="ユーザー名"} を指定
  • Full Access 権限の削除は Remove-MailboxPermission を使用
  • CSVを利用すれば、一括削除が可能
  • Exchange Online環境では、PowerShellセッションを確立した後に実行

次のセクションでは、CSVを活用した一括管理の方法を詳しく解説します。

CSVを使った一括管理の方法

一括管理の重要性

組織のExchange環境では、複数のメールボックスの代理送信権限を管理する必要があります。手動で1つずつ設定すると、ミスが発生しやすく、時間もかかります。そこで、PowerShellとCSVファイルを活用して、代理送信権限の付与・削除を一括で実行する方法を紹介します。


1. CSVファイルの準備

まず、一括管理用のCSVファイルを作成します。以下のフォーマットで作成し、C:\MailPermissions.csv に保存します。

各列の意味:

  • Mailbox:対象となるメールボックス
  • User:権限を付与または削除するユーザー
  • PermissionType:
  • SendAs(送信者として送信)
  • SendOnBehalf(代理送信)
  • FullAccess(フルアクセス)

2. CSVを使って代理送信権限を一括付与

以下のPowerShellスクリプトを実行すると、CSVファイルの内容を元に、各ユーザーに適切な代理送信権限を一括付与できます。

$permissions = Import-Csv -Path "C:\MailPermissions.csv"

foreach ($entry in $permissions) {
    if ($entry.PermissionType -eq "SendAs") {
        Add-RecipientPermission -Identity $entry.Mailbox -Trustee $entry.User -AccessRights SendAs -Confirm:$false
    } elseif ($entry.PermissionType -eq "SendOnBehalf") {
        Set-Mailbox -Identity $entry.Mailbox -GrantSendOnBehalfTo @{add=$entry.User}
    } elseif ($entry.PermissionType -eq "FullAccess") {
        Add-MailboxPermission -Identity $entry.Mailbox -User $entry.User -AccessRights FullAccess -InheritanceType All
    }
}

処理の流れ:

  1. Import-Csv コマンドでCSVファイルを読み込みます。
  2. 各行の PermissionType に応じて適切なコマンドを実行します。
  • SendAs の場合 → Add-RecipientPermission
  • SendOnBehalf の場合 → Set-Mailbox
  • FullAccess の場合 → Add-MailboxPermission

3. CSVを使って代理送信権限を一括削除

不要になった代理送信権限を一括削除する場合も、同様にCSVを利用できます。

CSVのフォーマット(C:\RemoveMailPermissions.csv)

PowerShellスクリプト

$permissions = Import-Csv -Path "C:\RemoveMailPermissions.csv"

foreach ($entry in $permissions) {
    if ($entry.PermissionType -eq "SendAs") {
        Remove-RecipientPermission -Identity $entry.Mailbox -Trustee $entry.User -AccessRights SendAs -Confirm:$false
    } elseif ($entry.PermissionType -eq "SendOnBehalf") {
        Set-Mailbox -Identity $entry.Mailbox -GrantSendOnBehalfTo @{remove=$entry.User}
    } elseif ($entry.PermissionType -eq "FullAccess") {
        Remove-MailboxPermission -Identity $entry.Mailbox -User $entry.User -AccessRights FullAccess -Confirm:$false
    }
}

このスクリプトを実行すると、CSVファイルに記載された権限が一括削除されます。


4. 処理結果をログとして保存

権限の変更が適用されたことを記録するため、CSVに処理結果を保存する方法もあります。

$logFile = "C:\MailPermissionChanges.log"
$permissions = Import-Csv -Path "C:\MailPermissions.csv"

foreach ($entry in $permissions) {
    if ($entry.PermissionType -eq "SendAs") {
        Add-RecipientPermission -Identity $entry.Mailbox -Trustee $entry.User -AccessRights SendAs -Confirm:$false
        Add-Content -Path $logFile -Value "$($entry.Mailbox) - SendAs granted to $($entry.User) at $(Get-Date)"
    } elseif ($entry.PermissionType -eq "SendOnBehalf") {
        Set-Mailbox -Identity $entry.Mailbox -GrantSendOnBehalfTo @{add=$entry.User}
        Add-Content -Path $logFile -Value "$($entry.Mailbox) - SendOnBehalf granted to $($entry.User) at $(Get-Date)"
    } elseif ($entry.PermissionType -eq "FullAccess") {
        Add-MailboxPermission -Identity $entry.Mailbox -User $entry.User -AccessRights FullAccess -InheritanceType All
        Add-Content -Path $logFile -Value "$($entry.Mailbox) - FullAccess granted to $($entry.User) at $(Get-Date)"
    }
}

このスクリプトを実行すると、C:\MailPermissionChanges.log に処理結果が記録され、管理がしやすくなります。


5. Exchange Onlineでの実行方法

Exchange OnlineでCSVを使った一括管理を行う場合、PowerShellセッションを確立する必要があります。

Exchange Onlineに接続

Connect-ExchangeOnline -UserPrincipalName [email protected]

その後、通常の Add-RecipientPermission や Set-Mailbox コマンドを利用できます。
処理が完了したら、セッションを終了します。

セッションの終了

Disconnect-ExchangeOnline -Confirm:$false

まとめ

PowerShellとCSVを組み合わせることで、Exchangeメールボックスの代理送信権限を一括で管理できます。

  • CSVファイルを作成し、付与または削除する権限をリスト化
  • PowerShellスクリプトを実行して一括処理
  • 処理結果をログに記録して管理を簡単に
  • Exchange Onlineでも適用可能

次のセクションでは、スクリプトの実行時に発生する可能性のあるエラーとその解決策について解説します。

スクリプトの実行時の注意点とトラブルシューティング

PowerShellで代理送信権限を管理する際の注意点

PowerShellを使ってExchangeメールボックスの代理送信権限を設定する際、いくつかのエラーが発生することがあります。権限の不足、コマンドの誤り、接続の問題など、考えられるエラーとその解決策を紹介します。


1. 一般的なエラーと解決策

エラー1:権限不足エラー

エラーメッセージ:

The operation couldn't be performed because object '[email protected]' couldn't be found on 'EXCH01.example.com'.

または

Access is denied. You don't have permission to perform this action.

原因:

  • 実行しているPowerShellセッションのユーザーに、Exchange管理権限がない。
  • コマンドを実行しているユーザーが適切な役割(Role)を持っていない。

解決策:

  1. 管理者権限でPowerShellを起動し、適切なExchange管理ロールが割り当てられていることを確認。
  2. 自分のユーザーが “Organization Management” や “Recipient Management” グループに属しているかを確認。

グループメンバーを確認するコマンド

Get-ManagementRoleAssignment -Role "Mail Recipients" | Where-Object {$_.RoleAssigneeName -eq "[email protected]"}
  1. 必要な権限がない場合、管理者に依頼して追加。
New-ManagementRoleAssignment -Role "Mail Recipients" -User "[email protected]"

エラー2:メールボックスが見つからない

エラーメッセージ:

Cannot bind argument to parameter 'Identity' because it is null.

または

The specified mailbox does not exist.

原因:

  • 指定したメールボックス名が間違っている。
  • メールボックスがExchange OnlineまたはオンプレミスのActive Directoryに存在しない。
  • Exchange Onlineとオンプレミスの間で同期の遅延が発生している。

解決策:

  1. メールボックスの存在を確認
Get-Mailbox -Identity "[email protected]"
  1. メールボックスがない場合は、正しいメールアドレスを指定する
Get-Mailbox | Select-Object DisplayName,PrimarySmtpAddress
  1. 同期遅延が原因の場合は、しばらく待つ
    Azure AD Connect の同期を手動で実行することも可能。
Start-ADSyncSyncCycle -PolicyType Delta

エラー3:既に権限が付与されている

エラーメッセージ:

A recipient with the same identity already has this permission.

原因:

  • 指定したユーザーにすでに同じ代理送信権限が付与されている。

解決策:

  1. 既存の権限を確認
Get-RecipientPermission -Identity "[email protected]" | Where-Object { $_.Trustee -eq "[email protected]" }
  1. 不要な重複を避けるために、一旦削除して再追加
Remove-RecipientPermission -Identity "[email protected]" -Trustee "[email protected]" -AccessRights SendAs -Confirm:$false
Add-RecipientPermission -Identity "[email protected]" -Trustee "[email protected]" -AccessRights SendAs -Confirm:$false

2. スクリプト実行時の確認ポイント

1. Exchange Onlineへの接続確認

Exchange OnlineにPowerShellで接続する前に、セッションを確立しているか確認。

接続コマンド

Connect-ExchangeOnline -UserPrincipalName [email protected]

セッションが切れている場合は再接続

Disconnect-ExchangeOnline -Confirm:$false
Connect-ExchangeOnline -UserPrincipalName [email protected]

2. PowerShellのバージョンとモジュールの確認

最新のExchange Online PowerShellモジュールを使用しているか確認。

Exchange Online PowerShellモジュールのインストール

Install-Module ExchangeOnlineManagement

最新バージョンの確認

Get-Module ExchangeOnlineManagement -ListAvailable

モジュールを更新

Update-Module ExchangeOnlineManagement

3. ログの活用

スクリプトの実行結果をログに出力し、後から確認できるようにしておくと便利。

スクリプトの実行結果をログに記録

$logFile = "C:\MailPermissionLog.txt"
$permissions = Import-Csv -Path "C:\MailPermissions.csv"

foreach ($entry in $permissions) {
    try {
        if ($entry.PermissionType -eq "SendAs") {
            Add-RecipientPermission -Identity $entry.Mailbox -Trustee $entry.User -AccessRights SendAs -Confirm:$false
            Add-Content -Path $logFile -Value "$(Get-Date) : SendAs granted to $($entry.User) on $($entry.Mailbox)"
        } elseif ($entry.PermissionType -eq "SendOnBehalf") {
            Set-Mailbox -Identity $entry.Mailbox -GrantSendOnBehalfTo @{add=$entry.User}
            Add-Content -Path $logFile -Value "$(Get-Date) : SendOnBehalf granted to $($entry.User) on $($entry.Mailbox)"
        }
    } catch {
        Add-Content -Path $logFile -Value "$(Get-Date) : ERROR - $($_.Exception.Message)"
    }
}

まとめ

PowerShellでExchangeの代理送信権限を設定・削除する際、さまざまなエラーが発生する可能性があります。

  • 権限不足:Exchange管理者権限を確認し、適切なロールを割り当てる
  • メールボックスが見つからない:正しいメールボックス名を使用し、同期遅延がないか確認
  • 既に権限が付与されている:重複を防ぐために事前に確認し、不要な権限を削除
  • Exchange Onlineの接続エラー:セッションを再確立し、モジュールを最新に更新
  • ログを活用し、スクリプト実行の結果を記録して問題の特定を容易にする

次のセクションでは、スクリプトをスケジュール実行し、定期的に権限管理を自動化する方法を解説します。

スクリプトのスケジュール実行設定

代理送信権限管理を自動化する重要性

Exchange環境では、組織内の役割変更や人事異動が頻繁に発生するため、代理送信権限の管理を手動で行うと負担が大きくなります。PowerShellスクリプトを Windowsタスクスケジューラ を利用して定期的に実行することで、権限管理を自動化し、管理ミスを防ぐことができます。


1. 自動実行するPowerShellスクリプトの準備

まず、定期的に実行するPowerShellスクリプト(例:C:\Scripts\ManageMailboxPermissions.ps1)を作成します。

$logFile = "C:\Scripts\MailPermissionLog.txt"
$csvFile = "C:\Scripts\MailPermissions.csv"

# CSVファイルの存在を確認
if (Test-Path $csvFile) {
    $permissions = Import-Csv -Path $csvFile

    foreach ($entry in $permissions) {
        try {
            if ($entry.PermissionType -eq "SendAs") {
                Add-RecipientPermission -Identity $entry.Mailbox -Trustee $entry.User -AccessRights SendAs -Confirm:$false
                Add-Content -Path $logFile -Value "$(Get-Date) : SendAs granted to $($entry.User) on $($entry.Mailbox)"
            } elseif ($entry.PermissionType -eq "SendOnBehalf") {
                Set-Mailbox -Identity $entry.Mailbox -GrantSendOnBehalfTo @{add=$entry.User}
                Add-Content -Path $logFile -Value "$(Get-Date) : SendOnBehalf granted to $($entry.User) on $($entry.Mailbox)"
            }
        } catch {
            Add-Content -Path $logFile -Value "$(Get-Date) : ERROR - $($_.Exception.Message)"
        }
    }
} else {
    Add-Content -Path $logFile -Value "$(Get-Date) : ERROR - CSV file not found!"
}

2. Windowsタスクスケジューラでスクリプトを自動実行する

Windowsタスクスケジューラを利用して、PowerShellスクリプトを定期的に実行する手順を説明します。

① タスクスケジューラを開く

  1. Windows + R を押して 「taskschd.msc」 と入力し、「OK」 をクリック。
  2. 「タスクスケジューラライブラリ」 を開き、右側の 「基本タスクの作成」 をクリック。

② タスクの基本情報を設定

  1. 名前(例:MailboxPermissionsManagement)を入力し、「次へ」。
  2. 「トリガー」 の設定(実行タイミング):
  • 毎日実行する場合 → 「毎日」 を選択
  • 毎週実行する場合 → 「毎週」 を選択
  • カスタムのスケジュール設定が必要な場合は「詳細設定」を利用

③ 実行プログラムの設定

  1. 「操作」 の設定で 「プログラムの開始」 を選択。
  2. 「プログラム/スクリプト」 の欄に以下のように入力:
   powershell.exe
  1. 「引数の追加」 の欄に実行するスクリプトのパスを入力:
   -ExecutionPolicy Bypass -File "C:\Scripts\ManageMailboxPermissions.ps1"
  1. 「次へ」 をクリックし、設定を完了。

3. Exchange Onlineでのスケジュール実行

Exchange Online環境でスクリプトを定期実行する場合、最初に 認証情報の自動入力 を設定する必要があります。通常、Connect-ExchangeOnline を手動で実行する必要がありますが、これを自動化する方法を紹介します。

① 認証情報を安全に保存する

  1. PowerShell認証情報を暗号化して保存
$cred = Get-Credential
$cred | Export-Clixml -Path "C:\Scripts\ExchangeCred.xml"

(管理者アカウントの認証情報を入力)

  1. スクリプト内で認証情報を読み込み、自動ログイン
$cred = Import-Clixml -Path "C:\Scripts\ExchangeCred.xml"
Connect-ExchangeOnline -Credential $cred
  1. タスクスケジューラでスクリプトをスケジュール実行
  • Windowsタスクスケジューラの設定手順は 「2. Windowsタスクスケジューラでスクリプトを自動実行する」 の内容と同じ。

4. スケジュール実行の確認

タスクが正しく実行されているかを確認する方法:

① タスク履歴を確認

  1. タスクスケジューラを開く。
  2. 「タスクスケジューラライブラリ」 から設定したタスクを選択。
  3. 「履歴」 タブで、実行状況を確認。

② ログファイルを確認

スクリプトの実行結果を C:\Scripts\MailPermissionLog.txt に保存することで、エラー発生時に原因を特定できます。

Get-Content "C:\Scripts\MailPermissionLog.txt"

5. スクリプトの変更時にタスクを更新する

スケジュール実行するスクリプトを変更した場合、タスクスケジューラの設定も適宜更新する必要があります。

  1. タスクを無効化
   Disable-ScheduledTask -TaskName "MailboxPermissionsManagement"
  1. スクリプトを修正
  2. タスクを再有効化
   Enable-ScheduledTask -TaskName "MailboxPermissionsManagement"
  1. 手動実行で動作確認
   Start-ScheduledTask -TaskName "MailboxPermissionsManagement"

まとめ

PowerShellスクリプトとWindowsタスクスケジューラを組み合わせることで、Exchangeメールボックスの代理送信権限を定期的に管理・更新できます。

  • Windowsタスクスケジューラを使ってスクリプトを定期実行
  • Exchange Onlineでは認証情報を事前に保存して自動ログイン
  • スクリプトの実行履歴をログに記録し、トラブルシューティングを容易に
  • スクリプト更新時はタスクスケジューラも適宜更新

次のセクションでは、Exchange Online環境におけるスクリプトの適用方法について詳しく解説します。

Exchange Online環境での適用方法

Exchange Onlineとオンプレミスの違い

Exchange Online は Microsoft 365 のクラウドベースのメールサービスであり、オンプレミスの Exchange Server とは管理方法が異なります。特に PowerShell を用いた管理では、 Exchange Online PowerShell モジュール を使用する必要があります。

主な違い:

項目オンプレミス ExchangeExchange Online
管理ツールExchange Management ShellExchange Online PowerShell
認証方法ドメインユーザー認証Microsoft 365 認証(OAuth)
PowerShell 接続直接管理サーバーへ接続Connect-ExchangeOnline を使用
スクリプト実行直接サーバー上で実行可能クラウド環境のため事前認証が必要

1. Exchange Online PowerShell への接続

Exchange Online 環境で PowerShell を使用するには、専用のモジュール ExchangeOnlineManagement をインストールし、セッションを確立する必要があります。

Exchange Online PowerShell モジュールのインストール

最初に、PowerShell で Exchange Online PowerShell モジュールをインストールします。

Install-Module ExchangeOnlineManagement

モジュールが既にインストールされているか確認

Get-Module ExchangeOnlineManagement -ListAvailable

モジュールを更新

Update-Module ExchangeOnlineManagement

Exchange Online に接続

次に、Exchange Online に接続します。

Connect-ExchangeOnline -UserPrincipalName [email protected]

管理者権限を持つ Microsoft 365 アカウントの認証情報を入力すると、セッションが確立されます。


2. Exchange Online で代理送信権限を管理

Exchange Online では、代理送信権限(Send As / Send on Behalf)を PowerShell で管理できます。

Send As 権限を付与

Add-RecipientPermission -Identity "[email protected]" -Trustee "[email protected]" -AccessRights SendAs -Confirm:$false

Send on Behalf 権限を付与

Set-Mailbox -Identity "[email protected]" -GrantSendOnBehalfTo @{add="[email protected]"}

権限の確認

Get-RecipientPermission -Identity "[email protected]" | Where-Object { $_.AccessRights -eq "SendAs" }
Get-Mailbox -Identity "[email protected]" | Select-Object GrantSendOnBehalfTo

権限の削除

Remove-RecipientPermission -Identity "[email protected]" -Trustee "[email protected]" -AccessRights SendAs -Confirm:$false
Set-Mailbox -Identity "[email protected]" -GrantSendOnBehalfTo @{remove="[email protected]"}

3. CSVを利用した一括管理

大量のメールボックスの代理送信権限を管理する場合、CSVを活用すると効率的です。

CSVファイルの作成

C:\Scripts\MailPermissions.csv

Mailbox,User,PermissionType
[email protected],[email protected],SendAs
[email protected],[email protected],SendOnBehalf

PowerShell スクリプト

$permissions = Import-Csv -Path "C:\Scripts\MailPermissions.csv"

foreach ($entry in $permissions) {
    if ($entry.PermissionType -eq "SendAs") {
        Add-RecipientPermission -Identity $entry.Mailbox -Trustee $entry.User -AccessRights SendAs -Confirm:$false
    } elseif ($entry.PermissionType -eq "SendOnBehalf") {
        Set-Mailbox -Identity $entry.Mailbox -GrantSendOnBehalfTo @{add=$entry.User}
    }
}

スクリプトの実行

.\Scripts\ManageMailboxPermissions.ps1

4. Exchange Online でスクリプトをスケジュール実行

Exchange Online のスクリプトを Windows タスクスケジューラ で定期実行するには、認証情報の保存が必要になります。

認証情報の保存

$cred = Get-Credential
$cred | Export-Clixml -Path "C:\Scripts\ExchangeCred.xml"

認証情報を使用したスクリプト

$cred = Import-Clixml -Path "C:\Scripts\ExchangeCred.xml"
Connect-ExchangeOnline -Credential $cred

$permissions = Import-Csv -Path "C:\Scripts\MailPermissions.csv"

foreach ($entry in $permissions) {
    if ($entry.PermissionType -eq "SendAs") {
        Add-RecipientPermission -Identity $entry.Mailbox -Trustee $entry.User -AccessRights SendAs -Confirm:$false
    } elseif ($entry.PermissionType -eq "SendOnBehalf") {
        Set-Mailbox -Identity $entry.Mailbox -GrantSendOnBehalfTo @{add=$entry.User}
    }
}

Disconnect-ExchangeOnline -Confirm:$false

タスクスケジューラの設定

  • 「プログラム/スクリプト」: powershell.exe
  • 「引数」:
  -ExecutionPolicy Bypass -File "C:\Scripts\ManageMailboxPermissions.ps1"

5. Exchange Online での注意点

1. OAuth 認証の有効化

Exchange Online では、基本認証(Basic Authentication)は無効化されており、OAuth 認証が必須 です。認証情報を保存する方法では ExchangeOnlineManagement の -Credential オプションが使えない場合があるため、App Password(アプリパスワード) や Azure AD 認証 を検討する必要があります。

2. M365 セキュリティポリシー

Microsoft 365 ではセキュリティ強化のため、管理者権限を持つアカウントでの自動ログインが制限されることがあります。管理者アカウントに対して 「条件付きアクセス」 が設定されていないか確認しましょう。

3. 権限の反映に時間がかかる

Exchange Online では、代理送信権限が即時反映されない 場合があります。特に Send As 権限は、最大2時間ほど反映に時間がかかる ことがあります。

4. セッションの切断

長時間セッションを開いたままにすると、Microsoft 365 によって 自動的に切断される 場合があります。そのため、スクリプト実行後は Disconnect-ExchangeOnline を実行するのが推奨されます。

Disconnect-ExchangeOnline -Confirm:$false

まとめ

Exchange Online では、オンプレミスとは異なる管理方法が求められます。

  • Exchange Online PowerShell モジュールをインストール し、 Connect-ExchangeOnline を使用
  • CSV を活用して大量の権限を一括管理
  • 認証情報を保存し、タスクスケジューラで自動実行可能
  • M365 セキュリティポリシーを考慮し、権限設定の反映時間に注意

次のセクションでは、この記事のまとめを行います。

まとめ

本記事では、PowerShell を活用して Exchange メールボックスの代理送信権限を一括管理する方法 について詳しく解説しました。手動での権限管理は手間がかかり、ミスが発生しやすいため、スクリプトを活用することで 効率的かつ正確な管理 が可能になります。

学んだポイント

  • 代理送信権限の基礎
  • Send As(なりすまし送信)
  • Send on Behalf(代理送信)
  • Full Access(メールボックス管理)
  • PowerShell コマンドでの権限管理
  • Get-RecipientPermission / Get-Mailbox で 既存の権限を確認
  • Add-RecipientPermission / Set-Mailbox で 代理送信権限を付与
  • Remove-RecipientPermission / Set-Mailbox -GrantSendOnBehalfTo @{remove=} で 権限を削除
  • CSV を活用した一括管理
  • PowerShell で 複数のユーザーに一括で権限を適用・削除 する方法を解説
  • スクリプトを自動化 し、メンテナンスの手間を削減
  • スクリプトのスケジュール実行
  • Windows タスクスケジューラを利用し、定期的に実行
  • ログを記録してエラーのトラブルシューティングを容易に
  • Exchange Online への適用
  • Connect-ExchangeOnline を利用し、クラウド環境でも PowerShell による管理を実現
  • M365 のセキュリティポリシーを考慮 し、認証の自動化を工夫

結論

PowerShell を活用することで、Exchange メールボックスの代理送信権限を 迅速かつ正確に管理 できます。特に、大規模な組織や頻繁な権限変更が発生する環境では、スクリプトの自動化 によって、運用負荷を大幅に軽減できます。

今後、管理の効率化を進めるために、スクリプトの最適化 や 自動化ツールとの連携 を検討すると、さらに効果的な運用が可能になります。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次