Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

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

データ接続を作成する。

手順は次のとおり。

  • リボンから「データ」タブを選択し、「データ接続」ボタンをクリック、「追加」してください。
  • 「新しいデータ接続を作成」「データの受信」を選択してください。
  • 「次へ」をクリック
  • "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をメモ帳などでファイルを開いて編集します。

次の行を探して、

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

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

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 -->

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

    <!--
    <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>
    -->

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

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

この状態で保存します。

mainifest.xsfの発行

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

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

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

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

<!--udc:Authentication><udc:SSO AppId='' CredentialType='' /></udc:Authentication-->
<udc:Authentication><udc:SSO AppId='SampleSSOGroup' CredentialType='NTLM'/>

※この設定をするためにはあらかじめ SampleSSOGroupを Secure Store Service で用意しておく必要があります。
これで新しいデータ接続が利用できるようになります。

InfoPathフォームの実装

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

  • INFOPATHで 変数を2つ追加します
    • SYSTEM_ISADMIN テキスト形式
    • SYSTEM_CURRENTUSER テキスト形式
  • データ」>「フォームの読み込み」でフォームを開いた時の動作を追加します。
  • 次のフィールドの値を設定する。 SYSTEM_CURRENTUSER に XPATH で xdUser:get-UserName() を登録
  • 次のフィールドの値を設定する。 SYSTEM_ISADMIN でGetUserCollectionFromGroupから取得したユーザーを SYSTEM_CURRENTUSERでフィルターした値の個数をセットする。XPATH は次の通り。
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グループの判定をする方法になります。
トリッキーですね。

c-nuts
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした