複数ユーザーの予定表へのアクセス権限設定を一括で行う

組織の中で予定表の共有を始める際に、まず行わなければならないのが各ユーザーの予定表アクセス権の設定です。既定の状態では「空き時間情報」のみが共有される状態になっています。この状態では、他人の予定表が埋まっているところは塗りつぶされて表示されますが、どのような予定が入っているのかがわかることで、予定表のより効果的な共有に役立てることができます。しかし、通常の方法では、エンドユーザー一人一人がOutlookから予定表のアクセス権を各自で変更する方法しかなく、管理者が一括して設定を変更することができません。この記事では、Exchange Web Services Managed API を呼び出す PowerShell スクリプトにより、管理者がこのタスクを一括して行う方法についてご紹介します。

Exchange Web Services Managed API を PowerShell スクリプトから呼び出して利用するには、Exchange Web Services Managed API や PowerShell をインストールしておく必要があります。詳細は以下を参照してください。

Exchange Web Services Managed API の詳細については、MSDN の SDK (英語) をご覧ください。

特定のユーザーリストに対して既定の予定表アクセス権限を設定する

準備ができたら、以下のスクリプトをメモ帳にコピーし、CalendarPermsSet.ps1 というファイルに保存します。このスクリプトでは、CSV ファイルで指定したユーザーの既定の予定表に対して、既定 (Default) のユーザーに「空き時間情報、件名、場所」のアクセス権を、匿名 (Anonymous) のユーザーに「なし」のアクセス権を一括で設定することができます。

param(
  [String]$ImportFile = "D:\Targetusers.csv"
)
$bposlogin = "admin@contoso.com"
$bpospwd = "Password"
$password=ConvertTo-SecureString $bpospwd -AsPlainText -Force

$uri=[system.URI] "https://red003.mail.apac.microsoftonline.com/ews/exchange.asmx"
$dllpath = "C:\Program Files\Microsoft\Exchange\Web Services\1.0\Microsoft.Exchange.WebServices.dll"


$adminCredential = New-Object -TypeName System.Management.Automation.PSCredential -argumentlist $bposlogin,$password

[void][Reflection.Assembly]::LoadFile($dllpath)

$service = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)
$service.Url = $uri
$service.Credentials = New-Object System.Net.NetworkCredential($bposlogin,$bpospwd,"")

Import-Csv $ImportFile | Select-Object mailboxname | ForEach-Object {
        $folderid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Calendar, $_.mailboxname)
        $folderCalendar = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service, $folderid)
        
        $folderCalendar.permissions | ForEach-Object {
            if ($_.UserId.StandardUser -eq [Microsoft.Exchange.WebServices.Data.StandardUser]::Default){
                $_.PermissionLevel = [Microsoft.Exchange.WebServices.Data.FolderPermissionLevel]::FreeBusyTimeAndSubjectAndLocation
            }
            if ($_.UserId.StandardUser -eq [Microsoft.Exchange.WebServices.Data.StandardUser]::Anonymous){
                $_.PermissionLevel = [Microsoft.Exchange.WebServices.Data.FolderPermissionLevel]::None
            }          
        }
        $folderCalendar.Update()
}

ここで、以下のコマンド

$uri=[system.URI] "https://red003.mail.apac.microsoftonline.com/ews/exchange.asmx"
$dllpath = "C:\Program Files\Microsoft\Exchange\Web Services\1.0\Microsoft.Exchange.WebServices.dll"

$adminCredential = New-Object -TypeName System.Management.Automation.PSCredential -argumentlist $bposlogin,$password

[void][Reflection.Assembly]::LoadFile($dllpath)

$service = new-object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2007_SP1)
$service.Url = $uri
$service.Credentials = New-Object System.Net.NetworkCredential($bposlogin,$bpospwd,"")

は、PowerShellでExchange Web Services Managed API を有効にするためのコマンドです。$dllpath には APIのDLL をインストールしたパスを指定します。$url は Exchange Web Services API の URL を指定します。組織が使っているデータセンターの場所により値を変更します。

アジア太平洋地域 (APAC) https://red003.mail.apac.microsoftonline.com/ews/exchange.asmx
ヨーロッパ、中東、アフリカ (EMEA) https://red002.mail.emea.microsoftonline.com/ews/exchange.asmx
北アメリカ https://red001.mail.microsoftonline.com/ews/exchange.asmx

$bposlogin と $bpospwd には、管理者権限をもつアカウントのユーザー名とパスワードで置き換えてください。なお、このテキスト ファイルは管理者アカウント情報を含むため、取り扱いには十分注意ください。

一方、CSV ファイルには、一行目に「mailboxname」というヘッダーを付けて、そのあとにユーザー識別子である電子メール アドレスを記述します。

mailboxname
user1@contoso.com
user2@contoso.com
user3@contoso.com
user4@contoso.com
user5@contoso.com

この CSV ファイルは以下のコマンド

Import-Csv $ImportFile | Select-Object mailboxname | ForEach-Object

によって読み込まれ、指定したそれぞれのユーザーに対してループを回します。その後、指定したユーザーの予定表フォルダのFolderId クラス (英語) を作成し、Folder.Bindメソッド (英語) で $folderCalendar 変数にフォルダ オブジェクトを取得します。そして、Folder.Permissionsプロパティ (英語) のメンバーを列挙して既定ユーザーと匿名ユーザーの場合にそれぞれアクセス権を設定します。指定できるアクセス権の種類については、FolderPermissionLevel 列挙 (英語) を参照してください。

最後にFolder.Update メソッド (英語) を実行して変更をコミットすることを忘れずに行ってください。