【问题标题】:How to get the identity of the user who ran a report?如何获取运行报告的用户的身份?
【发布时间】:2012-05-07 04:40:35
【问题描述】:

在 MSCRM 2011 中执行报表时,您有两种数据源选项:SQL 或 Fetch。

在 SSRS 执行日志中,运行报告的用户始终是服务帐户。

使用 fetch 时,在报表执行日志中,有一个参数 CRM_FullName 包含运行报表的用户的全名。

使用 SQL 源时,没有 CRM_FullName 参数。我怎么知道是谁编写了报告?一定有办法知道,因为过滤后的视图知道我是谁。

【问题讨论】:

    标签: reporting-services dynamics-crm dynamics-crm-2011 microsoft-dynamics


    【解决方案1】:

    实际上没有办法找到这些信息。当您为 MSCRM 创建报表时,您使用一个名为“MSCRM 数据连接器”的连接器。这可以在 SSRS 实例的 ExecutionLogs3 视图的 AdditionnalInfo 列中看到。使用此连接器并尝试显示报告时,系统会提示您输入用户名和密码。这就是事情变得有趣的地方。

    报告实际上并不需要用户名/密码!事实上,它希望接收 systemuserid (guid) 作为用户名和 organizationid (guid) 作为密码。然后在 MSCRM_CONFIG 数据库中搜索组织数据库设置。然后,它进入组织数据库并简单地执行set context_info SYSTEMUSERID。最后,filteredviews 正在调用一个名为“[dbo].[fn_FindUserGuid]”的函数来检索 context_info。这就是过滤视图在作为服务帐户连接时正常工作的方式。

    正如您所料,我们无法知道运行报告的用户,因为 SSRS 中的用户名和密码提示从未在任何地方记录(可能出于安全考虑)。

    我发现记录谁运行报告的最佳选择是实际创建一个存储过程,该过程将在过滤后的视图(或任何表)上创建一个选择语句,然后登录到一个单独的表语句、过程参数和 context_info()。然后,在 SSRS 中,我调用该函数,而不是直接转到过滤后的视图。

    【讨论】:

      【解决方案2】:

      用户登录名是否足够?即你可以使用类似的东西吗 ="Generated by " & User!UserID?

      【讨论】:

        【解决方案3】:

        如果使用 sql 源,已编辑答案以包括获取用户全名。

        1. 注册一个参数UserID,默认值为

          =用户!用户 ID

        2. 在您的数据集中使用以下查询

          选择域名,全名

          来自系统用户库

          在哪里(域名 = @UserID)

        3. 然后使用

          =Fields!FullName.Value

        在您的报告中。

        在 CRM 中,用户数据存储在 SystemUserBase 表中,而 DomainName 列是存储在报告的 User!UserID 中的实际 Domain\Username。 如果您更喜欢使用视图,请使用 FilteredSystemUser 视图而不是 SystemUserBase 表。

        对于 fetchxml,请尝试以下操作: 运算符 operator='eq-userid' 表示等于当前用户。

        <fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
        <entity name='team'>
        <attribute name='name' />
        <attribute name='businessunitid' />
        <attribute name='teamid' />
        <order attribute='name' descending='false' />
        <link-entity name='teammembership' from='teamid' to='teamid' visible='false' intersect='true'>
        <link-entity name='systemuser' from='systemuserid' to='systemuserid' alias='user'>
            <attribute name='fullname' />
            <attribute name='systemuserid'/>
                <filter type='and'>
                <condition attribute='systemuserid' operator='eq-userid' />
                </filter>
        </link-entity>
        </link-entity>
        </entity>
        </fetch>
        

        然后在您的报告中,您可以在表达式中使用以下代码来获取用户全名

        =First(Fields!user_fullname.Value, "GetUserData")

        数据集在哪里调用 GetUserData

        【讨论】:

        • 问题是关于使用 SQL Source。如问题所述,我知道使用 FetchXML 时会记录它。
        • 是的,你是对的,如果使用了 sql 源,我已经编辑了答案以包括获取用户名。
        • 您的回答(使用 User!UserID)将在报告中显示用户名,但不会存储在执行日志中。我的问题最初询问如何在执行日志中检索该信息。感谢您投入的时间。
        猜你喜欢
        • 1970-01-01
        • 2019-10-08
        • 1970-01-01
        • 2021-10-10
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多