Назад | Перейти на главную страницу

Координатор распределенных транзакций перестает работать должным образом через несколько часов

Мы заметили, что служба 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 и посмотрите, есть ли «Красная стрелка» на «Мой компьютер».

  1. Если вы видите красную стрелку MSDTC на сервере базы данных. Чтобы устранить проблему, выполните действия, указанные ниже (или из https://blogs.msdn.microsoft.com/asiatech/2010/02/21/how-to-troubleshoot-the-red-arrow-issue-in-component-services-i/)

  2. Убедитесь, что служба MSDTC запущена:

  3. Убедитесь, что у группы пользователей есть разрешение на чтение подключей в HKEY_CLASSES_ROOT\CLSID. Если у группы «Пользователи» нет разрешения на чтение подключей, у службы системного приложения COM + могут возникнуть проблемы с запуском, что приведет к той же проблеме «Красная стрелка». Чтобы предоставить разрешение на чтение группе пользователей, мы можем выполнить следующие шаги (сначала мы должны сделать резервную копию HKEY_CLASSES_ROOT\CLSID):

    • открыто Regedt32, найти HKEY_CLASSES_ROOT\CLSID
    • Выберите CLSID, нажмите Безопасность -> Разрешение в строке меню
    • На вкладке «Безопасность» добавьте ПОЛЬЗОВАТЕЛЕЙ в список разрешений, дайте ему разрешение на чтение.
    • Нажмите кнопку «Дополнительно», выберите параметр «Заменить записи разрешений для всех дочерних объектов показанными здесь записями, которые применяются к дочерним объектам». Щелкните Применить.
  4. Проверьте, есть ли у всех разрешение на чтение C:\Windows\Registration и его подобъекты.

  5. Убедитесь, что служба системного приложения COM + находится в запущенном состоянии:
  6. Служба MSDTC должна позволять прошедшим проверку пользователям запрашивать состояние службы. Чтобы проверить это, мы можем запустить эту команду в Командном окне:

    sc sdshow msdtc
    
  7. Если группа прошедших проверку пользователей не имеет разрешения на запрос объекта службы MSDTC, это приведет к тому, что у большинства пользователей не будет разрешения на получение статуса службы MSDTC, например:

    (A;;CR;;;AU)
    
  8. Нам нужно запустить эту команду, чтобы предоставить достаточно прав для аутентифицированного пользователя, а затем перезапустить 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, то будет установлено следующее значение реестра: AccountName под HKEY_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 должна работать правильно