SharePoint 2013 ワークフローを SharePoint Designer で作成する際、ワークフローを実行するユーザー権限に依存しない処理を行いたい場合はアプリステップ内で処理します。
SharePoint 2010 まではこのような場合に、代理ステップを使用していました。代理ステップ内の処理はワークフローの作成者の権限で動作するというものでした。そのため、ワークフローの作成者のアカウントをサイト コレクションから削除するとワークフローが動作しなくなることもあります。また、代理ステップ内で処理すると当該アイテムの更新者がワークフロー作成者名になってしまいます。
しかし、SharePoint 2013 ワークフローで新たに導入されたアプリステップは SharePoint 内の特殊なアカウント(ID)を使って動作するためこうした心配はなくなっています。
アプリステップ内の処理権限
既定ではアプリステップ内の処理は、サイト内のコンテンツに対する読み取りおよび書き込み権限が付与されます。投稿アクセス許可レベルが付与されているアカウントが内部的に使われているとイメージするとよいでしょう。したがって、アプリステップ内からサブサイトを作成したり、リストやライブラリを作成することはできません。しかし、これは既定の状態であり、アプリステップの権限は昇格できます。
昇格の方法について説明する前に、データベースを含め順を追って詳細を確認してみましょう。
アプリステップを利用する前の事前準備
アプリステップを利用するにはサイトの拡張機能の一つである「ワークフローでアプリの権限を使える」をアクティブ化する必要があります。
このフィーチャーのアクティブ化後にサイトの設定ページを確認すると、[ユーザーと権限]セクションに サイト アプリの権限 というメニューが利用できるようになります。
このリンクをクリックすると下記の画面が表示されます。この画面上の ワークフロー という名前のアプリ ID がアプリステップで使用されるものです。
このアプリIDはコンテンツ データベースの dbo.AppPrincipals テーブルに格納されています。下記の図は、先頭の SiteId 列が サイト コレクションを一意に表す GUID であり、Name列に アプリ IDが表示されています。私の環境では ID が 2 となっています。
コンテンツ データベースにはアプリIDに関するテーブルとしてもう一つ dbo.AppPrincipalPerms テーブルがあります。このテーブルにアプリIDに付与されている権限が格納されています。下記の図では、同じサイト コレクションの SiteId に対して Id 2 となっているレコードが 2件あることがわかります。このテーブルの Perm 列がアクセス権限を表す列です。Perm は 2…Read, 3…Write, 4…Manage, 5… FullControl というように対応しており、既定値は 3 です。
2つのレコードがあるのは、アプリID の権限には、サイト レベルとサイト コレクションレベルがあるためです。WebId 列が 0 になっているのがサイト コレクションで使用される権限です。上の図ではサイト コレクションおよびサイトでともに Perm が 3 になっています(既定値)。
権限を変更する
ワークフロー アプリID の権限を変更する方法は次の2つです。
- Windows PowerShell を使用して変更する
- Webブラウザーから変更する
Windows PowerShell から変更する場合は、次のようなスクリプトを使用します。
Add-PSSnapin Microsoft.SharePoint.PowerShell
$url = "http://sp2013-a/sites/wfpractice" #目的のサイトのURL
$web=Get-SPWeb $url #-nameidentifierは ワークフローのアプリID
$AppID="bbe8037e-8b2d-4cb0-b052-3cc6c05edf09@94723cbc-836b..." #IDが長いので略します
$appworkflow=Get-SPAppPrincipal -site $url -nameidentifier $AppID
#***スコープ : サイト *****
Set-SPAppPrincipalPermission -AppPrincipal $appworkflow -Site $web -Right Write -scope Site
#***スコープ : サイト コレクション*****
Set-SPAppPrincipalPermission -AppPrincipal $appworkflow -Site $web -Right Write -Scope SiteCollection
たとえば、上記のスクリプトを使ってサイト コレクション レベルの権限をフル コントロールにするには次のように記述します。
Set-SPAppPrincipalPermission -AppPrincipal $appworkflow -Site $web -Right FullContro -Scope SiteCollection
このスクリプトを実行するとdbo.AppPrincipalPerms テーブルのレコードが変化し、Perm が 5 になります。
Web ブラザーから変更する場合は、まず、SharePoint サイトの「サイト アプリの権限」ページからアプリIDの "|" より後ろから "@" までの ID をコピーしておきます。
続いて、次のURLにアクセスします (※下記は https でアクセスしていますが、SSLを使用していない場合は http でアクセスします)。
- https://サイトのURL/_layouts/15/appinv.aspx
ページが表示されたら、先ほどコピーしたアプリIDを貼り付け [参照] ボタンをクリックすると、タイトルおよびアプリドメイン、リダイレクト先のURLが自動的に表示されます。
権限の要求 XML フィールドに変更したい権限を記述します。たとえば、サイト コレクション レベルでフル コントロール権限を割り当てたい場合は、次のように記載します。
最後に[作成]ボタンをクリックすると、次の画面が表示されます。
[信頼する]ボタンをクリックします。以上で設定は完了です。
※既定の設定に戻す場合は権限の要求 XML フィールドに次のように記載します(Rightの値を Write に書き換える)。
こうした処理によって、ワークフロー内でサイト コレクションの管理者でないとアクセスできない情報へのアクセス、サブサイト作成、リスト作成などが可能になります。なお、サブサイト作成やリスト作成は REST サービスを使います。
詳しくは弊社のオリジナル コースである 「Microsoft SharePoint Server 2013 ワークフロー開発実践演習」 研修で扱っていますので、こちらも併せてご利用ください。
コメント