Подписанные сборки препятствуют запуску моего сервиса

Когда я подписываю сборки в своей службе с помощью Verisign signtool.exe, он не запускается при запуске машины на машине под управлением Windows 2003 Server. В журнале событий два события:

«Тайм-аут (30000 миллисекунд) ожидания подключения службы xxx Service». и «Не удалось запустить службу службы xxx из-за следующей ошибки: служба не ответила на запрос запуска или управления своевременно».

Он запускается нормально, когда машина работает. В XP и Vista запускается нормально. Он запускается нормально, когда сборки не подписаны.


person Wonko    schedule 16.02.2009    source источник


Ответы (3)


Эта проблема очень распространена для подписанных исполняемых файлов службы .NET: служба не запустится во время загрузки, но будет нормально работать при последующем запуске вручную. Не имеет значения, используется ли ServiceBase.RequestAdditionalTime: фактически пользовательский код вообще не выполняется до истечения времени ожидания запроса на запуск службы. Этот эффект еще более заметен на машинах без подключения к Интернету: в этом случае даже запуск службы вручную из SCM не удастся.

Чтобы решить эту проблему, отключите проверку подписи Authenticode во время загрузки, чтобы создать Свидетельство издателя, добавив в файл .exe.config следующие элементы:

<configuration>
    <runtime>
        <generatePublisherEvidence enabled="false"/>
    </runtime>
</configuration>

Свидетельство издателя — это малоиспользуемая функция Code Access Security (CAS): только если ваша служба полагается на PublisherMembershipCondition, ее отключение вызовет проблемы. Во всех других случаях это устранит постоянные или периодические сбои при запуске, поскольку больше не требует от среды выполнения дорогостоящих проверок сертификатов (включая поиск по списку отзыва).

Редактирование, июль 2010 г. Для приложений, использующих версию 4.0 .NET Framework, этот обходной путь больше не требуется.

person mdb    schedule 11.03.2010
comment
Как анекдот, мне пришлось сделать это для приложения .NET 4.7.2. - person Tim Cooper; 24.05.2019

Подписание Authenticode ваших сборок может очень негативно сказаться на холодном запуске. Подробнее см. в этой статье базы знаний.

http://support.microsoft.com/default.aspx/kb/936707

person Two Bit Gangster    schedule 16.02.2009
comment
Хотя установка патча, где MS говорит, что он не тестировался, звучит не очень привлекательно в производственной системе... - person Dirk Vollmar; 17.02.2009

Как сказал Spacedog, Authenticode может плохо повлиять на время запуска. Тогда вопрос, что вы подписываете? Должно быть достаточно, чтобы Authenticode подписывал только исполняемый файл службы, который, в свою очередь, должен ссылаться только на сборки со строгим именем. Таким образом, накладные расходы на проверку подписи Authenticode.

Вы можете установить свои сборки в GAC — если это возможно — это немного повысит производительность при запуске, поскольку проверка строгого имени будет пропущена (см. Authenticode и сборки) и/или вы также можете сгенерировать свои сборки, если время запуска по-прежнему является проблемой.

Из ответа Ромуло А. Чеккона на тайм-аут запуска службы Windows :

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

В дополнение к SetServiceStatus вы также можете попытаться сообщить диспетчеру управления службами (SCM), что службе требуется дополнительное время для запуска, вызвав ServiceBase.RequestAdditionalTime.

person Dirk Vollmar    schedule 16.02.2009
comment
Этот ответ, кажется, объединяет подписи Authenticode с подписями строгого имени? - person Dave; 17.02.2009
comment
(продолжение) При использовании Authenticode достаточно, чтобы сборки, на которые ссылаются, были подписаны строгим именем. Я пытался найти ссылку, к сожалению, я нашел только это сообщение: social.msdn.microsoft.com/Forums/en-US/winformssetup/thread/ - person Dirk Vollmar; 17.02.2009