分布式事务协调器在几个小时后停止正常工作

分布式事务协调器在几个小时后停止正常工作

我们注意到 DTC 服务已停止正常工作。来自 ASP.NET 应用程序的日志:

System.UnauthorizedAccessException: Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
   at System.Transactions.Oletx.IDtcProxyShimFactory.ConnectToProxy(String nodeName, Guid resourceManagerIdentifier, IntPtr managedIdentifier, Boolean& nodeNameMatches, UInt32& whereaboutsSize, CoTaskMemHandle& whereaboutsBuffer, IResourceManagerShim& resourceManagerShim)
   at System.Transactions.Oletx.DtcTransactionManager.Initialize()
   at System.Transactions.Oletx.DtcTransactionManager.get_ProxyShimFactory()

在此状态下,无法重新启动 DTC。我们注意到 Windows 日志中有一些事件,因此我们尝试了不同的解决方案。以下方法确实有帮助,但只能持续几个小时:https://technet.microsoft.com/en-us/library/cc774114(v=ws.10).aspx。DTC 重新启动,但随后出现以下事件并且问题再次出现:

Source: Microsoft-Windows-MSDTC Client
Date: 2017-03-16 09:25:19
Event ID: 4356
Task Category: MSDTC Proxy
Description:
Failed to initialize the MS DTC Communication Manager.  Error Specifics: hr = 0x80070005, com\complus\dtc\dtc\cm\src\ccm.cpp:2118, CmdLine: C:\Windows\system32\msdtc.exe, Pid: 4252

再次重新启动 DTC 会导致错误,因此出现以下事件:

Source: Microsoft-Windows-MSDTC
Date: 2017-03-16 10:20:41
Event ID: 4441
Task Category: SVC
Description:
A MS DTC component has encountered an internal error. The process is being terminated. Error Specifics: DtcSystemShutdown (com\complus\dtc\dtc\msdtc\src\msdtc.cpp@2485): Shutting down with an error

Source: Microsoft-Windows-MSDTC
Date: 2017-03-16 10:20:41
Event ID: 4439
Task Category: Unknown
Description:
Failed to verify MS DTC service account information. Internal Information : msdtc_trace : File: com\complus\dtc\shared\util\security.cpp, Line: 818, VerifyAccountInfo: CService::Create failed, hr=0x80070005.

Source: Microsoft-Windows-MSDTC Client
Date: 2017-03-16 10:20:41
Event ID: 4356
Task Category: MSDTC Proxy
Description:
Failed to initialize the MS DTC Communication Manager.  Error Specifics: hr = 0x80070005, com\complus\dtc\dtc\cm\src\ccm.cpp:2118, CmdLine: C:\Windows\system32\msdtc.exe, Pid: 4252

DTC 重新配置再次有所帮助,但持续时间不长。更多值得注意的事件:

Log Name:      Application
Source: Microsoft-Windows-MSDTC Client
Date: 2017-03-14 12:03:27
Event ID: 4156
Task Category: CM
Description:
String message: INFORMATIONAL: Negotiate Resources returned OUT OF RESOURCES IN SSTATE_UP.

Source: Microsoft-Windows-Perflib
Date: 2017-03-15 13:58:59
Event ID: 1008
Task Category: None
Description:
The Open Procedure for service "MSDTC" in DLL "C:\Windows\system32\msdtcuiu.DLL" failed. Performance data for this service will not be available. The first four bytes (DWORD) of the Data section contains the error code.

答案1

感谢微软支持部门的 Martin Nolte 和 Feroz Khan,我们成功解决了这个问题。

确认问题与“红色箭头问题”无关。运行 dcomcnfg 打开组件服务,查看“我的电脑”上是否有“红色箭头”。

  1. 如果您在数据库服务器上看到 MSDTC 红色箭头。要纠正此问题,请按照下面提到的步骤操作(或从https://blogs.msdn.microsoft.com/asiatech/2010/02/21/how-to-troubleshoot-the-red-arrow-issue-in-component-services-i/

  2. 确保 MSDTC 服务已启动: DTC 服务状态

  3. 验证用户组是否有权读取 下的子项HKEY_CLASSES_ROOT\CLSID。如果用户组没有权限读取子项,则 COM+ 系统应用程序服务可能无法启动并导致相同的“红色箭头”问题。要授予用户组读取权限,我们可以按照以下步骤操作(首先我们应该备份HKEY_CLASSES_ROOT\CLSID):

    • 打开Regedt32,找到HKEY_CLASSES_ROOT\CLSID
    • 选择CLSID,点击菜单栏中的安全->权限
    • 在安全选项卡中,在权限列表中添加USERS,并赋予其读取权限。
    • 单击“高级”按钮,选择“用此处显示的适用于子对象的条目替换所有子对象的权限条目”选项。单击“应用”。
  4. C:\Windows\Registration检查每个人是否对及其子对象都有读取权限。

  5. 确保 COM+ 系统应用程序服务处于启动状态: COM+ 系统应用程序服务状态
  6. MSDTC 服务应允许经过身份验证的用户查询服务状态。要检查这一点,我们可以在命令窗口中运行以下命令:

    sc sdshow msdtc
    
  7. 如果Authenticated Users组没有对MSDTC服务对象的查询权限,这将导致大多数用户没有权限获取MSDTC服务状态,例如:

    (A;;CR;;;AU)
    
  8. 我们需要运行此命令为Authenticated user授予足够的权限,然后重新启动DLLHOST.exe(执行此操作之前,请备份“sc sdshow msdtc”的输出信息):

    sc sdset msdtc D:(A;;CCLCSWRPLOCRRC;;;S-1-2-0)
    (A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)
    (A;;CCLCSWLOCRRC;;;IU)(A;;CCLCSWLOCRRC;;;SU)(A;;CCLCSWLOCRRC;;;AU)        
    (A;;CCLCSWRPWPDTLOCRRC;;;PU)(A;;CCLCSWRPLORC;;;NS)S:
    (AU;FA;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WD)
    
  9. 如果上述步骤不起作用,您必须遵循其他步骤,例如重建 COM+ 目录和消除注册表项损坏。

  10. 重启服务器

验证 MSDTC 服务问题是否仍然存在。如果是,请确保您没有为 MSDTC 设置组策略。

  1. 恢复默认账户:https://technet.microsoft.com/en-us/library/cc774114(v=ws.10).aspx

  2. 如果在 dcomcnfg 中将帐户设置为“网络服务”,则会设置以下注册表值AccountNameHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security.

  3. 要检查此注册表值是否受组策略的影响,您可以执行以下步骤:

    • rsop.msc在受影响的计算机上打开,将显示已应用的组策略
    • 检查“计算机配置”,转到“Windows 设置”/“安全设置”,然后检查“注册表” 组策略的安全设置
    • 你能看到 的任何定义吗HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security
    • 检查“系统服务”,它也位于“安全设置”下方。你能看到“分布式事务协调器”的任何修改吗?
    • 转到“用户配置”并按照步骤 2、3 和 4 中的相同步骤进行操作。
  4. 要获取所有应用的组策略,您需要下载

  5. 打开 Powershell 命令提示符并输入以下命令:

    Import-Module GroupPolicy Get-GPOReport -All -ReportType Html -Path AllGPOsReport.htm
    
  6. 为 MSDTC 设置默认组策略

  7. 跑步iisreset /restart
  8. 再次恢复默认帐户:https://technet.microsoft.com/en-us/library/cc774114(v=ws.10).aspx
  9. MSDTC 服务应正常工作

答案2

由于“HP Print and Scan Doctor”Windows 服务,我们遇到了“红色箭头”问题和无法正常运行的 MSDTC。停止该服务(并重新启动分布式事务协调器服务)后,该服务即可恢复正常运行。

另请参阅此 HP 论坛帖子:https://h30434.www3.hp.com/t5/Notebook-Operating-System-and-Recovery/COM-Unable-to-talk-to-Microsoft-Distributed-Transaction/td-p/6983012https://h30434.www3.hp.com/t5/Notebook-Operating-System-and-Recovery/Windows-10-COM-is-unable-to-talk-to-MS-DTC-because-of-HP/td-p/6924150

相关内容