InfoPathでフォームを開いたユーザーが指定したSharePointグループのメンバーかどうか判定する方法

SharePointのInfoPath フォーム内で、フォームを開いたユーザーが、SharePointの指定したグループのメンバーかどうかを判定する方法についてです。

以下のサイトを参考にしました。

* [Checking if a user is a member in a SharePoint group within web InfoPath 2010 forms]
 (http://www.hishamqaddomi.ca/spg/index.php/sharepoint-2010/infopath-2010/65-checking-if-a-user-is-a-member-in-a-sharepoint-group-within-web-infopath-2010-forms
)
* [InfoPath 2007/2010 – GetUserCollectionFromGroup method](https://pravinsp14.wordpress.com/2013/09/19/infopath-20072010-usergroup-asmx-web-service-getusercollectionfromgroup-method/
)

## データ接続を作成する。

手順は次のとおり。

- リボンから「データ」タブを選択し、「データ接続」ボタンをクリック、「追加」してください。
- 「新しいデータ接続を作成」「データの受信」を選択してください。
- 「次へ」をクリック
- "SOAP Web サービス”を選択
-「次へ」をクリック
- UserGroup.asmx サービスのURLを入力。例：
- https://YourURLToServer/YourPath/YourSite/_vti_bin/UserGroup.asmx
- 「次へ」をクリック
- 認証画面が表示されます。
- 一覧から “GetUserCollectionFromGroup” メソッドを選択
- 「次へ」をクリック
- サンプル値をセットします。判定したいグループ名を入力して、OKします。
- 「次へ」をクリック
- 値をセットします。再度同じグループ名を入力して、OKします。
- 「次へ」をクリック
- データ接続作成されます。自動でデータを取得するにはチェックボックスをオンにしておきます。
- 完了をクリックします。
- 次にローカルに任意の作業用フォルダを作成し、するとデータ接続ファイルのXMLファイルを直に編集できる状態になるので作業用フォルダを作成する。
- 作業用フォルダにソースをエクスポートする。InfoPathで「ファイル」 >「発行」 >「ソース ファイルのエクスポート」する。
- 開いているInfoPathのファイルを一度閉じます。
- エクスポートしたソースの中から GetUserCollectionFromGroup1.xsd を探し編集する。（詳細について後述）
- ソースとしてエクスポートされた manifest.xsf を右クリックして、デザインモードで開く
作成した接続ファイルを接続ファイルに変換をする。「データ」 >「データ接続」 >「GetUserCollectionFromGroup」 >「接続ファイルに変換」 変換先は http://{Your Site }/dataconnectionlibrary/GetUserCollectionFromGroup.udcx
- mainifest.xsf を名前を付けて別名で保存
- 発行

※ソースのmanifest.xsfから各種ソースファイルは参照された状態になります。

## GetUserCollectionFromGroup1.xsdの変更方法

GetUserCollectionFromGroup1.xsdをメモ帳などでファイルを開いて編集します。

次の行を探して、

```xml
<s:import namespace="http://www.w3.org/2001/XMLSchema"></s:import>
```

直下に以下のコードを追記します。

```mxl:GetUserCollectionFromGroup1.xsd
  <!-- Beginning of insert -->
  <s:complexType name="GetUserCollectionFromGroupType">
    <s:sequence>
      <s:element minOccurs="0" maxOccurs="1" name="Users">
        <s:complexType>
          <s:sequence>
            <s:element maxOccurs="unbounded" name="User" >
              <s:complexType>
                <s:attribute name="Notes" type="s:string"></s:attribute>
                <s:attribute name="Name" type="s:string"></s:attribute>
                <s:attribute name="IsSiteAdmin" type="s:string"></s:attribute>
                <s:attribute name="Sid" type="s:string"></s:attribute>
                <s:attribute name="ID" type="s:string"></s:attribute>
                <s:attribute name="LoginName" type="s:string"></s:attribute>
                <s:attribute name="Email" type="s:string"></s:attribute>
                <s:attribute name="IsDomainGroup" type="s:string"></s:attribute>
              </s:complexType>
            </s:element>
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:sequence>
  </s:complexType>
  <!-- End of Insert -->
``` 

次に以下の部分を次のようにコメントアウトして

```xml
    <!--
	<s:element name="GetUserCollectionFromGroup">
		<s:complexType>
			<s:sequence>
				<s:element minOccurs="0" maxOccurs="1" name="groupName" type="s:string"></s:element>
			</s:sequence>
		</s:complexType>
	    </s:element>
    -->
```

代わりに次の行を追記する。

```xml

    <!-- Beginning of Insert -->
    <s:element name="GetUserCollectionFromGroup" type="tns:GetUserCollectionFromGroupType"/>
    <!-- End of Insert -->
``` 

この状態で保存します。

## mainifest.xsfの発行
manifest.xsf を デザインモードで開いて、別名で保存し、発行します。
この段階で、ソースとしてエクスポートしたファイルは不要になります。

## データ接続ファイルの認証情報の変更

次にデータ接続ファイルの認証情報を変更し、アップロードし直します。この作業をしないと、フォームを開いたタイミングで認証エラーとなります。

GetUserCollectionFromGroup.udcx を http://{your Site}/dataconnectionlibrary/からダウンロードし、以下の内容を追記し、アップロードしなおします。

```xml
<!--udc:Authentication><udc:SSO AppId='' CredentialType='' /></udc:Authentication-->
<udc:Authentication><udc:SSO AppId='SampleSSOGroup' CredentialType='NTLM'/>
``` 
※この設定をするためにはあらかじめ SampleSSOGroupを Secure Store Service で用意しておく必要があります。
これで新しいデータ接続が利用できるようになります。

## InfoPathフォームの実装

次にInfoPath側でログインユーザーが該当のグループにいるかどうかを判定する方法です。

- INFOPATHで 変数を２つ追加します
  - SYSTEM_ISADMIN テキスト形式
  - SYSTEM_CURRENTUSER テキスト形式
- データ」＞「フォームの読み込み」でフォームを開いた時の動作を追加します。
- 次のフィールドの値を設定する。 SYSTEM_CURRENTUSER に XPATH で `xdUser:get-UserName()` を登録
- 次のフィールドの値を設定する。 SYSTEM_ISADMIN でGetUserCollectionFromGroupから取得したユーザーを SYSTEM_CURRENTUSERでフィルターした値の個数をセットする。XPATH は次の通り。

```xslt
count(xdXDocument:GetDOM("GetUserCollectionFromGroup")/dfs:myFields/dfs:dataFields/ns1:GetUserCollectionFromGroupResponse/ns1:GetUserCollectionFromGroupResult/ns1:GetUserCollectionFromGroup/ns1:Users/ns1:User/@LoginName[. = xdXDocument:get-DOM()/dfs:myFields/dfs:dataFields/my:SharePointListItem_RW/my:SYSTEM_CURRENTUSER])
``` 

- 最後にセクションを追加し、コントロールのルールに書式を追加し、表示・非表示を設定する。
SYSTEM_ISADMINが1なら表示、0なら非表示など。


## グループ設定の変更
最後に、判定したいグループのグループ設定で、「グループのメンバーシップを表示できるユーザー」を「全てのメンバー」に変更します。

以上が、SharePoint の InfoPathグループの判定をする方法になります。
トリッキーですね。