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. まとめ
今回の説明は以上です。最終的なアクセス権がどのようになるのかを知りたいという要望があると思うので、今回ご紹介した方法がお役に立てればと思います。
また、もっとうまい方法があれば、教えていただれ場と思います。
さんのコメント: さんのコメント: