SharePoint Designer で作成したワークフローを起動した際に、[アクセスが拒否されました] と表示される
こんにちは。SharePoint サポートチームの のりおです。
最近めっきり寒くなってきましたが、みなさま、お元気でしょうか?
私も時々風邪をひいたりしていましたが、最近の悩みは姪がなついてくれないことです。
僕が抱っこしてしばらくすると徐々に表情が曇ってきて、しまいに泣き出してしまいます。何度かトライしましたが、今のところだめです。お母さんに返すと泣き止みます。なぜ?なぜ?このちょっと引きつった笑顔が悪いの?もしかして加齢臭?なーんていろいろ考えたりしてしまいますが、まだ両親以外に慣れていないだけなんだよなーと自分に言い聞かせています。。。
さて、本題にはいります。今回は SharePoint Designer で作成したワークフローのある動作について記載したいと思います。
MOSS 2007 には既定で "承認"、"フィードバックの収集" などのワークフローが用意されていますが、これだけでは物足りないなぁというときに、SharePoint Designer を使って自由度の高いワークフローを作成することができます。SharePoint Designer のワークフローには、ワークフローを開始させる際のオプションとして、以下の 3 つがあります。
1. このワークフローをアイテムから手動で開始できるようにする
2. 新しいアイテムが作成されたときにこのワークフローを自動的に開始する
3. アイテムが変更されたときにこのワークフローを自動的に開始する
現象
上記の起動オプションの中の、"このワークフローをアイテムから手動で開始できるようにする" を使用したワークフローを実行しようとした時に、以下のようなエラー画面が表示されることがあります。
あれ、おかしいな。権限は正しく設定しているはずなのに。。。
アイテムの投稿はできるのに、なんでワークフローが起動しないの?
実は、ちょっとした注意点があるんです。今回はこの画面が表示される理由と対処方法をお伝えしたいと思います。
原因
SharePoint Designerでワークフローを作成したときに、自動的にワークフローの開始画面 (ワークフローフォーム) が作成されます。既定では以下のような画面になります。この画面にアクセスする権限がないために、アクセス拒否の画面が表示されています。
SharePoint Designerでワークフローを作成する場合、作成したタイミングでワークフローフォーム (aspx ファイル) や定義ファイル (XOML ファイル) 等が特殊なライブラリに保存されます。このライブラリにファイルを追加する際に権限が付与されるのですが、以下のような条件で権限が付与されます。
1. アイテム単位の権限として付与される。
2. ワークフローを作成する時点の、対象のライブラリと同じ権限付与される。
この "アイテム単位" というのが曲者なんですね。
ワークフロー作成時は問題ないのですが、ワークフローを作成した後にサイトやリストに対して、ユーザー/グループの権限を新たに追加した場合に、ワークフロー ライブラリ内の各アイテムは親からの権限を継承していないため、その権限の変更内容が引き継がれません。そのため、ワークフローを実施する際に使用するワークフローフォームのページに対してアクセスができず、今回の現象が発生します。
よし、ではそのライブラリにアクセスして、権限を設定しなおせば解決!
と思っても、MOSS の画面上からはアクセスできない特殊なライブラリなんです。
うん、理由についてはわかった。で、どうすればいいの?
はい。大事なのは、どうやって対応するかですよね。ひとまず、SharePoint Designer を使って再度ワークフローを作り直せば再度権限が付与されるので問題はなくなりますが、、、ちょっと厳しい場合もあるでしょう。そのほかの対処方法としては以下の方法があります。
対処方法
SharePoint グループなどを使用して、ユーザーの追加や削除は、そのグループに対して行う。
既に作成されているSharePoint グループに対して AD のセキュリティグループやユーザーを追加 / 削除した場合は問題ありません。
同じ理由で、既に権限が付与されている AD のセキュリティグループにユーザーを追加する場合も問題ありません。
うーん、とはいっても個別のユーザーに対して直接権限を割り当てたいときもあるよね。その場合はどうしたらいいの?
はい。この場合は、MOSS の SDK で提供される API を使用して、ワークフロー ライブラリのアイテムの権限を変更することで対応できます。
毎回、ユーザーを追加する度に API を使って権限設定を変更するのって大変だよね?もっと楽な方法はないの?
はい。ワークフロー ライブラリと、そこに保存された各アイテムの権限設定を親から (サイトから) 継承する設定にするという方法もあります。ワークフロー ライブラリ上の各アイテムは MOSS の画面上からアクセスできないため API を使って権限設定を行う必要があります。以下に手順と簡単なサンプルコードを記載しておきますので、是非ご参考にしてください!
API を使用してワークフロー ライブラリの権限を変更する。
1) SharePoint Designer を起動し、対象のワークフローが展開されているサイトを開きます。
2) 画面左側のツリーから、"Workflow (ワークフロー)" ドキュメントライブラリを選択して、右クリック - [プロパティ] をクリックします。
3) [ドキュメント ライブラリのプロパティ] 画面から [セキュリティ] タブをクリックし、"ブラウザを使用して権限を管理" をクリックします。
4) 以下のような URL が表示されますので、List リクエストパラメータから、ワークフローライブラリの GUID を取得します。
このパラメータの値は URL エンコードされているので、以下のようにデコードします。
デコード前の GUID 例 : %7BBE309DF8%2D7DCA%2D4303%2D915A%2D3F8DE7A20BF3%7D
デコード後の GUID 例 : {8C8D82D6-1BA4-4EE8-91D5-1E2E91BF5AC4}
この GUID を使って、ワークフローライブラリを特定して処理を行います。Visual Studio を使用して以下のようなコンソールアプリケーションを作成して実行します。
------ ここからサンプルコード
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
SPSecurity.RunWithElevatedPrivileges(ChangeWorkflowListPermission);
}
private static void ChangeWorkflowListPermission()
{
using (SPSite site = new SPSite("https://moss/")) //<- ここに対象のサイトの URL を指定します。
{
using (SPWeb web = site.OpenWeb())
{
Guid g = new Guid("{8C8D82D6-1BA4-4EE8-91D5-1E2E91BF5AC4}"); //<- ここに上記の GUID を指定します。
SPList list = web.Lists[g];
list.ResetRoleInheritance();
SPListItemCollection itemCol = list.Items;
foreach (SPListItem item in itemCol)
{
item.ResetRoleInheritance();
}
web.Dispose();
}
site.Dispose();
}
}
}
}
------ ここまでサンプルコード
上記のコードにはエラー処理などが含まれていませんので、実装する環境に応じて変更してください。Visual Studio を使用したカスタムアプリケーションの作成方法についてや、上記で使用したAPI の情報については、以下の MSDN の資料をご参照くださいませ!
- 参考情報
タイトル : [方法] コンソール アプリケーションを作成する
URL : https://msdn.microsoft.com/ja-jp/library/ms438026.aspx
タイトル : SPSecurity.RunWithElevatedPrivileges メソッド (Microsoft.SharePoint)
タイトル : SPListItem.ResetRoleInheritance メソッド (Microsoft.SharePoint)
URL : https://msdn.microsoft.com/ja-jp/library/microsoft.sharepoint.splistitem.resetroleinheritance.aspx