CRM 2011:用户缺少特殊权限

时间:2014-08-28 21:15:03

标签: dynamics-crm-2011 dynamics-crm crm

我们使用SDK在CRM 2011中创建了一大堆用户。但是,我们通过数据库添加了他们的安全角色记录。

一切似乎都运行正常,直到这些用户开始保存自己的用户仪表板和高级查找。

用户可以创建自己的用户仪表板。然而,一旦他们创造了它们,他们就看不到它们了。它们不在他们的仪表板列表中 - 只有那里的系统仪表板。

事件查看器甚至跟踪日志中没有错误。

我使用SQL事件探查器查看它在做什么,我发现它正在检查PrincipalEntityMap表中是否有一个对象类型为1031的主体 - 这是用户仪表板(称为UserForm)。

如何创建这些记录?

我可以编写一个SQL脚本来填充这些缺失记录的数据库。

我想知道他们失踪的原因?有任何想法吗?

PrincipalEntityMap的记录来自哪里?

2 个答案:

答案 0 :(得分:3)

因为我们通过数据库而不是通过SDK创建了UserRole(即用户安全角色)记录 - 我们错过了一些POA(主要对象访问)相关记录。 可以调用许多存储过程来重新初始化这些记录。 我们编写了一个脚本来为所有用户重置这些记录:

-- This will create PrincipalEntityMap for users - if they are not there:
INSERT INTO PrincipalEntityMap (ObjectTypeCode, PrincipalId, PrincipalEntityMapId)
SELECT 1031, sup.PrincipalId, NEWID()
FROM SystemUserPrincipals sup 
INNER JOIN SystemUser su ON su.SystemUserId = sup.SystemUserId
WHERE 
(sup.PrincipalId = su.SystemUserId) AND
(sup.PrincipalId NOT IN
    (
        SELECT pem.PrincipalId 
        FROM PrincipalEntityMap pem
        WHERE pem.ObjectTypeCode = 1031
    )
)

DECLARE @PrincipalTable TABLE (PrincipalID uniqueidentifier)
DECLARE @CurrentPrincipalID uniqueidentifier
DECLARE @UserIds VARCHAR(60)
DECLARE @Type INT

BEGIN TRANSACTION ResetPrincipalEntitiyMap
BEGIN
    SET @Type = 8

    INSERT INTO @PrincipalTable (PrincipalID)
    SELECT sup.PrincipalId 
    FROM SystemUserPrincipals sup WITH (NOLOCK) 
    INNER JOIN SystemUser su WITH (NOLOCK) ON sup.SystemUserId = su.SystemUserId AND sup.PrincipalId = su.SystemUserId


    WHILE EXISTS (SELECT PrincipalID FROM @PrincipalTable)
    BEGIN

        SELECT TOP 1 @CurrentPrincipalID = PrincipalID
        FROM @PrincipalTable
        ORDER BY PrincipalID ASC

        EXEC p_PrincipalEntityMapReinit @CurrentPrincipalID, @Type

        EXEC p_PrincipalAttributeAccessMapReinit @CurrentPrincipalID, @Type

        SET @UserIds = cast(@CurrentPrincipalID AS VARCHAR(50))

        EXEC p_SystemUserBuEntityMapReinit @UserIds

        DELETE FROM @PrincipalTable WHERE PrincipalID = @CurrentPrincipalID

    END
END


COMMIT TRANSACTION ResetPrincipalEntitiyMap
  

请注意:始终执行安全性的插入/更新/删除   通过相关实体(User,UserRole,Team,TeamRole等)   SDK--而不是数据库。 SDK做了一些奇怪的事情   如果使用SQL,将会遗漏的背景。

答案 1 :(得分:1)

在尝试解决CRM 2013上的Exchange服务器端同步的常见/常见问题时(错误代码电子邮件服务器:Crm.80044151,当启用了联系人,任务和任命的同步时),我们也尝试过使用您的脚本重新启动主表 对于CRM2013 / 15,它必须稍微修改,因为SP p_PrincipalEntityMapReinit的签名已经改变。
这是更新的TSQL - 也许它可以帮助其他人(在我们的例子中,它没有:():

DECLARE @PrincipalTable dbo.EntityIdCollection
DECLARE @CurrentPrincipalID uniqueidentifier
DECLARE @UserIds VARCHAR(60)
DECLARE @Type INT

BEGIN TRANSACTION ResetPrincipalEntitiyMap
BEGIN
    SET @Type = 8

    INSERT INTO @PrincipalTable (id)
    SELECT sup.PrincipalId 
    FROM SystemUserPrincipals sup WITH (NOLOCK) 
    INNER JOIN SystemUser su WITH (NOLOCK) ON sup.SystemUserId = su.SystemUserId AND sup.PrincipalId = su.SystemUserId

    EXEC p_PrincipalEntityMapReinit @PrincipalTable, @Type

    WHILE EXISTS (SELECT id FROM @PrincipalTable)
    BEGIN

        SELECT TOP 1 @CurrentPrincipalID = id
        FROM @PrincipalTable
        ORDER BY id ASC

        EXEC p_PrincipalAttributeAccessMapReinit @CurrentPrincipalID, @Type, 1

        SET @UserIds = cast(@CurrentPrincipalID AS VARCHAR(50))

        EXEC p_SystemUserBuEntityMapReinit @UserIds

        DELETE FROM @PrincipalTable WHERE id = @CurrentPrincipalID

    END
END

COMMIT TRANSACTION ResetPrincipalEntitiyMap