0

У меня есть приложение для Windows, которое использует библиотеку TopShelf, и я устанавливаю его в AWS во время cfn-init, используя удобные функции командной строки, которые вы получаете с помощью topshelf.Topshelf, NLog and File Permissions

C:\handy_service\> HandyService.exe install start 

Это в основном устанавливает службу в реестре, а затем вызывает sc start, но это очень полезно, потому что он проверяет имя службы соответствует тому, что вы ожидаете, и это позволяет настроить пользователю, что услуга будет работать, как с помощью хорошо свободный API.

Код установщика также записывает некоторые журналы диагностики в NLog, если служба настроена на использование NLog в целом.

Проблема заключается в следующем: программа установки запускается как учетная запись локального администратора по умолчанию, с которой начинается AMI, и файл NLog создается этим пользователем. Когда служба запускается как пользователь сетевой службы, у нее нет разрешения на запись в файл журнала NLog.

Как я могу получить свою службу для записи в файл журнала? Я думал о настройке разрешений программным образом, но он выглядит отвратительным, и мне нужно определить имя файла журнала, поскольку оно генерируется динамически на основе идентификатора экземпляра ec2. Кроме того, не совсем очевидно, в какой момент создается файл журнала. Самый простой хак, с которым я мог бы работать, состоит из двух файлов NLog.configs и переключения одного из них в конце установки после того, как логгер сброшен. Но из-за некоторого перекрытия времени между запуском службы и выходом установщика, я ожидаю, что я потеряю несколько строк регистрации.

Любые чистые предложения были бы очень признательны!

+1

Чтобы быть ясным, проблема заключается в том, что команда установки создает экземпляр файла журнала как вы. Затем служба запускается и не имеет доступа к файлу? Если это так, самым простым «взломом» может быть удаление журнала между установкой и запуском службы. Используйте «net start service» вместо «Topshelf». – Travis

+0

Правильно, команда install/start эффективно запускает приложение в качестве консольного приложения в контексте текущего (Администратор) пользователя, и поэтому любые созданные файлы принадлежат этому пользователю. Когда служба затем правильно запускается в качестве пользователя сетевой службы, файл журнала уже существует и не может писать на него. –

+0

Да. Для этой проблемы я не думаю, что у меня есть решение. Или измените пользователя, с которым он работает, измените разрешения (ugh) или удалите журнал, чтобы это не было проблемой. Вы можете не запускать nlog до тех пор, пока не запустится сервис, поэтому «установить старт» также не задержит вас. – Travis

ответ

0

В конце концов я пошел с установкой разрешений в папке журналов во время развертывания. Это на самом деле довольно просто с icacls, только парой строк в реках, например, если вы знаете, где ваша папка журналов будет:

sh %{icacls "#{logs_dir}" /grant "#{username}":(OI)(W)} 

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