⚙️

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

2022/01/01に公開

はじめに

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

https://qiita.com/advent-calendar/2016/powershell

今は SharePoint をメインでやっているこのブログもいつの間にか PowerShell タグのついた記事が増えています。いまや SharePoint の構築や運用にあたって PowerShell は欠かせない存在になりました。過去のバージョンの SharePoint では stsadm というコマンド ライン ツールを使っていたそうですが、今はお役御免となりました。[1]

また SharePoint Online の登場により、新しく追加されたライブラリもありますので、合わせて整理してみます。

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

SharePoint をインストールすると、スタート メニューに SharePoint 20XX 管理シェル が登録されます。ここから 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 メソッドで関連オブジェクトも合わせて読み込めます。しかしこれはラムダ式なので PowerShell では実行できません。正確にはリフレクションでやればできるみたいですが、そこまでやるメリットもなさそうです。

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

https://zenn.dev/karamem0/articles/2016_05_25_000000

おわりに

SharePoint Online の管理を PowerShell でやっている事例があれば是非いろいろ聞いてみたいものです。

脚注
  1. SharePoin 2007 以前のようですが、その頃の SharePoint は触ったことがないので詳しいことはわかりません。 ↩︎

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

Discussion