コンソールプログラムやWPFなどC#(.NET)プログラムからSharePoint
Onlineに接続して操作する手順を示す。
クラウドにアクセスしてリモートから操作するためのクライアントサイ
ドオブジェクトモデル(CSOM)という名前のライブラリを使用する。
確認環境:Visual Studio 2017 RC, Office 365 Business Premium
Table of Contents
クライアントサイドオブジェクトモデルとは
SharePoint Server 2010から導入されたSharePoint APIのセット。
もっと以前からあるサーバオブジェクトモデルのリモート版。
JavaScript用と.NET用がある(Silverlightでも動作するが、これから新し
くSilverlightで作ることは恐らくないと思う)。
サーバオブジェクトモデルと違うのは、ClientContextというクラスを経
由して操作を行う(contextを介してExecuteQueryすることで実際に操
作が行われる)ことと、必要なプロパティを指定してLoadメソッドを呼
ばないとそのプロパティが取れないこと。
環境準備
ここからダウンロードする。
SharePoint Server 2013 Client Components SDK
インストールが終わると、VisualStudioの参照の追加に、
Microsoft.SharePoint.Clientで始まるライブラリが増えている。
少なくともMicrosoft.SharePoint.Clientと
Microsoft.SharePoint.Client.Runtimeを参照に追加する。
認証クラス
SharePoint Onlineが2010版だったころも、一応接続は可能だった。
認証の便利なクラスがなかったため、ブラウザの認証の様子を観察して、
認証時のリダイレクトの流れをまねたうえで最終的なクッキーを取り出す
必要があった。
今は専用の認証クラスSharePointOnlineCredentialsを使えば簡単に認証
できる。MSDN
パラメータは、SPOへのログインアカウントとSecureString型で表した
パスワードの文字列。作ったオブジェクトをClientContext.Credentials
にセットしたうえでオンプレミスのSharePointと同じようにアクセスす
ればよい。
SecureStringとは
セキュリティのため、任意のタイミングで破棄でき、暗号化された文字列。
普通のStringは、破棄のタイミングをコントロールできないので、セキュリ
ティが重要な場合に使うらしい。
使い方は引数なしのコンストラクタで作成した後で、1文字ずつオブジェクト
に追加していく。上記の説明によると、SecureString作成のためにパスワー
ドを通常の文字列に格納してしまうと意味がないが、ここではAPIの要求を満
たすためにだけ使っているのでおいておく。
なお、IDisposableを実装しているので、明示的に破棄をする。
サンプルコード
SharePoint Onlineのurlとアカウント名(メールアドレス)、パスワード
で接続し、サイトのタイトルを表示するコンソールプログラム。
接続情報は、.exe.configから取り出している。
例外クラスCustomSPExceptionは独自に定義した例外クラス。
var url = ConfigurationManager.AppSettings["SiteUrl"]?.ToString(); var account = ConfigurationManager.AppSettings["Account"]?.ToString(); var password = ConfigurationManager.AppSettings["Password"]?.ToString(); if (string.IsNullOrEmpty(url) || string.IsNullOrEmpty(account)|| string.IsNullOrEmpty(password)) throw new CustomSPException("設定が不足しています"); using (var context = new ClientContext(url)) using (var secureString = new SecureString()) { // SecureString型を指定されているので、その型でパスワードを作る foreach (char c in password) secureString.AppendChar(c); secureString.MakeReadOnly(); // SecureStringオブジェクトを変更禁止する context.Credentials = new SharePointOnlineCredentials(account, secureString); var web = context.Web; // これをしておかないと、ExecuteQuery後もwebのプロパティにアクセスできない context.Load(web); context.ExecuteQuery(); Console.WriteLine("CSOMで取得したサイトタイトル:" + web.Title); } Console.Read();