PowerShellでSharePointにグループ作成してサイトに権限を設定する

Powershell(パワーシェル)はコマンドプロンプトを代替する新しいサーバ管理コンソールです。SharePointの管理・運用にもとても便利に使えるのですが…しかし、不慣れな為か、ついついコマンドプロンプト+stsadmに頼ってしまいがちです(主に私が)。

そこで、PowershellでSharePointを操作する実例をひとつ、ドリル形式でご紹介したいと思います。題して「SharePoint担当のための即効PowerShellドリル 第一回」!…続くかどうかは約束できませんが(笑)

さて、まず Powershell そのものについては、こちらのWeb記事や書籍を参照頂くとよいかと思います。

Microsoftラーニングセンター:Powershell
Windows PowerShell 入門(1)-基本操作編
統合開発環境「PowerShell ISE」を使ってみよう

このエントリでは、SharePoint 2010がインストールされたWindows Server 2008 R2上で、管理権限のあるアカウントで「Powershell ISE(統合環境)」を利用します。ローカルの Windows7 端末等から、素のPowerShellを操作することも可能なのですが、説明事項が増えたりなんだりするので、今回はこれが前提です。

ただ、Windows Server 2008 R2 には、このISEが標準ではインストールされていません。「機能の追加ウィザード」で「Windows PowerShell Integrated Environment(ISE)」にチェックを付けてインストールを行います。

Windows Server 2008 R2 のPowerShell

PowerShell ISE の画面です。

最初に、PowerShell ISE をSharePointサイトに接続します。「$web」は変数です。URL部分はサイトのアドレスなので適宜変更して下さい。

$web = Get-SPWeb http://vsrv01/team

再生ボタンかF5でスクリプトを実行─すると、いきなりエラーです。

これは、PowerShellでSharePoint用のコマンドを利用するには、まず「SharePoint 2010 管理シェル」を読込む必要があるためです。なお、この管理シェルは一度追加すると維持されるので、二回目からは必要ありません。

Technet: Windows PowerShell を使用したファーム管理タスクの実行および自動化

では、あらためて。

Add-PsSnapin Microsoft.SharePoint.PowerShell
$web = Get-SPWeb http://vsrv02/team

それでは第一ステップ。このサイトコレクションに、新規SharePointグループ「テストグループ」を作成します。

$web.SiteGroups.Add(“テストグループ”, $web.Site.Owner, $web.Site.Owner, “PS動作テストグループです”) $ownerGroup = $web.SiteGroups[“テストグループ”]
$ownerGroup.AllowMembersEditMembership = $true
$ownerGroup.Update()

SPweb.SiteGroups.Add で、グループの新規作成です。指定パラメータは左からグループ名、グループ所有者、初期メンバー(null可)、説明文になります。

この作成したばかりのグループを変数 $ownerGroup に設定します。 SpWeb.AllowMembersEditMembership で、メンバーの変更を許可する設定に変更。最後に、 Update() で変更を反映しています。

なお、このグループに更にユーザを追加するには、次のように書きます。

$user1 = $web.Site.RootWeb.EnsureUser(‘spm\taro.micro’)
$ownerGroup.AddUser($user1)

このグループにサイトレベルで権限を設定することが今回の目的ですが、その前に第二ステップとして、サイトの権限設定を確認します。もし親サイトの権限を継承しているなら、それを切ります。

if ($web.HasUniquePerm -eq $false) {
$web.BreakRoleInheritance($true)
}

SPweb.HasUniquePerm で「権限が固有か」を確認。IF文で、もし固有でない(=継承)なら SPweb.BreakRoleInheritance で継承を解除します。

第三ステップは、既存の権限の全削除です。なお、実は前ステップの最後で SPweb.BreakRoleInheritance の引数に「$false」指定すると、既存の権限を全削除してくれるのですが、ここではあえて意図的に(練習なので!)PowerShellでの個別削除を行なっています。

for ($i = $web.RoleAssignments.Count-1; $i -ge 0 ; $i-=1)
{
$web.RoleAssignments.Remove($i)
}

SPweb.RoleAssignmentsで、現在設定されている権限オブジェクトについて .count でその数を取得。そこから再帰処理(繰返し)で Spweb.RoleAssignments.Remove おこない、ひとつづつ削除しています。例えば11個のユーザ/グループが設定されている場合、10個目削除、9個目、8個目…と削除してゆき、最後を削除したら終了です。

この辺りは「配列」と「再帰処理」の理解が必要になります。これは Powershell に限らずほとんどあらゆるスクリプトの(そして私のような素人が理解できずドハマリしがちな)基本になりますので、ぜひWebで検索するか、同僚のエンジニアさんに教えて頂いて下さい。後で必ず役に立ちます。

なお、参考までにいくつかポイントを書いておくと、$web.RoleAssignments.Count-1 として1を引いているのは、内部的には配列が0スタートなので10個目のユーザは「9番」だから。「-ge」は「以上」の意味です。

演算子についてはこの辺りが参考になるかと思います。
Windows PowerShell 入門(4)-変数と演算子

さて最後の第四ステップです。グループにサイトレベルの権限を設定します。すこしややこしいですが、「テストグループ」と「フル コントロール」権限をワンセットにまとめ、それを RoleAssignments.Add でサイトに追加。最後に $web.Update() で更新を確定、$web.Dispose() で $web を開放しています。

$gAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($ownerGroup)
$role = $web.Site.RootWeb.RoleDefinitions[“フル コントロール”]
$gAssignment.RoleDefinitionBindings.Add($role)
$web.RoleAssignments.Add($gAssignment)
$web.Update()
$web.Dispose()

全部まとめるとこうなります。

Add-PsSnapin Microsoft.SharePoint.PowerShell
$web = Get-SPWeb http://vsrv02/team
$web.SiteGroups.Add(“テストグループ”, $web.Site.Owner, $web.Site.Owner, “PS動作テストグループです”) $ownerGroup = $web.SiteGroups[“テストグループ”]
$ownerGroup.AllowMembersEditMembership = $true
$ownerGroup.Update()
$user1 = $web.Site.RootWeb.EnsureUser(‘spm\taro.micro’)
$ownerGroup.AddUser($user1)
if ($web.HasUniquePerm -eq $false) {
$web.BreakRoleInheritance($true)
}
for ($i = $web.RoleAssignments.Count-1; $i -ge 0 ; $i-=1)
{
$web.RoleAssignments.Remove($i)
}
$gAssignment = new-object Microsoft.SharePoint.SPRoleAssignment($ownerGroup)
$role = $web.Site.RootWeb.RoleDefinitions[“フル コントロール”]
$gAssignment.RoleDefinitionBindings.Add($role)
$web.RoleAssignments.Add($gAssignment)
$web.Update()
$web.Dispose()

如何でしたでしょうか。実のところ、この操作「だけ」であれば、PowerShellでスクリプトを書くよりも普通にGUIから設定してしまったほうが早いです。しかし、例えばこの作業を100サイト行う必要があるような場合はどうでしょう。手作業では時間がかかり過ぎますし、ミスの恐れもあります。こうした作業を高度に自動化できるのがPowershellの利点です。

ただ、PowerShell+SharePointの組合せを100%活かすには、SharePoint オブジェクトモデルをきちんと把握して、かつPowerShellスクリプティングに精通していることが必要です。ここまでくると完全な「プログラミング」「開発」の領域ですので、ユーザ企業のSharePoint担当者が、そこまで出来る必要はあまりないでしょう。

しかし、PowerShellで「どんなことが出来るか」「どのように利用するのか」という基本の理解に加えて、いくつかの便利なテンプレを持っておくことは、とても有益だと思います。

なお、もし万が一きちんとこの辺りを習得したい、ということでしたら、この辺りの書籍から始められるのが良いかもしれません。

ちなみに、このエントリのネタ元はこちら「PowerShellを使って、Sharepointグループを一括登録」です。その更にオリジナルはこちら「PowerShell to create SharePoint groups」ですね。ただ、元ソースに少しかけた部分がありましたので、その辺りは修正してあります。

「ドリル」第二回については、どうでしょうね?ニーズがあればやりたいと思いますが…ご希望の方は、ぜひ左下の「いいね」をクリックして頂けると嬉しいです(笑)


これまでのコメント

  1. モカ より:

    こんなことできるんですね 第2回以降楽しみにしています。
    取り急ぎ 検証させていただき、 また レポートします。

    現在、 10サイト300グループの設定しなきゃいけなくて
    悩んでおりました。

login

Author

中村 和彦(シンプレッソ・コンサルティング株式会社 代表)が「ユーザ視点の SharePoint 情報」を発信します。元大手製造業 SharePoint 運用担当。現SharePoint コンサルタント。お仕事のお問い合わせはこちらまでお願いします。当ブログにおける発信内容は個人に帰属し所属組織の公式発信/見解ではありません。
FB : 中村 和彦
blog: Be・Better!
MS MVP SharePoint 2009/10-2011/9
MS MVP Office 365 2012/10-2014/9