セキュリティで保護されたワークフロー アクションの作成
最終更新日: 2010年7月16日
適用対象: SharePoint Server 2010
この記事の内容
セキュリティで保護されたワークフロー アクションのシナリオ
セキュリティで保護されたワークフロー アクションの一般的な使用シナリオ
セキュリティで保護されたワークフロー アクションを使用するときのヒント
ここでは、SharePoint リスト オブジェクト モデルを使用して、外部リストからの読み取りを実行するセキュリティで保護されたワークフロー アクションを作成する方法を説明します。
このトピックは、Microsoft SharePoint 2010 Software Development Kit (SDK) の一部である、セキュリティで保護されたワークフロー サンプルに対応しています。このサンプルを入手する方法の詳細については、「コード スニペット: Sandboxed ワークフロー スキーマ」を参照してください。
セキュリティで保護されたワークフロー アクションは、宣言型ワークフロー デザイナーで使用できるコード関数です。セキュリティで保護されたワークフロー アクションは、Microsoft Visual Studio で作成し、SharePoint ソリューション ギャラリーにアップロードします。これらのアクションは、確実にコア システムのプロセスを保護し、境界を遵守できるように単独で実行されます。
セキュリティで保護されたワークフロー アクションを使用することによって、外部リストからアイテムを 1 回読み取って、このデータを再使用できる方法で格納できます。これにより、この方法以外の場合では SharePoint ワークフロー アクティビティで作業するときに実行する必要がある、外部リストに対する読み取り操作の回数を減らすことができます。組み込み SharePoint ワークフロー アクティビティを使用して外部リストから列を読み取ると、Read List メソッド (Finder) と Read Item メソッド (SpecificFinder) が呼び出されます。この処理は必要ありません。セキュリティで保護されたワークフロー アクションでは、必要のない呼び出しが実行されないようにして、外部システムの負荷を軽減できます。
セキュリティで保護されたワークフロー アクションのシナリオ
条件付き承認が必要で、承認の条件は外部システムに格納されている値に基づくシナリオでは、通常、Microsoft Business Connectivity Services (BCS) でワークフローを使用する必要があります。たとえば、経費の合計額が安全限度を超えている場合にだけ、承認を得るために上司に経費明細書を送信するという経費承認シナリオがあるとします。経費の金額が安全限度以下の場合、経費は自動的に承認され、明示的な承認は必要ありません。経費の安全限度は変更される可能性があるので、その限度は外部システムに格納し、後で外部リストを経由してワークフローによって参照します。
このトピックの例では、SafeLimit 外部コンテンツ タイプに基づく外部リスト、ワークフロー、および参照変数を作成する手順を説明します。
注意
このシナリオでは、ユーザーが SharePoint Designer リスト アイテム アクティビティを使用して SharePoint リストで操作を行っていた場合は、外部リストに対してリスト アイテム アクティビティを使用する方法をユーザーは理解していると想定しています。リスト アイテム アクティビティの動作の主な違いは、アイテムの検索では、ID を使用するのではなく、そのアイテムの識別用の列を使用する点です。
SharePoint Designer アクティビティを使用して安全限度ワークフローを作成するには
SharePoint Designer で、外部コンテンツ タイプを作成し、「SafeLimit」という名前を付けます。
外部コンテンツ タイプには、EmployeeID と Limit (安全限度の値用) の 2 つのフィールドが必要です。
SafeLimit 外部コンテンツ タイプを使用して外部リストを作成し、「SafeLimits」という名前を付けます。
経費明細書用のドキュメント ライブラリを作成し、「ExpenseReports」という名前を付けます。EmployeeID 用の列を追加します。
SharePoint Designer の、ExpenseReports ドキュメント ライブラリで、[新しいリスト ワークフロー] をクリックします。
ワークフローの名前と説明を入力して、[続行] をクリックします。
これで、ワークフロー デザイナーで新しいアクティビティを追加できるようになりました。
[ワークフローの変数を設定する] アクションを挿入します。
ワークフロー変数ハイパーリンクをクリックして、[新しい変数の作成] をクリックします。
この新しい変数に「SafeLimit」という名前を付けます。
値をクリックして [fx] ボタンをクリックし、外部リストに参照を作成します。
[データ ソース] で [SafeLimits] 外部リストをクリックします。
このデータ ソースから安全限度の値が取得されます。
[ソースのフィールド] で、安全限度を表示するフィールドを選択します。この例では、Limit という名前のフィールドです。
アイテムを参照するときに使用する情報を定義します。このシナリオでは、従業員 ID によって外部リスト アイテムを検索します。このため、[フィールド] では [EmployeeID] フィールドをクリックします。
参照する値を選択します。このシナリオでは、現在のアイテムから EmployeeID フィールドを選択するので、ダイアログ ボックスの [fx] ボタンをクリックします。
表示されたダイアログ ボックスで、[データ ソース] で [現在のアイテム] をクリックし、[ソースのフィールド] で [EmployeeID] をクリックします。
図 1 に参照ダイアログ ボックスを示します。
図 1. 安全限度の参照ダイアログ ボックス
[OK] をクリックして、参照変数を作成します。
参照変数を作成した後に、図 2 に示すような警告が表示されます。この警告が表示されるのは、外部リストでアイテムを検索するために選択された列に一意の値がないことが原因です。この場合、複数の値が見つかった場合は、最初の値を返すことをユーザーに通知しています。通常、この警告は外部リスト アイテムについて表示されます。
図 2. 参照警告
次のシナリオでは、すべての経費提出について 1 つの安全限度を使用するのではなく、特定の予算カテゴリの安全限度を追加することによって、前のシナリオを拡張しています。たとえば、旅費交通費の安全限度と設備費の安全限度を分けることができます。従業員が経費明細書を提出すると、ワークフローは、実行するアクションを決定するためにカテゴリとその経費限度を検証します。
セキュリティで保護されたワークフロー アクションを作成するには
「コード スニペット: Sandboxed ワークフロー スキーマ」では、このトピックで説明しているアクションを実装します。アクションでは、アイテムを 1 回読み取り、その 1 回の外部システムとのトランザクションで他のプロパティを読み取ります。また、さらに多くのユーザーがリストに対してワークフローを作成できるようにこのアクションを Microsoft SharePoint Designer 2010 に表示します。SharePoint Designer ではループをサポートしていないので、アクションはアイテムの配列を戻すことができません。代わりに、アイテムを読み取ってそのプロパティを XML 文字列で格納するアクションを作成できます。この XML 文字列から特定のフィールド値を読み取って SharePoint Designer 変数に格納する別のアクションを作成します。このアクションは、たとえば、読み取る必要がある値だけを格納するように最適化できますが、この例は、アイテムにどのようなプロパティ セットがある場合でもそのアイテムのプロパティを返すことができるように最も一般的で再利用可能な方法として実装されます。
次の署名が指定されたメソッドは、外部リストから値を読み取ります。
public static Hashtable GetExternalListItemByField(SPUserCodeWorkflowContext context, String externalListId, string fieldName, string fieldValue)
このメソッドは、外部リストの識別子 (ID) を取得し、次に "fieldname" という名前のフィールドで "fieldValue" を持つ最初のアイテムを検索することによって、そのリストのアイテムを検索します。アイテムを見つけると、各フィールドをデータ テーブルに配置し、後でユーザーが解析できるように XML として保存します。関数は、SharePoint リスト アイテムに対しても機能するくらい汎用です。関数は Finder と Specific Finder を 1 回だけ呼び出して、すべてのプロパティを取得するので、これにより、パフォーマンスを向上できます。ただし、その後もユーザーは Finder を呼び出します。このアクションを最適化して、Finder を 2 回だけ呼び出すようにすることができます。これについては、後で説明します。
アイテムを読み取った後で、次の署名が指定されたメソッドを呼び出し、value パラメーターによって指定されたフィールドを参照します。
public static Hashtable GetItemDataFromString(SPUserCodeWorkflowContext context, string itemData, string value)
このメソッドは、itemData パラメーターでアイテムのすべてのプロパティが記述された XML 文字列を取得し、データ テーブルを再構成し、value パラメーターによって指定されたフィールドを参照します。このとき、関数の呼び出しごとにデータ テーブルの再読み込みは実行されません。呼び出しごとに外部システムと通信する場合よりも処理時間を大幅に短縮できます。また、SharePoint Designer ユーザーは、メソッドに調べる列をハードコードするのではなく、その列を選択できます。
プロジェクトで重要な他のファイルは、BCSWorkflowActivities ディレクトリにある elements.xml ファイルです。このファイルでは、セキュリティで保護されたアクションを SharePoint Designer で表示する方法、およびユーザーがプロパティをマップする方法を SharePoint Designer に指示します。このファイルの詳細は、このトピックでは説明しませんが、ファイルの基本構造は、Office SharePoint Designer 2007 で使用されている ACTIONS.xml ファイルと同じです。
BCS セキュリティで保護されたアクティビティのサンプルを使用するには
Microsoft ダウンロード センターから BCS セキュリティで保護されたアクティビティのサンプルをダウンロードし、解凍します (「SharePoint 2010 Reference: Software Development Kit (英語)」を参照してください)。
Visual Studio 2010 でサンプルを開きます。
F6 を押して、ソリューションをビルドします。
ソリューションを展開します。
ソリューションを別のコンピューターに展開している場合は、手順 3. で作成したソリューション パッケージ (.wsp ファイル) を使用して、以下の操作を実行できます。
[サイトの設定] の [ギャラリー] で、[ソリューション] を選択します。
.wsp ファイルをアップロードして、アクティブ化します。
ワークフローを作成するには
SharePoint Designer で、外部コンテンツ タイプを作成し、「SafeLimit」という名前を付けます。
外部コンテンツ タイプには、EmployeeID、EquipmentLimit、EquipmentApprover、MoraleLimit、MoralApprover、TravelLimit、および TravelApprover の 7 つのフィールドが必要です。
SafeLimit 外部コンテンツ タイプの外部リストを作成し、「SafeLimits」という名前を付けます。
経費明細書用のドキュメント ライブラリを作成し、「ExpenseReports」という名前を付けます。
EmployeeID と ExpenseType 用の 2 つの列を追加します。
ExpenseType は、Morale、Equipment、Travel の選択肢を持つ選択フィールドにする必要があります。
SharePoint Designer の、ExpenseReports ドキュメント ライブラリで、[新しいリスト ワークフロー] をクリックします。
ワークフローの名前と説明を入力し、[続行] をクリックします。
この時点で、ワークフロー デザイナーに移動するので、新しアクションを追加できます。
[フィールドによって外部リスト アイテムを取得する (セキュリティで保護された関数)] を挿入します。
1 番目のパラメーターに SafeLimits 外部リストを選択します。
2 番目のパラメーターの [fx] ボタンを使用して、CurrentItem を使用している EmployeeID 列を選択します。
3 番目のパラメーターに「EmployeeID」と入力します。
出力パラメーターはそのままにすることができます (既定では ItemString に設定されます)。
ItemString に格納したアイテムからデータの列を読み取るには、[外部リスト アイテムのデータを読み取る (セキュリティで保護された関数)] を挿入します。
1 番目のパラメーターでは、表示するフィールドを入力します。このシナリオでは、選択フィールド ExpenseType に格納されている値を使用して、その値に Limit を追加します。
2 番目のパラメーターで、ItemString 変数を選択します。
3 番目のパラメーターは、検出される値です。「limit」という名前を付けます。
手順 8. を繰り返し、ExpenseType の値に (Limit ではなく) Approver を追加し、出力を承認者に変更します。
図 1 に、この手順によって作成されるワークフローを示します。
図 1. セキュリティで保護されたワークフロー
セキュリティで保護されたワークフロー アクションの一般的な使用シナリオ
完全信頼アクティビティを展開するアクセス許可がなく、次のどちらかの操作を実行する場合は、外部リストに対してセキュリティで保護されたワークフロー アクションを使用します。
外部リストから多数の値を読み取る。
SharePoint リストと外部リストに対して機能する簡単な関数を記述する。
セキュリティで保護されたワークフロー アクションを使用するときのヒント
セキュリティで保護されたワークフロー アクションがセキュリティで保護されたワーカー プロセス アプリケーション ドメインを取得できない場合は、ワークフローが失敗する可能性があります。管理者によって構成されるアプリケーション ドメインの数は固定されていて、アプリケーション ドメインは、アクション、Web パーツ、イベント レシーバーなど、すべてのセキュリティで保護されたコードによって共有されます。このため、次の状況でセキュリティで保護されたアクションを使用するときには注意が必要です。
完了までに時間がかかる、複雑なセキュリティで保護されたコード アクション
遅い外部リスト
多数のワークフローがほぼ同時に実行される環境
ワークフローの失敗を処理できないシナリオ
セキュリティで保護されたコード サービスは、アプリケーション プールとは異なるアカウントでこのような呼び出しを実行できるので、このアカウントを Secure Store Service で確実に設定する必要があります。
外部リスト アイテムから読み取ったデータのローカル コピーを格納する場合は、そのデータが新しいことを確認する必要があります。