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」ですね。ただ、元ソースに少しかけた部分がありましたので、その辺りは修正してあります。
「ドリル」第二回については、どうでしょうね?ニーズがあればやりたいと思いますが…ご希望の方は、ぜひ左下の「いいね」をクリックして頂けると嬉しいです(笑)
こんなことできるんですね 第2回以降楽しみにしています。
取り急ぎ 検証させていただき、 また レポートします。
現在、 10サイト300グループの設定しなきゃいけなくて
悩んでおりました。