Мы заметили, что служба 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
Повторный запуск кода неисправности снова заканчивается ошибкой, поэтому появляются следующие события:
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 нам удалось решить проблему.
Убедитесь, что проблема не связана с «красной стрелкой». Запустите dcomcnfg open Component Services и посмотрите, есть ли «Красная стрелка» на «Мой компьютер».
Если вы видите красную стрелку MSDTC на сервере базы данных. Чтобы устранить проблему, выполните действия, указанные ниже (или из https://blogs.msdn.microsoft.com/asiatech/2010/02/21/how-to-troubleshoot-the-red-arrow-issue-in-component-services-i/)
Убедитесь, что служба MSDTC запущена:
Убедитесь, что у группы пользователей есть разрешение на чтение подключей в HKEY_CLASSES_ROOT\CLSID
. Если у группы «Пользователи» нет разрешения на чтение подключей, у службы системного приложения COM + могут возникнуть проблемы с запуском, что приведет к той же проблеме «Красная стрелка». Чтобы предоставить разрешение на чтение группе пользователей, мы можем выполнить следующие шаги (сначала мы должны сделать резервную копию HKEY_CLASSES_ROOT\CLSID
):
Regedt32
, найти HKEY_CLASSES_ROOT\CLSID
CLSID
, нажмите Безопасность -> Разрешение в строке менюПроверьте, есть ли у всех разрешение на чтение C:\Windows\Registration
и его подобъекты.
Служба MSDTC должна позволять прошедшим проверку пользователям запрашивать состояние службы. Чтобы проверить это, мы можем запустить эту команду в Командном окне:
sc sdshow msdtc
Если группа прошедших проверку пользователей не имеет разрешения на запрос объекта службы MSDTC, это приведет к тому, что у большинства пользователей не будет разрешения на получение статуса службы MSDTC, например:
(A;;CR;;;AU)
Нам нужно запустить эту команду, чтобы предоставить достаточно прав для аутентифицированного пользователя, а затем перезапустить 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)
Если описанные выше шаги не сработают, вы должны выполнить другие шаги, такие как восстановление каталога COM + и устранение повреждения ключей реестра.
Убедитесь, что проблема со службой MSDTC все еще существует. Если это так, убедитесь, что для MSDTC не настроены групповые политики.
Восстановите учетную запись по умолчанию: https://technet.microsoft.com/en-us/library/cc774114(v=ws.10).aspx
Если вы установите для учетной записи значение «Сетевая служба» в dcomcnfg, то будет установлено следующее значение реестра: AccountName
под HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security.
Чтобы проверить, влияет ли ваша групповая политика на этот параметр реестра, вы можете выполнить следующие действия:
rsop.msc
на затронутой машине, которая отобразит примененные групповые политикиHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security
?Чтобы получить всю применяемую групповую политику, вам необходимо скачать
Откройте командную строку Powershell и введите следующие команды:
Import-Module GroupPolicy Get-GPOReport -All -ReportType Html -Path AllGPOsReport.htm
Установить групповую политику по умолчанию для MSDTC
iisreset /restart