Microsoft 动态

Microsoft 动态 CRM 的疑难解答

Aaron Elder

 

一眼:

  • 说明一个解决方案的体系结构
  • 鐤戦毦瑙 g 瓟的基本原则
  • 用于诊断服务器问题的工具
  • 解决 CRM 错误的步骤

内容

堆栈
基本规则
鐤戦毦瑙 g 瓟服务器问题
播放家示例
上的换行

我 ’m 回为 Microsoft DynamicsCRM 上第二个项目 (请参阅相应的第一个文章" 部署 Microsoft 动态 CRM 4.0"),关注的内容与我热情有关 — — 也就鐤戦毦瑙 g 瓟。 疑难解答 Microsoft CRM 不是很多不同故障排除任何其他 N 层 Web 应用程序在 Microsoft 堆栈上生成的。 在这种情况下,本文不是操作方法参考线或"101 提示和技巧"的集合。 而是,我将讨论动态 CRM 组件和隔离、 了解,和解决问题的工具的基础知识。 此文章,我将着重只进行故障排除的 Microsoft 动态 CRM 闂   鏈嶅姟鍣 ㄧ  方面。

堆栈

与任何复杂的系统是人类的正文或的 n 层 Web 应用程序利用许多同样复杂的子系统和外部系统的它必须了解"系统堆栈。" 堆栈基本上是系统中,可以了解系统和如何生成每个其他层的所有组件的蓝图。 堆栈可能也被称为解决方案体系结构图,它阐释了该解决方案的组件在这种情况下 Microsoft 动态 CRM。 一旦了解了该解决方案还需要了解已部署该解决方案的方式。 对于此,需要说明了每个解决方案的组件位于其他人在您的部署中的关系在系统体系结构图表。 了解所有这些是能够隔离出问题的关键。

图 1 显示了一个解决方案体系结构图表的动态 CRM 4.0,说明的所有主要组件和它们相互依赖关系。 请注意每个组件反过来可能具有等于或大于复杂性的自己关系图。 计算机系统所有有关抽象,该进程的系统组件使一组的功能的另一个,依赖的组件可以依赖,隐藏内部组件的复杂性。 您需要进行故障排除时,找出问题原因抽象。

fig01.gif

图 1 说明了解决方案体系结构的 UML 包图

若要表示解决方案体系结构,我使用 UML 包图表。 箭头指向方向的"相关性。 渚嬪的方式  CRM 电子邮件路由器"取决"的 SMTP 服务器和客户关系管理平台的 Web 服务。 一个完整的图表是非常是复杂,但这提供了基本的模型。

现在您可以考虑如何在企业内部署 Microsoft 动态 CRM 组件。 鏈  为了我们将使用一个的典型的部署体系结构如 图 2 所示。 了解系统体系结构如何与解决方案体系结构是至关重要的隔离问题时。 不知道组件正在,您可能花费小时尝试查找并修复不甚至在您要修复的计算机上发生的问题 !

fig02.gif

图 2 的典型的部署体系结构

基本规则

在开始疑难解答动态 CRM 问题前,您需要了解几个基本鐤戦毦瑙 g 瓟原则。 第一次,让我们看一下鐤戦毦瑙 g 瓟的基本工作流和一些准则如何知道时它安全地继续执行下一步。

1。 一个问题或错误标识,复制。

  • 您已经确定问题,并具有您读取閿欒  娑堟伅吗?
  • 閿欒  娑堟伅是泛型的吗? 如果是这样,您已经找到"实际错误的步骤吗? 提示: 如果错误为"出现发生的情况与您的系统管理员联系"请记住您的系统管理员可能是,因此需要更多深入查找真正的错误。 移动到第 3 步之前,必须确保在处理实际的错误。

2。 此问题需要能够理解。

  • 是否您阅读并理解閿欒  娑堟伅说话的内容?
  • 有一组一致可靠地重现此问题的步骤的吗?

3。 需要隔离问题。

  • 您的系统体系结构中的哪些系统可以您排除的一个原因或影响该问题?
  • 该解决方案体系结构的哪些组件可以排除的一个原因也的影响?

4。 此修复程序需要标识并理解。

  • 您是否能够找到支持文章、 博客张贴内容,或新闻组投递的建议适用于您的具体问题的修补程序吗?
  • 在应用修补程序之前是否您了解为什么它将更正这个问题?

5。 此修复程序需要应用和验证。

  • 不应用修补程序解决此问题吗? 您需要将能够以确保重现该问题 (第 2 步)。 了解了此修复程序,因为您有 re-tested 可能受影响的系统的其他区域吗?

鐤戦毦瑙 g 瓟服务器问题

鐤戦毦瑙 g 瓟过程的了解我们现在可以移动到所需的诊断问题,Microsoft CRM 中的工具。

DevErrors — 时 Microsoft 动态 CRM 数据提交到服务器,信息被传递给 ASP.NET 处理。 由 ASP.NET 层全局异常处理程序处理的任何错误。 可用性和有时出于安全原因,真正的错误隐藏的调用方 (即是您或您的用户),并而显示一个"友好的错误"。 此错误通常表示类似于"您没有足够的权限"或"找不到请求的记录。 遗憾的是,这些友好错误来自空白列表。 在数百个成千上万的 CRM 可能会引发错误的或任何相关的组件 (SQL、 SRS,.NET、 Windows,等等),只是错误的 CRM 小组考虑可能发生的代码将具有漂亮字符串与它们相关联。 其余部分获取由处理可怕的 catchall 时发生了错误,请与系统管理员联系。 这,当然,不多,系统管理员使用。

因为我们的基本规则之一以获得实际的错误,您需要能够告诉 CRM 被覆盖,或至少不告诉您整个事实时。 该事实 serum 是通过在 web.config 中启用 DevErrors。 这通过修改在 [CRMWEB]\web.config 文件如下:

<add key="DevErrors" value="On"/>

一定要记住您的系统体系结构执行此操作时。 如果您有一个负载平衡环境中配置的两个服务器,您需要找出错误发生在服务器或或者,一定要在两个服务器上启用 DevErrors。 一旦启用了 DevErrors,您将看到看起来类似于 图 3 中的错误。

fig03.gif

图 3 的 Microsoft CRM 错误报告

图 3 提供不同的信息的左侧显示多个项目:

在详细的错误 ) 的第一个屏幕 (默认值) 显示了从 Microsoft 动态 CRM 的角度的实际错误。 这包括日期、 时间和服务器名称发生错误,以及该错误说明、 调用堆栈、 错误号 (如果可用),在源文件和行号发生错误的位置 (如果可用) 和请求的 URL,尝试找出出现的问题时,所有非常有用。

在 ASP.NET 错误 下一项是从 ASP.NET 的角度来看真正的错误。 这提供了在 CRM 错误与很多相同的信息,但将添加选项到"显示详细的编译器输出"并显示完成的复杂源。

诊断信息 图 4 中, 所示的三个屏幕中提供的有关发生错误的位置的该服务器的基本信息和有关客户端和用户发出请求的详细信息。 此信息包括服务器操作系统、.NET 运行库版本,服务器的名称和路径 CRM 的安装位置。 在特定的使用 CRM 数据库和在 web.config 中的设置还将包括信息。 对于客户端,屏幕显示浏览器版本、 屏幕分辨率、 位深度,和更多。 在用户发出请求的信息 (至少从 CRM 的点的视图) 包括用户的域和名称、 CRM 用户名称、 CRM 用户 ID、 业务部门 ID,组织 ID。

fig04.gif

图 4 的诊断信息屏幕

用户将看到 中所示,最后一项 图 5 允许您查看从在结束用户的角度来看,如同 DevErrors 被关闭。

fig05.gif

图 5 将 会看到错误信息的用户

请注意 DevErrors 帮助仅在处理 Web 应用程序请求的过程中发生的错误,涉及一整页的请求提交给服务器。 AJAX 请求,如与发布的自定义,工作流,或在网格操作不支持 DevErrors。 这些,您必须将使用跟踪。

提示: 如果 DevErrors 页上的,信息被截断,并且不能调整以查看更多窗口的大小只需双击页上的任意位置,,一个可调整大小的窗口将打开。

跟踪 ,如果一个 CRM 发生错误任意其他比从直接的 Web 请求,以获得实际的错误,最好使用 CRM 跟踪。 跟踪可以被启用和配置执行在 support.microsoft.com/kb/907490 如何在 Microsoft 动态 CRM 中启用跟踪文章中的步骤。 或者您可以使用工具 (如 CrmDiagTool 框中可用。 网络/共享/6oxfqi2ida。

提示: 在 CRM 4.0,忽略"跟踪目录"。

跟踪可以恐怖的初级用户,以便不沮丧。 一般情况下,只有解决的问题时,才应使用跟踪。 具体取决于您如何配置跟踪,可以有了显著的性能影响其运行时,而且如果在启用详细日志记录,使用频繁的系统可以轻松创建数百个兆字节的每小时的日志。 上述本文提供了配置跟踪,以及如何启用跟踪客户端和服务器的所有方法的详细的说明。

提示: 发送出的帮助跟踪日志时, 一定要先压缩它们。 日志文件是只是文本,通常通过 90%或更多压缩。

日志文件的结构 — — 日志跟踪是在服务器上启用,将放置在跟踪文件夹位于 CRM 的安装位置。 每个服务自己日志文件,每个文件将默认情况下增长到 10 MB 开始一个新的文件之前。 由于日志文件正在积极地写入到各种 CRM 进程,您将停止相应的服务 (IIS 或异步服务) 之前不获取绝对最新跟踪信息。 当您打开该文件夹时您会如看到文件

-CRMDEV-VPC-CrmAsyncService-bin-20090415-1.log

-CRMDEV-VPC-w3wp-CRMWeb-20090415-1.log

存在如下命名约定,则 [机器名称]-[CRM 进程]-[YEAR 月 DAY]-[序列].LOG。

在日志文件包含加载的信息,写入按时间顺序排列的顺序的项目。 注意跟踪日志写入该文件的底部,最新事件,在调用堆栈中写入项时在反向按时间顺序排列的顺序 (最新项目的第一个)。

提示: 查找日志中的错误时, 尝试搜索": 错误"(冒号后面跟随一个的空间,然后错误。

事件日志 ) 的 Windows 事件日志是另一个位置寻找 Microsoft 动态 CRM、 其依赖的组件或在系统的其他区域中出现的错误。 就像在跟踪日志事件日志将通常提供更多有关在系统中发生的错误的详细信息。

Microsoft CRM 不到事件日志中记录所有错误。 渚嬪的方式  禁用的用户试图登录被登录时不会记录试图更新已不存在的记录。 尽管这不已记录 CRM 记录错误事件日志从以下子系统:

-MSCRMPerfCounters

-MSCRMPlatform

-MSCRMKeyArchiveManager

-MSCRMKeyGenerator

-MSCRMEmail

-MSCRMDeletionService

-MSCRMReporting

-MSCRMWebService

-MSCRMAsyncService

-ASP.NET 2.0

在 ASP.NET 2.0 存储桶作为一个"捕获最"的应用程序层的错误。 鍙 ﹀ 的方式  Microsoft 动态 CRM 电子邮件路由器服务具有它自己可以配置为日志信息、 警告,和错误的一个宽范围的独立事件日志 (MSCRMEmailLog)。

由于不需要打开事件日志,因此,查找问题的一个好的起点。

读取一个调用堆栈 ,调用堆栈所有形状和大小并经常通过 nondeveloper 疑难解答忽略。 并不鲜见的系统工程师只是"忽略,开发人员内容"和检索仅错误消息的代码。 建议您不这样做 — — 即使调用堆栈类似于代码它被设计成人类可读和判断出了什么右直到该错误发生。 请看下面的示例:

[ReportServerException: The Report Server Windows service 'ReportServer' is not running. 
   The service must be running to use Report Server. (rsReportServerServiceUnavailable)]
   at Microsoft.Reporting.WebForms.ServerReport.SetDataSourceCredentials(DataSourceCredentials[]credentials)
   at Microsoft.Crm.Web.Reporting.SrsReportViewer.SetExecutionCredentials(ServerReport report)

[CrmReportingException: The Report Server Windows service 'ReportServer' is not running. 
The service must be running to use Report Server. (rsReportServerServiceUnavailable)]
   at Microsoft.Crm.Web.Reporting.SrsReportViewer.SetExecutionCredentials(ServerReport report)
   at Microsoft.Crm.Web.Reporting.SrsReportViewer.ConfigurePage()
   at Microsoft.Crm.Application.Controls.AppUIPage.OnPreRender(EventArgs e)
   at System.Web.UI.Control.PreRenderRecursiveInternal()
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

您看到的内容下面是一个系统所做的所有内容的列表 (调用) 顺序列出反向按时间顺序排列 (堆栈) 直到最后"尝试"执行操作。 在此情况下发生了变化,首先,调用堆栈的底部 — 已 System.Web.UI.Page.ProcessRequestMain() 调用。

在读取调用堆栈时很重要读取每个调用的名称。 列出的每个调用最后一个句点和括号之间单词是方法名称。 在方法名称前的单词是在的命名空间和括号将参数的项。 在这种情况下调用该方法 ProcessRequestMain 是第一次,; 此方法处于 System.Web.UI.Page 命名空间 ;,此方法需要两个布尔型 (真/假) 参数。 立即,通过读取该的命名空间我们知道此调用不是 Microsoft 动态 CRM 的任何代码 ; 这实际上调用在基础.NET 框架中 (由系统的根命名空间表示) 和特别的代码 (表示由 Web 的命名空间) 的 ASP.NET。 读取"向上"堆栈,我们看到 ProcessRequestMain 然后调用 PreRenderRecursiveInternal,然后调用 OnPreRender。 OnPreRender 方法是由 Microsoft.Crm 的命名空间中表示为实际一部分基,Microsoft 动态 CRM 代码的第一个方法。 我们将调用堆栈向上继续,我们看到的 CRM 实际调用到 SetDataSourceCredentials SQL 报告服务方法。 然后,此方法引发 ReportServerException 类型的报表服务器未运行错误的异常。 正如您所见,通过读取该调用堆栈,可以判断此错误不来自 CRM 根本,但而即将从 SQL Server 报告服务 (SSRS),然后在"上传"通过一个 CrmReportingException 为 CRM。 根据您的系统体系结构,则必须确定 SSRS 为了知道到哪里启动瑕佽 В 鍐虫  闂   锛岃服务正在运行的位置。

读取调用堆栈,这种方式可以帮助您的错误实际上来自的 isolate。 最终调用堆栈中的可能类似于 YourCompany.Crm.Extensions.UpdateRecord() ; 这将告诉您错误来自由您的开发人员编写任何代码,或可能是您购买的 ISV 解决方案。

并不鲜见 CRM 错误实际上来自 SQL Server in the case of 参照完整性 (RI) 或其他 SQL 级别约束中,或.NET 框架本身。

播放家示例

现在让我们为您提供有机会在家里播放。 让我们假设您在 CRM 中创建了新用户,并且该用户尝试使用在第一次的系统,遇到错误,如 图 6 所示。

fig06.gif

图 6 按名字时用户收到的 A CRM 错误

您是否要解决此问题采取哪些步骤? 若要解决此问题,我们请按照我们的基本故障排除工作流。

1。 一个问题或错误标识,复制。

您应该询问他试图执行他收到该错误,用户,然后尝试重现,请参阅是否您还可以重新创建该错误的步骤。

2。 此问题需要能够理解。

让我们从疑难解答的角度阅读错误消息: 已登录的用户没有适当的安全权限。

若要了解问题,您必须能够回答两个问题: 谁是"的登录用户"? 哪些"安全权限"?"不具有"他

3。 需要隔离问题。

在这种情况下,您可以通过使用 CRM 跟踪来回答两个问题。 您知道跟踪需要,因为此错误页面在一个对话框,且不提供 DevErrors 将该信息。 CRM 不记录到事件日志的权限如下的错误。 让我们来启用跟踪并重现此问题在使用相同的用户。 跟踪日志提供了以下详细的错误:

MSCRM Error Report:
Error: Exception has been thrown by the target of an invocation.
Error Number: 0x80040220
Error Message: SecLib::CrmCheckPrivilege failed. Returned hr = -2147220960 on UserId: 
  e76c5f50-40b3-dc11-8797-0003ffb8057d and PrivilegeId: 7863e80f-0ab2-4d67-a641-37d9f342c7e3
Error Details: SecLib::CrmCheckPrivilege failed. Returned hr = -2147220960 on UserId: 
  e76c5f50-40b3-dc11-8797-0003ffb8057d and PrivilegeId: 7863e80f-0ab2-4d67-a641-37d9f342c7e3
Source File: Not available
Line Number: Not available
Request URL: https://localhost:5555/AscentiumCrmDev/sfa/accts/edit.aspx?id={906C2F37-8D28-DE11-8D9F-0003FFB23445}
Stack Trace Info: [CrmSecurityException: SecLib::CrmCheckPrivilege failed. Returned hr = -2147220960 on UserId: 
  e76c5f50-40b3-dc11-8797-0003ffb8057d and PrivilegeId: 7863e80f-0ab2-4d67-a641-37d9f342c7e3] at
  Microsoft.Crm.BusinessEntities.SecurityLibrary.CheckPrivilege(Guid user, Guid privilege, ExecutionContext context)
…

此错误之间通过读取调用堆栈详细信息,您可以看到的问题故障导致的 CRM 检查权限。 您可以看到用户发出请求的 GUID 以及他试图使用特权的 GUID。

如果对该权限 7863e80f 0ab2 4 d 67-a641-37d9f342c7e3 执行一个 Live Search,在第一个词是 Microsoft CRM SDK。

按照此链接,您可以看到特权用户需要为 prvWriteAccount,授予帐户实体上的更新用户权利的特权。 为所有已知 GUID 相同的方法将在数百个传出的-的权限的任何起作用。 如果您搜索权限 ID,并且它未找到,权限可能是您的自定义实体的一个正在请求在这种情况下您需要将查询您的本地 SQL Server 以了解哪些权限。 下面的脚本将产生相同的信息:

SELECT PrivilegeId, Name
FROM PrivilegeBase
WHERE PrivilegeId = '7863e80f-0ab2-4d67-a641-37d9f342c7e3'

现在您知道需要什么权限,您只需要验证的用户缺少权限。 有时您可以假设调用的最终用户是,而不能始终将  繚如通过代码,插件的或自定义扩展时执行操作。 在这样的情况下您可能想 CRM 认为试图使用权限若要查找的用户的名称查询。 下面的脚本将处理:

SELECT SystemUserId, DomainName
FROM SystemUserBase
WHERE SystemUserId = 'e76c5f50-40b3-dc11-8797-0003ffb8057d'

提示: 如果用户 GUID 是全部为零 (00000000-0000-0000-0000-000000000000),用户可能 SYSTEM 帐户,这意味着调用用户可能是如网络服务帐户。 系统帐户通常不会 CRM 角色 ; 而是他们被授予通过在 Active Directory 中 PrivUserGroup 提升的权限。

4。 此修复程序需要标识并理解。

您可以现在进入 CRM 和检查,查看用户具有,哪些角色中所示 图 7 .

fig08.gif

图 7 在 CRM 中的用户角色

您可以再向下钻取和查看的销售人员角色实际上丢失了帐户特权上的写入中所示 图 8 .

fig09.gif

图 8 显示了核心记录的销售人员角色它 ’s 丢失写入权限在 帐户。

5。 此修复程序需要应用和验证。

若要解决问题,您只需授予写入权限这一角色,并保存它。 小心以确保您了解这会影响其他用户。 一旦应用此修补程序,您可以让用户再次尝试验证此问题已解决。 您应禁用跟踪然后调用关闭这种情况。

上的换行

故障排除 Microsoft 动态 CRM 意味着以下基本的基本规则和一个方法,包括确定真正的问题、 缩小范围,隔离问题,和了解淇   绋嬪簭。 您会发现 DevErrors、 事件日志,和跟踪工具的 Microsoft 动态 CRM 您鐤戦毦瑙 g 瓟工作的关键。

李 Elder (动态 Microsoft CRM MVP) 适用于 Ascentium、 技术咨询和交互式的市场营销部门。 访问在 Ascentium 日志 ascentium.com/blog/crm.