ちょっと汎用的な PowerShell スクリプトのひな形を作ってみようと思い、少しお作法勉強しました。
題材に取り上げたのは、サイトの権限一覧取得です。
- PowerShell スクリプトでの引数
PowerShell でコマンドレットを使う時に、コマンドレットの名前だけでなく、引数の名前もタブ補完で補ってくれます。
これ、PowerShell スクリプトでも同じことが出来るようです。
ポイントは、Param ステートメントで、スクリプトファイルの先頭に定義するだけです。
Param(
[string]$Identity,
[string]$ContentDatabase,
[string]$WebApplication,
[switch]$Allwebs
)
これで、-Identity とか、-WebApplication を -I や -W の入力でタブ補完が利用出来るようになります。
分かり易い長い引数名を付けても、これで引数の指定がとても楽になります。
いわゆる、「サイトの設定」ページの「ユーザーと権限」セクションの中の「サイトの権限」で表示される内容を取得するのが、今回の PowerShell スクリプトのゴールです。
これには、SPWeb クラスの RoleAssignments プロパティを参照すれば良いようです。
・SPSecurableObject.RoleAssignments property
https://msdn.microsoft.com/EN-US/library/microsoft.sharepoint.spsecurableobject.roleassignments.aspx
また、種類 (SharePoint グループ、ドメイン グループ、ユーザー) については、以下のようなロジックで判別出来るようです。
if ($assignments.Member.XML.StartsWith('<Group') -eq "True") {
$type = "SharePoint グループ"
} elseif ($assignments.Member.IsDomainGroup) {
$type = "ドメイン グループ"
} else {
$type = "ユーザー"
}
SharePoint グループの判別が、XML の文字列内容で判断するというのが、今一つという気もしますが、ここでは、要件が満たせれば良いことにします。
今まで、結果の出力には文字列を作って表示というお気楽なことをやっていましたが、PowerShell ではパイプ処理にて折角オブジェクトが使われるので、それが活かせるようにオブジェクトに展開して出力させるようにしました。
とは言え、難しいことはなく、New-Object で PSObject を生成すれば良く、後はプロパティ名と名前を連想配列で指定するだけです。
$results += New-Object PSObject -Property @{
Url = $web.Url;
Name = $assignments.Member.Name;
Type = $type;
Role = $role
} | Select-Object Url, Name, Type, Role
但し、PowerShell のバージョンによっては、プロパティ名の順序が定義通りにならない場合があるので、Select-Object で指定するのが望ましいようです。
作成した PowerShell スクリプトはこちらになります。
SharePoint 2013 と SharePoint 2010 で動作することを確認済みです。
Get-SitePermissions.ps1
オブジェクトとして出力しているので、| (パイプ) で繋いで、Export-Csv コマンドレットを利用して CSV ファイルに出力することも可能です。
get-SPSite コマンドレットに準じて、個別サイトコレクション、コンテンツデータベース内のサイトコレクション、Web アプリケーション内のサイトコレクション、そして、全てのサブサイトのサイトの権限一覧の出力が可能です。
今回、PowerShell スクリプトを作成するのに、幾つか参考にした記事はこちらです。
感謝ですね。
・[PowerShell] PS1 ファイル実行時にとる引数をコマンドレットみたいにタブ補完したい!
http://blogs.technet.com/b/jpilmblg/archive/2011/03/09/powershell-ps1.aspx
・連想配列を変換してユーザー定義オブジェクトを簡単に作成する
http://winscript.jp/powershell/227
・配列 (Windows PowerShell)
http://ufcpp.net/study/powershell/array.html
・Change order of columns in the object
http://stackoverflow.com/questions/19624597/change-order-of-columns-in-the-object
権限が付与されているオブジェクトの種類を判別するロジックについては、こちらを参考にしました。
なるほど!、と思いました。
・PowerShell Script to Enumerate SharePoint 2010 or 2013 Permissions and Active Directory Group Membership
http://geekswithblogs.net/bjackett/archive/2013/07/01/powershell-script-to-enumerate-sharepoint-2010-or-2013-permissions-and.aspx
ついつい、形から入る私は、どうせやるなら、ひな形というかスタイルを確立してから、いろいろと展開したいと思ってしまうのでした。
Kokuho Hi (Sonorite / SharePoint Technology Center)