В каком каталоге работает служба Windows?

Я создал очень простой.NET Windows Service и установил его с помощью утилиты InstallUtil.exe.

В сервисе у меня есть кусок кода как таковой:

if (File.Exists("test_file.txt"))
{
   // Do something clever
}

Я создал файл с именем test_file.txt в том же каталоге, что и служба, но закомментированная часть кода никогда не выполняется...?

4 ответа

Решение

Службы запускаются из приложения под названием Service Control Manager. Это приложение живет в системном каталоге %WinDir%\System32

На Windows 7 Ultimate - 64 бита этот путь на самом деле: % WinDir% \ SysWOW64

Для получения дополнительной информации см. Диспетчер управления службами в MSDN.

Спасибо Харперу Шелби за указание на проблему с оригинальным постом.

System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory());

выведет текущий каталог. Поместите этот код в метод запуска вашей службы и используйте инструмент, такой как DebugView, чтобы проверить вывод. Тогда вы будете знать папку запуска вашего сервиса.

Этот простой метод будет полезен при многих проблемах в разработке сервисов, особенно при отладке запуска сервиса.

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

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);

Вы можете заставить его работать так:

string cwd = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
Directory.SetCurrentDirectory(cwd ?? ".");

Хотел также узнать, в какой папке запущена служба Windows, но исходный код не был моим, поэтому не мог его изменить. Ввод в командной строке sc qc <service name> отображает папку в BINARY_PATH_NAME.

C:\>sc qc
DESCRIPTION:
        Queries the configuration information for a service.
USAGE:
        sc <server> qc [service name] <bufferSize>

когда запрос MyService получить:

C:> sc qc MyService

[SC] QueryServiceConfig SUCCESS

SERVICE_NAME: MyService
        TYPE               : 10  WIN32_OWN_PROCESS
        START_TYPE         : 3   DEMAND_START
        ERROR_CONTROL      : 1   NORMAL
        BINARY_PATH_NAME   : "D:\Routines\MyService\MyService.exe"
        LOAD_ORDER_GROUP   :
        TAG                : 0
        DISPLAY_NAME       : MyService
        DEPENDENCIES       :
        SERVICE_START_NAME : LocalSystem

Из службы запуска SC в папке / Start in:/: Простая альтернатива - использовать nssm.cc - это дает вам возможность указать каталог для запуска.

Другие вопросы по тегам