.NET
Разработка под Windows
Ноутбуки
15 августа 2019

Большой старый сюрприз от HP

Присоединяясь к новому проекту, разработка и поддержание долгоживущей программы, решил обновить себе ноутбук. Давно хотел приобрести себе что-то такое компактное, легкое, чтоб можно было спокойно взять с собой в кофейню, поработать часик-другой вне офиса.


Выбор пал на ноутбук HP c 14'' экраном, поддерживающим расширение 1920x1080, что и явилось решающим критерием для выбора. Железо вроде хорошее, но вот софт от HP заставляет задумываться, а надо ли оно было.


История


Функционал программы, с которым нужно работать, как я уже сказал, долго живущий, т.е. он пережил много итераций, смен руководителей и разработчиков и представляет из себя такой микс всего правильного, понятного и непонятного со статусом "А зачем это было надо?". В общем, хороший legacy код.


Так вот, одной из особенностью функционала является использование распределённых транзакций. Т.е. на компьютере должен работать сервис MSDTC (он же Distributed Transaction Coordinator, он же Координатор распределённых транзакций) и включены соответствующие настройки.


Вроде всё хорошо. У других участников команды (они не используют HP) проект компилируется, запускается и отрабатываются все сценарии. Работа идёт полным ходом.


Хорошо. Беру свой новенький HP, настраиваю, устанавливаю, скачиваю, компилирую, запускаю, прогоняю сценарии и бац, ошибка:


System.Data.SqlClient.SqlException (0x80131904): MSDTC on server 'MALS-K9CA69NU' is unavailable.
   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
   at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
   at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.TdsParser.TdsExecuteTransactionManagerRequest(Byte[] buffer, TransactionManagerRequestType request, String transactionName, TransactionManagerIsolationLevel isoLevel, Int32 timeout, SqlInternalTransaction transaction, TdsParserStateObject stateObj, Boolean isDelegateControlRequest)
   at System.Data.SqlClient.TdsParser.GetDTCAddress(Int32 timeout, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlInternalConnectionTds.GetDTCAddress()
   at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx)
   at System.Data.SqlClient.SqlInternalConnection.Enlist(Transaction tx)
   at System.Data.SqlClient.SqlInternalConnectionTds.Activate(Transaction transaction)
   at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction)
   at System.Data.ProviderBase.DbConnectionPool.PrepareConnection(DbConnection owningObject, DbConnectionInternal obj, Transaction transaction)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at ...

Хорошо. Всякое бывает. Начинаю копать.


После потраченных часов, удаления антивируса, отключения брандмауэра (он же firewall), использования всех рекомендаций из интернета проблема остается. Ошибка упорно вылезает.


Исследуя очередной пост Error: 8004E00F when trying to access COM+ Applications in Component Services натыкаемся на комментарий, спасибо tsd.



Хорошо. Отключаем сервисы начинающиеся с HP, благо их немного:



Отключение первого же сервиса "HP Analytics service" даёт результат. Просто всё начинает работать. MSDTC отрабатывает нормально, все сценарии проходят успешно.


Так кто ты такой, HP Analytics service? Смотрим полный путь и имя исполняемого файла:


C:\windows\System32\DriverStore\FileRepository\hpanalyticscomp.inf_amd64_19ec9c352a1b5135\x64\TouchpointAnalyticsClientService.exe

В поисковике достаточно набрать Touchpoint Analytics Client, чтоб начитаться всего хорошего про эту программу и как её упорно пытаются удалить.


Кратко, судя по записям в интернете, HP Analytics service (он же TouchpointAnalyticsClientService.exe, он же HP Touchpoint Analytics, он же TAInstaller.exe, и т.д.) это программа, при помощи которой HP снимает телеметрию с вашего компьютера и отправляет в HP. Основная особенность её работы в том, что она портит жизнь пользователям HP, то процессор загружает, то, вот, MSDTC ломает.


Резюмируем


Присутствует проблема с работой MSDTC.


Симптомы:


  • У вас компьютер HP.
  • У вас упорно возникает ошибка "System.Data.SqlClient.SqlException (0x80131904): MSDTC on server 'имя-сервера' is unavailable."
  • Также вы получаетет ошибку "8004E00F when trying to access COM+ Applications in Component Services" при работе со Службой компанентов, (см.).
  • Наличие работающего сервиса HP Analytics service.

Быстрое решение:


  1. Запускаем утилиту Кофигурация системы:
  2. В службах отключаем HP Analytics service:
  3. Перегружаем компьютер.

+20
15,3k 20
Комментарии 35

Рекомендуем