Windows

幾個小時後分佈式事務協調器停止正常工作

  • September 1, 2021

我們注意到 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.

感謝來自 Microsoft 支持的 Martin Nolte 和 Feroz Khan,我們設法解決了這個問題。

確認問題與“紅色箭頭問題”無關。執行 dcomcnfg 打開組件服務,查看“我的電腦”上是否有“紅色箭頭”。

  1. 如果您在數據庫伺服器上看到 MSDTC 紅色箭頭。要糾正此問題,請按照以下步驟(或來自https://blogs.msdn.microsoft.com/asiatech/2010/02/21/how-to-troubleshoot-the-red-arrow-issue-in -組件-服務-i/ )
  2. 確保 MSDTC 服務已啟動: DTC 服務狀態
  3. 驗證 Users 組是否有權讀取 下的子項HKEY_CLASSES_ROOT\CLSID。如果使用者組沒有讀取子項的權限,COM+ 系統應用程序服務可能無法啟動並導致同樣的“紅色箭頭”問題。要將讀取權限授予使用者組,我們可以按照以下步驟操作(首先我們應該備份HKEY_CLASSES_ROOT\CLSID):
  • 打開Regedt32,定位HKEY_CLASSES_ROOT\CLSID
  • 選擇CLSID,點擊菜單欄中的安全 -> 權限
  • 在“安全”選項卡中,在權限列表中添加“使用者”,賦予它“讀取”權限。
  • 點擊高級按鈕,選擇“將所有子對像上的權限條目替換為此處顯示的適用於子對象的條目”選項。點擊應用。
  1. 檢查是否每個人都具有讀取權限C:\Windows\Registration及其子對象。
  2. 確保 COM+ System Application 服務處於啟動狀態: COM+ 系統應用服務狀態
  3. MSDTC 服務應允許經過身份驗證的使用者查詢服務狀態。要檢查這一點,我們可以在命令視窗中執行此命令:
sc sdshow msdtc
  1. 如果 Authenticated Users 組沒有 MSDTC 服務對象的查詢權限,這將導致大多數使用者無權獲取 MSDTC 服務狀態,例如:
(A;;CR;;;AU)
  1. 我們需要執行這個命令給Authenticated使用者足夠的權限,然後重啟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)
  1. 如果上述步驟不起作用,您必須執行其他步驟,例如重建 COM+ 目錄和消除系統資料庫項損壞。
  2. 重啟伺服器

驗證 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 中的相同步驟進行操作。
  1. 要獲取所有應用的組策略,您需要下載
  1. 打開 Powershell 命令提示符並輸入以下命令:
Import-Module GroupPolicy Get-GPOReport -All -ReportType Html -Path AllGPOsReport.htm
  1. 為 MSDTC 設置預設組策略
  2. iisreset /restart
  3. 再次恢復預設賬戶:https ://technet.microsoft.com/en-us/library/cc774114(v=ws.10).aspx
  4. MSDTC 服務應該可以正常工作

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