💻

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 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 では死にます。やればできるみたいですが、そこまでやるメリットもなさそう。

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

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

おわりに

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

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

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

Discussion

ログインするとコメントできます