Exchange OnlineをPowerShellで操作する2(社内にばらまいた不適切なメールを削除する)

前回に引き続き、GUIでは実施できなくてPowerShellでないと実行できないのに、少しリファレンスが少なく感じた機能を紹介します。

(Exchange Onlineサービス説明より)
また、管理者は、複数の組織の複数のメールボックスに送信された不適切な電子メール メッセージを検索して削除することができます。たとえば、機密の給与情報がすべての従業員に誤って電子メールで送信された場合、管理者はユーザーのメールボックスからその電子メールを削除できます。

個人的には良い機能ですが、役員には知られたくない機能ですね。「○○君、実はさっき間違えてこんなメールを社内に送ってしまったのだが…」とか(w

クライアントがOutlookを利用している場合は、すぐに送信済みボックスを開いて、取り消しメールを送れば済むことも有りますが、OWAを利用している場合や、そもそもそんなクライアントの機能を知っているような人はこんな事にはならないという話も。

という訳で、PowerShellを利用してこれに対応してみましょう。Search For and Delete Messages from Users’ Mailboxes あたりが参考になります。

まずは該当メールを特定します。該当メールを絞り込むため、なるべく多くの条件を聞き出します。「タイトル」「だいたいの送信日時」「送信者」「送信先(To)」「Cc」「添付ファイル名」などでしょうか。

ここでは、hoge@example.comさんが7/3の朝8:00くらいに社内ALLにばらまいた、タイトル「昨日は楽しかったよ」を削除することをしたいと思います。

前提として、この作業はユーザのメールボックスの中身を検索・操作する必要があるので、通常の管理者では持っていない特権を付与する必要があります(通常の管理者アカウントだとSearch-Mailboxコマンドレット自体が利用できません)。Mailbox Import ExportMailbox Searchの権限が必要になりますが、ビルトインの役割グループには適した物が無いので、ここでは新規に作成して、管理者のアカウントに割り当てます。

そして、権限を割り当てられたユーザでExchange OnlineにPowerShellで接続します。接続が完了したあと、まずは対象のメールのみを取り出すクエリを作ります。この辺を参照に、今回の条件を-SearchQueryの条件の中にカンマ区切りで記載します。そして、-LogOnlyオプションを付けて実行します。

注意なのですが、Sent条件で指定する日付は、MM/DD/YYYY形式のUTC時間(日本の場合は-9時間した値)ですので、今回は7月2日として検索します。

Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery "subject:'昨日は楽しかったよ', Sent:07/02/2011" -TargetMailbox admin -TargetFolder SearchAndDelete -LogLevel Full -LogOnly

これにより、adminさんのSearchAndDeleteフォルダに、検索結果の詳細レポートが格納されます。こちらの情報(添付されているCSVファイル)などを元に、問題ないと判断したら、-DeleteContentオプションを付けて実行します。

Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery "subject:'昨日は楽しかったよ', Sent:07/02/2011" -DeleteContent

間違えて他のメールを削除してしまった時の為や、後々の為?に削除するメールのコピーを念のため取っておく必要がある場合は、先ほどのコマンドに-TargetMailboxと-TargetFolderオプションを付けて実行します。

Get-Mailbox -ResultSize unlimited | Search-Mailbox -SearchQuery "subject:'昨日は楽しかったよ', Sent:07/02/2011" -TargetMailbox admin -TargetFolder SearchAndDelete -DeleteContent

こうすると、検索されたメールは削除されて、メールのコピーが先ほどレポートが格納されていたフォルダ配下に、ユーザ名-実行日時(UTC)-メールボックス名-フォルダ名の階層構造として格納されます。

ちなみに、上で実施した管理アカウントへの特権割り当てやそれを利用したメールボックス操作などは、当然ながら全て監査ログに記録されておりますので、後で何か有ったときの防衛のため、依頼主からの正当な申請に基づいて実施した旨、しっかりとエビデンスは残しておくことをお勧めします。

Exchange OnlineをPowerShellで操作する(共有メールボックス)

Office 365のExchange Onlineは、Exchange 2010同様PowerShellで各種操作が可能です。Exchange管理コンソール(EMC)が提供されていない分、細かい操作をしようとするとPowerShellでの操作が必須となります。

Exchange Onlineサービスの詳細などにも、「リモートPowerShellを利用して、~が可能です」という記載を多く見かけます。コマンド例などが記載していない物も多いので、いくつか紹介したいと思います。

  1. 複数人から利用できるメールボックス(共有メールボックス)を作成する
  2. Fromで通常利用するメールアドレスを変更する
  3. 他のFromアドレスでメールを送る(=送信者アクセス権(SendAs)をユーザに与える)

まず、共有メールボックスはNew-Mailboxコマンドに-Sharedオプションを付けて作成します。共有メールボックスはサブスクリプションは必要ないのですが、(ログオン不可の)ユーザオブジェクトは作成されますので、AD FS環境で作成する場合は、フェデレーションドメイン以外(xxx.onmicrosoft.comドメインなど)で作成する必要があります。

New-Mailbox -Name "共有メールボックス1" -Shared -Alias share1

次に、share1@xxx.onmicrosoft.comのアカウントのFromで利用するアドレスとして、独自ドメインのshare1@example.comを利用するように設定します。Set-Mailboxコマンドの-EmailAddressesオプションに受信するアドレス一覧を指定します(メインで利用する物のみSMTP:で、他はsmtp:で記載します)。

$NewEmailAddresses = @()
$NewEmailAddresses += ("SMTP:share1@example.com")
$Temp = Get-Mailbox -Identity "共有メールボックス1"
$NewEmailAddresses += ($Temp.EmailAddresses -replace "^SMTP" , "smtp")
Set-Mailbox -Identity "共有メールボックス1" -EmailAddresses $NewEmailAddresses

次に、この共有メールボックスへのアクセス権を設定します。その共有メールボックスを開くために必要なFullAccess権はAdd-MailboxPermission権で、その共有メールボックスのアドレスでメールを送信できる権限をAdd-RecipientPermission(※Office365の場合はAdd-ADPermission -Extendedrightsでは有りません)コマンドで付与します。

New-DistributionGroup -Name "共有メールボックス1グループ" -Alias share1g -CopyOwnerToMember -ManagedBy "testuserone" -Type Security
Set-DistributionGroup share1g -HiddenFromAddressListsEnabled $true
Add-MailboxPermission -Identity "共有メールボックス1" -User share1g -AccessRights FullAccess
Add-RecipientPermission -Identity "共有メールボックス1" -Trustee share1g -AccessRights SendAs -Confirm:$False

これで準備は完了です…が、結構このコマンドを実行した後、クラウド内のActive Directoryに権限情報が行き渡るのに時間が掛かります。(手元の環境だと1時間掛かりました。)

作成した共有メールボックスの開き方ですが、Outlookの場合はアカウント設定の[電子メール][変更][詳細設定]から詳細設定タブの[メールボックス][追加]から作成した共有メールボックスを指定すると、自分のアカウントの下に追加されます。共有メールボックス宛に来たメールに返信すると、自動的にFromアドレスも共有メールボックスになります。

つぎに、OWAの場合ですが、まずアカウントごと開く場合は右上の自分のアカウント名のプルダウンメニューから[他のメールボックスを開く]で共有メールボックスを指定する方法があります。

この場合、その共有メールボックスのアカウントとしてそのまま操作できます。メールを作成する場合は自動的に共有メールボックスがFromアドレスとして設定されます。

また、メールボックスのカウント名を右クリックし、[他のユーザーの受信トレイを開く]から共有メールボックスを指定すると、自分のメールボックスと並べて共有メールボックスを開くことができます。ただし、Fromアドレスを共有メールボックスのアドレスでメールを作成する場合、Fromアドレスを毎回手動で指定してから送信する必要があります。

開く必要のあるフォルダの数や、用途(参照のみか実際に操作もするか)などに合わせて使い分けると良いと思います。

AD FS環境でログオンユーザ以外でログオン(非SSO)を行う

AD FS環境だと、ポータルではログインIDを入れるのみでパスワードは入力せず、そのままイントラネットのAD FSサーバにリダイレクトされ、そこで認証されてOffice365へのアクセスが行われます。

これはこれで便利な機能なのですが、運用上、他のアカウントでOffice365へのアクセスを実施する必要が出てくる場合が有ります。例えば、外部受付用の共有アカウントでの作業や、退職者のバックアップ作業などの場合です。

testuseroneというアカウントでWindowsにログインしていて、shared-userというアカウントでOffice365に接続しようとするシチュエーションを考えます。まず、ポータルで、普通にログインをしようとしてみます。

あれ…testuseroneのアカウントのままログオンされてしまいました。

どうやら、AD FS側ではOffice365ポータルで入力したユーザアカウントの値は特に検証せず、Active Directoryにログオン出来るかどうかのみを判断してOffice365側にチケットを発行しているようです。

普通に解決しようとするなら、AD FSのクレーム発行ルールを変更して…ということになるのだとは思うのですが、まだ勉強不足なので、今回は他のやり方を考えてみます。

  • まず、FirefoxでのOffice365へのシングルサインオン で紹介したとおり、Firefoxはデフォルトではログイン情報をWebサイトに飛ばしませんので、共用アカウントでのログオンにはFirefoxを利用してID/PASS入力で入る。
  • または、IEもゾーンが「イントラネットサイト」に無い限りログイン情報を飛ばさないので、これを起動前に明示的に他「例:信頼済みサイト」に変更してあげて、終了後必要に応じて戻す
Option Explicit
Dim WSHShell
Set WSHShell = CreateObject("WScript.Shell")
WSHShell.RegWrite "HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet SettingsZoneMapDomainsexample.comstshttps", 2, "REG_DWORD"

これで、一応ID/PASSの入力画面がポップアップしてきて、指定のアカウントでログインができるようになります。

う~ん、でもあまり美しくない。上手いやり方は無いものだろうか…

Chrome on Win7のSSOをAD FS側の設定で実現する

FirefoxでのOffice365へのシングルサインオンの記事では、各クライアントサイドのセキュリティ設定の緩和によって、シングルサインオンの機能を実現しました。ただ、この手法は全クライアントにレジストリの変更を強いることになるので、あまりスマートな実装ではございません。

今回、サーバサイドの設定変更でシングルサインオンが出来ないか試してみたいと思います。

Continue reading

FirefoxでのOffice365へのシングルサインオン

 Office365の リリースノート にも記載がありますが、Windows7もしくは「認証に対する保護の強化」をインストールしたXP,Vistaにおいて、FirefoxやChromeでAD FS環境でのシングルサインオンを実施しようとするには少し設定変更が必要になります。(7/2追記修正)

試しにアクセスをしようとしてみると、

Continue reading