読者です 読者をやめる 読者になる 読者になる

からめもぶろぐ。

ワタシ SharePoint チョット デキル

SharePoint を PowerShell から操作する方法まとめ

PowerShell SharePoint

この記事は「PowerShell Advent Calendar 2016」の参加記事です。

qiita.com

今は SharePoint をメインでやっているこのブログもいつの間にか PowerShell タグがついた記事が結構増えているわけですが、SharePoint の構築や運用にあたって PowerShell は欠かせない存在になりました。過去のバージョンの SharePoint では stsadm というコマンド ライン ツールを使っていたそうですが、今はお役御免となりました。*1
また SharePoint Online の登場により、新しく追加されたライブラリもありますので、合わせて整理したいと思います。

SharePoint Server (オンプレミス) の場合

SharePoint をインストールすると、[スタート] メニューに [SharePoint 20nn 管理シェル] が登録されます。ここから SharePoint を操作するためのさまざまなコマンドレットを実行できます。スクリプトで実行する場合や、ISE を使いたい場合は、以下のコマンドレットを実行することで、SharePoint の管理シェルを実行できるようになります。

Add-PSSnapin "Microsoft.SharePoint.PowerShell"

SharePoint 管理シェルの実体は Microsoft.SharePoint.dll (およびその関連ライブラリ) なので、SharePoint のサーバー オブジェクト モデルがそのまま適用されます。そのため、SharePoint 開発経験のある開発者には非常に取っつきやすいです。また、便利なコマンドレット群も提供されています。*2

Visual Studio で SharePoint ソリューション開発をするときに、デプロイ前後のコマンドで PowerShell スクリプトを呼び出してデバッグ先のサイトにテスト データを投入すると非常に捗ります。ただし、そのとき注意しないといけないのは、Visual Studio は x86 プロセスなので PowerShell も x86 が呼び出されてしまう点です。SharePoint の管理シェルは x64 でしか動作しないので、PowerShell も x64 で動かすよう工夫する必要があります。

"%WINDIR%\SysNative\WindowsPowerShell\v1.0\powershell.exe" -ExecutionPolicy Unrestricted -File "$(ProjectDir)\Hoge.ps1"

SharePoint Online の場合

SharePoint Online では、サーバーにログインすることはできないので、代わりに SharePoint Online 管理シェルが提供されています。しかし、ここで特に注意しなければならないのは、SharePoint Online 管理シェルでできることは非常に限定的であるという点です。実質的にはユーザーの管理とサイト コレクションの管理しかできません。ならばどうするかというと、SharePoint クライアント ライブラリ コード、すなわち CSOM を使うことになります。というより、CSOM でできないことを SharePoint Online 管理シェルがカバーしているという感じのようです。

CSOM は PowerShell を考慮して作られているわけではないので、割と辛い目に遭います。具体的にいうと、CSOM では Load メソッドで関連プロパティを読み込むときに Include という Entity Framework みたいな呼び出しをするわけですが、ラムダ式なので PowerShell では死にます。やればできるみたいですが、そこまでやるメリットもなさそう。

www.itunity.com

試したことないですが、REST API を Invoke-RestMethod で呼び出す方法もあるかもしれません。でも今度は認証の壁が立ちはだかるのです…。こちらもやればできますけど。

blog.karamem0.jp

*1:たぶん 2007 以前だと思いますが、その頃の SharePoint は触ったことがないので詳しいことはわかりません。

*2:個人的には Get-SPWeb が最強で、C# で SPSite.OpenWeb() するたびに「これ PowerShell だと一発なのに…」と思っています。