SharePoint Online が SharePoint 2013 に変更されてから、「SharePoint 管理センター」にて行うことができる操作などは、SharePoint Online Management Shell を利用することでクライアントの PowerShell から操作ができるようになりました。このあたりの詳しい情報は、下記のリンク先をご参照ください。

SharePoint Online 用の Windows PowerShell
http://technet.microsoft.com/ja-jp/library/fp161362.aspx
新しい SharePoint Online 管理センター – お客様による制御の向上
http://blogs.msdn.com/b/sharepoint_jp/archive/2013/02/17/sharepoint-online-the-new.aspx

しかしこの仕組みでは、実際に SharePoint のサイトに作成されたリストやライブラリ、またはその中に保存されたアイテムへアクセスすることができません。これらのデータにアクセスするためには、CSOM(Client Side Object Model)と呼ばれる仕組みを利用する必要があります。そこで今回は、この CSOM による方法をご紹介します。

PowerShell で SharePoint Online + CSOM を利用するための事前準備

まずは、大きな前提として、PowerShell 3.0 のインストールが必要になります。そのため、PowerShell 3.0 が含まれる Windows Management Framework 3.0 をインストールするのですが、下記の Download Center から入手することができます。(現時点では、Windows Update のオプションの更新プログラムとしても配信されているようです。)

Windows Management Framework 3.0
http://www.microsoft.com/en-us/download/details.aspx?id=34595

また、PowerShell からも利用可能な CSOM ライブラリをインストールします。開発環境の場合は、すでにインストールされているかもしれませんが、その他のクライアントの場合は、下記の Download Center から再配布版を入手することができます。

SharePoint Server 2013 Client Components SDK
http://www.microsoft.com/en-us/download/details.aspx?id=35585

これで準備は完了です。さっそく使ってみましょう。

SharePoint Online を CSOM で操作してみる

CSOM 自体はオンプレミスの SharePoint を操作する方法と同じです。違う点は1点のみで、SharePoint Online では特別な認証処理を行う必要があるという点です。まずは全体像をご覧ください。

# CSOM ライブラリを読み込む
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

# コンテキストを用意する
$siteUrl = "https://<tenant>.sharepoint.com/sites/hoge"
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)

# オンラインの認証
$password = Read-Host -Prompt "Enter Password." -AsSecureString
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials("accountName@<tenant>.onmicrosoft.com", $password)
$ctx.Credentials = $credentials

# CSOM を利用してリストにアイテムを追加
$list = $ctx.get_web().get_lists().getByTitle('Announcements')
$itemCreateInfo = New-Object Microsoft.SharePoint.Client.ListItemCreationInformation

$listItem = $list.addItem($itemCreateInfo)
$listItem.set_item('Title', 'My New Item!')
$listItem.set_item('Body', 'Hello World!')
$listItem.update()

$ctx.Load($listItem)
$ctx.ExecuteQuery()

上記のコードは、下記のブログを大いに参考にさせていただきました。

SharePoint 2013 Online, Powershell, and CSOM
http://www.hartsteve.com/2013/06/sharepoint-online-powershell/

では、簡単に解説します。まず一番初めに行うことは、ライブラリの読み込みです。こちらは、事前にインストールした SharePoint Server 2013 Client Components SDK に含まれているものです。

# CSOM ライブラリを読み込む
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.dll"
Add-Type -Path "C:\Program Files\Common Files\microsoft shared\Web Server Extensions\15\ISAPI\Microsoft.SharePoint.Client.Runtime.dll"

次に、サイト コンテンツを操作するための、コンテキストを用意します。ここまでは、オンプレミスの場合でも同様ですね。

# コンテキストを用意する
$siteUrl = "https://<tenant>.sharepoint.com/sites/hoge"
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)

この次にあるのが、SharePoint Online 特有の処理となる認証処理になります。パスワードの文字列は、-AsSecureStringを利用してセキュア文字列として格納しています。このパスワードを利用し、Microsoft.SharePoint.Client.SharePointOnlineCredentialsオブジェクトを作成し、コンテキストに紐付けを行います。

# オンラインの認証
$password = Read-Host -Prompt "Enter Password." -AsSecureString
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials("accountName@<tenant>.onmicrosoft.com", $password)
$ctx.Credentials = $credentials

ここから先は、オンプレミスでの CSOM の利用と同様の記述になっています。今回のサンプルの場合、「Announcements」という名前のお知らせリストに新しいアイテムが作成されます。

20130907-1

CSOM に関するより詳細なリファレンスは、下記の MSDN をご参照ください。

SharePoint 2013 .NET クライアント API リファレンス
http://msdn.microsoft.com/ja-jp/library/jj193041.aspx

さいごに

凝った処理を実現するには、CSOM の文法を覚える必要はありますが、PowerShell を用いての SharePoint Online 操作の可能性が大きく広がるのではないでしょうか?また、最大のメリットは、オンプレと殆んど同じコードを利用できることかと思います。

また、他に日本語の情報が他に無いかと思っていたら、SharePoint Developer さんで記事にされていましたので、こちらも参考になると思います。

.NET CSOM による SharePoint Online への接続
http://sharepoint.orivers.jp/Article/180

ぜひ、お試しください。