ActiveSync 利用履歴のあるアカウント一覧を取得する

発行日: 2010 年 8 月

この記事では、Windows phoneやiPhone などのスマートフォンを使って ActiveSync を行っているユーザーの一覧を、Microsoft Online Services 移行ツールに付属する PowerShell スクリプトと Exchange Web Services Managed API によりこのタスクを自動化する方法についてご紹介します。

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

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

準備ができたら、以下のスクリプトをメモ帳にコピーし、ActiveSynced.ps1 というファイルに保存します。このスクリプトでは、ユーザー識別子を列挙しつつ、そのユーザーが過去に ActiveSync を行っている場合、”ActiveSync-Enabled” というフラグを出力します。

$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)
add-PSSnapIn Microsoft.Exchange.Transporter

$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,"")
$enabledUsers = Get-MSOnlineUser -Enabled -Quiet -Credential $admincredential

$enabledUsers | ForEach-Object {
    If (($_.ProxyAddresses -ne "") -and ($_.SubscriptionIDs -ne ""))
    {
        $activeSyncEnabled=""
        $emailaddresses = $_.ProxyAddresses
        ForEach ($address in $emailaddresses){
          $addresstype=$address.ProxyAddress.substring(0,5)
          If ($addresstype.compareto('SMTP:') -eq 0)
          {
            $mailboxname = $address.ProxyAddress.Replace("SMTP:","")
          }
        }
        $folderid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Root,$MailboxName)
        $folderRoot = [Microsoft.Exchange.WebServices.Data.Folder]::Bind($service, $folderid)

        $folderview = New-Object Microsoft.Exchange.WebServices.Data.FolderView(10000);

        $foldercoll = $service.FindFolders($folderid,$folderview)

        $foldercoll | foreach {
        
            If (($_.displayname -eq "ExchangeSyncData") -and ($_.Childfoldercount -gt 0))
            {
                $activeSyncEnabled= "ActiveSync-Enabled"   
            }
        }
        Write-Host $mailboxname $activeSyncEnabled
    }
}

ここで、以下のコマンド

add-PSSnapIn Microsoft.Exchange.Transporter

は、Microsoft Online Services 移行ツールによって追加された PowerShell コマンドレットを有効にするためのコマンドです。ちなみに、「移行コマンド シェル」から Microsoft Online Services 専用の PowerShell スクリプトを実行する場合は、このコマンドを実行する必要はありません。

以下のコマンド

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

以下のコマンド

$enabledUsers = Get-MSOnlineUser -Enabled -Quiet -Credential $admincredential

によって、対象となるユーザー オブジェクト (Microsoft.Exchange.Transporter.Provider.MicrosoftOnline.MicrosoftOnlineUser) の配列を $enabledUser に取得します。ここでは、有効なユーザー一覧のみ取得していますが、引数を変更することで特定の属性を持つユーザー一覧を取得することも可能です。詳細は Get-MSOnlineUser を参照してください。

その後、配列内で ProxyAddress が割り振られている各々のユーザーに対して、ルートフォルダの FolderId クラス (英語) を作成し、Folder.Bind メソッド (英語) で $folderRoot 変数にフォルダ オブジェクトを取得します。続いて、フォルダを建託するための FolderView クラス (英語) を作成し、“ExchangeSyncData” という名前のフォルダがないか探します。ActiveSync を実行すると ”ExchangeSyncData” というフォルダが作られるため、これでユーザーの判別が可能です。