Permissions

將自定義 SQL Server 登錄添加到 Microsoft Dynamics CRM 4.0,得到空結果集

  • August 22, 2018

在工作中,我們安裝了 Microsoft Dynamics CRM 4.0,員工使用他們的 LAN 登錄來登錄 CRM 的 Web 界面。

我們使用 db_datareader 角色添加了一個基於 SQL Server 的自定義登錄(到伺服器和 db *_MSCRM)。新登錄名可以從視圖中進行選擇,但它會返回一個空的結果集。如果我使用我的 LAN ID 登錄 SQL Server Management Studio 並針對同一個視圖執行 sql,我會得到預期的數據。

任何想法有什麼遺漏或錯誤?


更新

我最終能夠繞過這個問題。問題是視圖後面的 sql 連結到一個自定義使用者表,這阻止了我的 sql 伺服器登錄返回任何數據,因為它不在這個自定義使用者表(SystemUserBase)中

left join SystemUserBase u on (u.SystemUserId = dbo.fn_FindUserGuid() and u.IsDisabled = 0)
left join UserSettingsBase us on us.SystemUserId = u.SystemUserId
left join OrganizationBase o on u.OrganizationId = o.OrganizationId

我猜微軟是這樣設計的,以便產品是自助服務的,而您不需要 DBA 來將使用者添加到數據庫。使用者通過應用程序進行管理。安全性是通過視圖強制執行的。

在任何情況下,我都可以通過傳遞我的 LAN ID 的 SystemUserId guid 來繞過它,同時作為通用 sql 登錄名登錄。有一個函式可以返回目前登錄的 LAN ID 的 guid: print dbo.fn_FindUserGuid();。然後我只執行了視圖 sql 的修改副本:

declare @user_guid char(36);
set @user_guid = 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'; /* obfuscated */
...

left join SystemUserBase u on (u.SystemUserId = @user_guid and u.IsDisabled = 0)
...

我還必須刪除對通用登錄沒有執行權限的任何函式的任何引用(即dbo.fn_UTCToTzSpecificLocalTime)。或者我可以授予每個人的執行權。

或者,我可能會調查在表中為我的通用登錄創建一個條目SystemUserBase,這樣我就不會被綁定到我的 LAN guid。


更新 2

我能夠消除對 LAN guid ( SystemUserBase.SystemUserBase) 的需要。我只是刪除了所有與權限相關的 where 子句。然後,StringMap 查找所需的只是OrganizationBase.OrganizationIdguid,OrganizationBase.LanguageCode在我們的例子中是 en-us 或 1033。

如果我不關心查找,我就不需要任何東西。我會直接反對錶而不使用 StringMaps 或權限 where 子句。

你的方法是錯誤的。

如果您想使用過濾視圖,您必須使用具有 CRM 帳戶的域使用者。應用程序在數據庫安全層之上有自己的安全層。因此,儘管您已授予使用者對數據庫本身的訪問權限,但應用程序將負責他的 CRM 權限的安全性。查看過濾視圖

篩選視圖完全符合 Microsoft Dynamics CRM 安全模型。當您執行從篩選視圖中獲取數據的報表時,Microsoft Dynamics CRM 安全形色確定您可以在報表中查看哪些數據。

請記住,在 Dynamics CRM 中,基本上唯一真正支持的直接數據庫訪問的使用是報告(這僅限於過濾視圖)。出於任何其他原因,您不應直接與數據庫互動。

引用自:https://serverfault.com/questions/418705