Dynamics CRM ではセキュリティーロールが、各Entityに対してどのような権限(なし、個人、部署、部署配下、組織)を持つかをセキュリティーロールの管理画面から確認できます。

一方、ユーザには複数のロールが付与されたできます。その場合の各エンティティの権限は、各セキュリティロールのEntityに対するアクセス権限のなかで、より高い権限が有効になります。つまり、アクセス権が個人と部署の場合は、部署レベルのアクセス権をユーザが有することになります。

今回は、試行錯誤的に調べた結果ですが、ユーザが各Entityに対して複数ロールがアサインされた結果、どの権限をもつかを調べる方法を紹介します。

そのため、確認できる内容は、セキュリティーロールの管理画面で表示されるエンティティや特権内容とは必ずしも一致しないのでご注意ください。

今回は、1台に必要なDynamics CRM とミドルがインストールされた環境で確認を行っています。

1. 複数ロールが付与されたユーザのエンティティに対するアクセス権限を確認する

1.1 セキュリティロールのEntityに対するアクセス権の確認

ユーザに付与されているロールは、下図のようにセキュリティーロールの管理画面から、確認できます。この方法だと、各ロールごとの権限しかわかりません。

1.2 SQLによって、ユーザのエンティティごとの権限の確認

複数ロールが付与された結果の最終的なアクセス権限を調べるために次のSQL を使用します。クエリは Dynamics CRM システム管理者または、システムカスタマイザロールを持つユーザでSQL Server にログインして、実行してください。

ひょっとしたら複数ロールの付与結果を確認するうまい方法が他にあるかもしれません。もしあるのなら教えていただければと思います。下図で、systemuserroles.systemuseridと比較している値に実際のCRMユーザのsystemuserid を指定します。下の例ではsystemuseridはハードコードされていますが、権限を調べるユーザのIDに変更する必要があります。

-- ユーザに付与された全ロール権限を加味したアクセス権を取得する
-- 16 が ユーザ, 32 が 部署, 64 が部署配下, 128 が組織全体
-- null の場合は選択なし
select pvt.logicalname, pvt.label, [1] As [Read], [2] As [Write], [4] As [Append], [16] As [AppendTo]
            , [32] As [Create], [65536] As [Delete], [262144] As [Share], [524288] As [Assign]  
  from (
    select entity.logicalname, localizedlabel.label, privilege.accessright
         , CASE 
            WHEN roleprivileges.privilegedepthmask < 16 THEN roleprivileges.privilegedepthmask * 16
            ELSE roleprivileges.privilegedepthmask 
           END privilegedepthmask
      from dbo.RolePrivileges roleprivileges 
     inner join dbo.FilteredSystemUserRoles systemuserroles
        on roleprivileges.roleid = systemuserroles.roleid
     inner join dbo.FilteredPrivilege privilege
        on roleprivileges.privilegeid = privilege.privilegeid
     inner join dbo.PrivilegeObjectTypeCodes privilegeobjecttypecode
        on privilege.privilegeid = privilegeobjecttypecode.privilegeid
     inner join MetadataSchema.Entity entity
        on entity.objecttypecode = privilegeobjecttypecode.objecttypecode
     inner join MetadataSchema.LocalizedLabel localizedlabel
        on entity.entityid = localizedlabel.objectid
       and localizedlabel.objectcolumnname = 'LocalizedName'
       and localizedlabel.LanguageId = '1041'
     where systemuserroles.systemuserid = '57BDD239-1A4F-DE11-AC80-0003FFBF2D57'
      ) As t
    pivot(
      MAX(privilegedepthmask)
        FOR accessright IN
      ( [1],[2],[4],[16],[32],[65536],[262144],[524288] )
    ) AS pvt
 order by logicalname asc

SQL Server Management Studio を起動して、SQL を実行した結果のイメージがした図です。

選択行の権限を説明します。各権限で16が個人、32が部署、64が部署配下、128が組織、NULLが未選択または、権限項目がないEntity(組織レベルのEntity)です。

列名 意味
logicalname エンティティの論理名
label エンティティ名
Read 読み込み
Write 書き込み
Append 追加
AppendTo 追加先
Create 作成
Delete 削除
Share 共有
Assign 割り当て

1.3 レポーティングサービス

Visual Studio のレポートサーバプロジェクトで、上記のSQL を使用した権限のレポートを作成してみました。実行例は以下のとおりです。

2. まとめ

今回の説明は以上です。最終的なアクセス権がどのようになるのかを知りたいという要望があると思うので、今回ご紹介した方法がお役に立てればと思います。

また、もっとうまい方法があれば、教えていただれ場と思います。