Wix - запуск ServiceControl занимает четыре минуты до сбоя, должен быть 30 секунд - PullRequest
0 голосов
/ 15 мая 2018

Мой сервис автоматически запускается во время установки ...

<ServiceControl Id="StartService" Start="install" Stop="both" Remove="uninstall" Name="HeskaGateway" Wait="yes" />

И все работает нормально, если я предоставляю сервису правильную строку подключения. Если я предоставляю неверную строку подключения, служба запускается и останавливается очень быстро ... Я вижу это, когда захожу в Службы и запускаю вручную. В соответствии с документацией MSI ServiceControl Table значение Wait «yes» превращается в 1, что означает, что оно должно подождать 30 секунд, а затем завершиться с ошибкой. Это займет 4 минуты и 7 секунд. Почему так долго?

MSI (s) (6C:78) [16:36:41:932]: Executing op: ServiceControl(,Name=HeskaGateway,Action=1,Wait=1,)
StartServices: Service: Heska Gateway
MSI (s) (6C:78) [16:40:48:862]: Note: 1: 2205 2:  3: Error 
MSI (s) (6C:78) [16:40:48:862]: Note: 1: 2228 2:  3: Error 4: SELECT `Message` FROM `Error` WHERE `Error` = 1920 
Error 1920. Service 'Heska Gateway' (HeskaGateway) failed to start.  Verify that you have sufficient privileges to start system services.

РЕДАКТИРОВАТЬ: Мне так и не удалось выяснить, в чем заключалась моя настоящая проблема. У меня также была ошибка последовательности установки, потому что мой CustomAction (отложенный), который будет редактировать строку подключения в файле JSON, вызывал ПОСЛЕ ServiceStart. Попытка переместить ServiceStart после этого отложенного пользовательского действия была ужасной. Поэтому я прервал запуск из записи ServiceControl, а затем добавил другое настраиваемое действие, которое беззвучно запускало «SC.EXE start HeskaGateway». Я документирую это ниже как решение.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Сам сервис может что-то делать.Протокол управления службой включает в себя состояние службы, которое возвращается самой службой, и это сообщает Windows, что происходит.Один из пунктов там - подсказка ожидания.Ничего не зная о сервисе, возможно, сервис знает, что у него может быть медленный запуск, и сообщает Windows (с подсказкой ожидания), что он должен ждать дольше.30 секунд действительно значение по умолчанию, а не фиксированное значение.Это сообщение относится к подсказке ожидания для службы управляемого кода:

Как выбрать значение для serviceStatus.dwWaitHint?

Вы не показывали ServiceControl, используемый для установкисервис, но если он используется совместно с другим сервисом в том же процессе, вещи могут усложниться, потому что сам процесс не может завершиться, пока он также размещает другой сервис.

0 голосов
/ 18 мая 2018

Установщик имеет пользовательский интерфейс, который просит пользователя скопировать и вставить строку подключения, данную ему из отдела поддержки.Установщик редактирует файл JSON в папке приложения, используя отложенное действие CustomAction.Это отложено, потому что это должно было быть после того, как файлы записаны на диск, и это также должно было иметь повышенные разрешения.Все это прекрасно работало, пока я не решил, чтобы служба запускалась сама по себе в конце установки.Моей первой попыткой было использование

<ServiceControl Id="StartService" Start="install" ...>

Но это заняло 4 минуты, чтобы потерпеть неудачу.Устранение неполадок показало, что служба запускается ПЕРЕД пользовательским действием, которое записывает строку подключения в файл JSON.Мне нужно было отложить запуск сервиса до окончания действия.Я смотрел на добавление второй записи ServiceControl в свой собственный компонент, который можно было запланировать намного позже, но это дало мне неприятное ощущение, что я собираюсь прервать деинсталляцию и восстановить установки.Итак, я только что добавил другое отложенное настраиваемое действие, упорядоченное сразу после редактирования файла JSON.Это новое действие выполняет «SC.EXE start MyServiceName».SC.EXE - это неблокирующий способ запуска служб, поэтому успешно или неудачно он завершится быстро.

Мое окончательное решение:

 <Component Id="MyCloudSync.exe" Guid="{generate-your-own-guid}">
    <File Id="MyCloudSync.exe.file" KeyPath="yes" Source="$(var.RELEASEBINARIES)\MyCloudSync.exe" />
    <ServiceInstall Id="MyCloudSync.exe"
          Type="ownProcess"
          Name="MyGateway"
          DisplayName="My Gateway"
          Description="Synchronizes laboratory data with Cloud"
          Start="auto"
          ErrorControl="normal" />
    <!--Start is performed by a customer action that calls SC.EXE so it can be delayed after the custom action that writes the JSON file -->
    <ServiceControl Id="StartService" Stop="both" Remove="uninstall" Name="MyGateway" Wait="yes" /> 
  </Component>

Следует отметить, что приведенная выше запись ServiceControl делаетне иметь "start =" DLL, которую вызывают GetConnectionString и SetConnectionString, является моей собственной разработкой.Wix имеет свое собственное настраиваемое действие для тихого запуска командной строки ... WixQuietExec

 <CustomAction Id= "GetConnectionString"
                  BinaryKey="MyCustomActions"
                  DllEntry="GetConnectionString"
                  Execute="immediate"/>
    <CustomAction Id= "SetConnectionString"
                  BinaryKey="MyCustomActions"
                  Impersonate="no"
                  DllEntry="SetConnectionString"
                  Execute="deferred"/>
    <CustomAction Id="SetConnectionStringDeferredParams"
                  Property="SetConnectionString"
                  Value="&quot;[INSTALLFOLDER]&quot;&quot;[CONNECTIONSTRING]&quot;" />
    <Property Id="QtExecStartService" Value="&quot;SC.EXE&quot; start MyGateway"/>
    <CustomAction Id="QtExecStartService" 
                  BinaryKey="WixCA" 
                  DllEntry="WixQuietExec" 
                  Impersonate="no"
                  Execute="deferred" 
                  Return="ignore"/>

Запуск службы - это просто удобство, поэтому установщик может запретить переход к Services.msc для выполненияначало или требуется перезагрузка.Поэтому я использовал Return = "ignore".Кроме того, SC.EXE просто переводит службу в «Ожидание запуска», поэтому он, вероятно, не сможет вернуть большую часть ошибки, если ваша служба не существует.

ПРИМЕЧАНИЕ: WixQuietExec задокументирован здесь .Обязательно укажите в EXE-файле и присвойте свойству тот же идентификатор, что и CustomAction, который использует WixQuietExec.Эта информация находится в разделе «Отложенное выполнение», но я все равно ошибся при первой попытке.

0 голосов
/ 15 мая 2018

Ошибка 1920 : эта ошибка может указывать на отсутствие привилегии (logon as a service) или права доступа, или, возможно, какого-либо рода помехи от внешней причины или, возможно, пакет MSI , который не работает с повышенными правами (маловероятно, я думаю, тогда вы можете записывать только в пути для каждого пользователя).

  • Вы используете эту службу с учетной записью LocalSystem или NetworkService или LocalService или с regular user account?( о вышеуказанных учетных записях ).
  • Или более новые концепции управляемых учетных записей служб , групповые учетные записи управляемых служб или виртуальные учетные записи пошаговая информация (понятия, которые яне знаю достаточно о).
  • Если вы используете учетную запись обычного пользователя, имеет ли она привилегию " вход в систему как сервис "?
    • Если вы создаете пользователя в своем MSI WiX (или определяете его), вы можете установить LogonAsService="yes" для User (элемента), о котором идет речь.Я считаю, что это добавляет привилегию для учетной записи ( SeServiceLogonRight ).
    • Привилегия отличается от прав доступа (ACL) - для записи: привилегия - это повсеместный общесистемный доступ ккакая-то функция / функция - например, изменение системного времени, запуск / остановка служб, вход в систему как служба и т. д. ( см. раздел 13 здесь для получения дополнительной информации ).
  • Есть ли на вашем тестовом компьютере программное обеспечение безопасности / антивирус ?Это может мешать вызовам API вашей установки.Если это так, попробуйте отключить его (если это возможно) во время процесса установки.Я упомяну брандмауэры тоже.
  • Ваш MSI настроен на работу повышен ?( Элемент пакета => InstallPrivileges).
  • ОБНОВЛЕНИЕ : просто добавив проблему, оказалось: обновление пользовательских настроек данных конфигурациинеобходим для работы с повышенными правами или неверные данные конфигурации службы , что, в свою очередь, вызвало общее сообщение об ошибке 1920 года.В этом случае конфигурация была в формате JSON, очевидно, она может быть в нескольких форматах: XML, registry, INI и т. Д. Подробнее см. В комментариях к OP.

Тайм-аут : относительно длительного тайм-аута.Я видел это иногда с защитным программным обеспечением (блокирует всю настройку, так что время ожидания службы запускается только после некоторой задержки сканирования), или с настройками, которые инициируют создание точки восстановления системы дос самого начала установки (это одна из возможных причин, почему некоторые установки MSI внезапно занимают много времени, когда они обычно завершаются быстро - возможно предотвратить создание этой точки восстановления - MSIFASTINSTALL ).Также, возможно, проверьте этот ответ на serverfault и значение реестра, описанное, чтобы узнать, существует ли в вашей политике политика изменения времени ожидания запуска службы по умолчанию : Как увеличить время ожидания запуска службы Windows (ServicesPipeTimeout).Честно говоря, я не уверен, использует ли MSI свое время ожидания или системное время по умолчанию - может, кто-то может подсвечивать?Можно также предположить, что инициированное вами соединение с базой данных имеет свое время ожидания?(не соответствует вашему опыту интерактивного тестирования?) Может быть, вы можете проверить свой код и ваш звонок и сообщить нам? Ваш сервис зависит от другого сервиса ?(см. ссылку на Symantec ниже).Любые зависимости от файлов, установленных на GAC или WinSxS , как упомянуто Крисом в первой ссылке ниже?

Много предположений.Будем надеяться, что это поможет или вдохновит другие идеи, которые решают проблему.Ниже приведены некоторые ссылки для безопасного хранения (попытка написать общий ответ, который также может помочь другим с такими же или похожими проблемами - что делает ответ слишком длинным, извините за это).


Ссылки :

...