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

86

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

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

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

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

Парень
источник
Имеет ли пользователь, запускающий службу, правильные разрешения для файла?
CSharpAtl

Ответы:

80

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

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

Для получения дополнительной информации см. Service Control Manager на MSDN .

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

Джефф
источник
1
svchost.exe - это служебный узел для большинства внутренних служб Windows. Службы могут, и в случае служб, отличных от Windows, скорее всего, работают на другом исполняемом узле.
Майкл
1
Спасибо, размещение файла заставляет его работать, поэтому я могу подтвердить это местоположение: c: \ windows \ system32
парень,
1
@Guy - я пытался исследовать это. Я не могу найти «вескую» причину, хотя подозреваю, что это потому, что это каталог, из которого запускается SCM (Service Control Manager), и поэтому он передается дочернему процессу (службе) из среды родительского процесса.
Харпер Шелби
Службы запускаются диспетчером управления службами (services.exe), который также находится в% WINDIR% \ system32. См. En.wikipedia.org/wiki/Service_Control_Manager
Дирк Воллмар,
2
Для меня (в 64-битной Windows 7) это %WinDir%\SysWOW64вместо этого
Strigoides
97
System.Diagnostics.Trace.WriteLine(Directory.GetCurrentDirectory());

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

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

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

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
Дирк Фольмар
источник
16

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

string cwd = Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);
Directory.SetCurrentDirectory(cwd ?? ".");
янтак
источник
1
+1, это позволяет остальной части приложения работать, как если бы это был обычно вызываемый .exe, где текущий каталог является его путем. Спасибо, это именно то, что мне было нужно! Избегает необходимости переписывать код, использующий относительные пути.
Пол
3

Хотел также знать, в какой папке запущена служба 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
Рига
источник
Это путь, по которому находится двоичный файл службы, который не обязательно должен совпадать с «текущим рабочим» каталогом службы, который может изменяться несколько раз во время безотказной работы процесса (службы). Относительные имена файлов (как в примере OPs) разрешаются относительно текущего рабочего каталога, а не каталога, в котором находится исполняемый двоичный файл.
Christian.K
sc qc apache2.4отображается ...BINARY_PATH_NAME : "E:\root\Public Cache\Apache Httpd\httpd-2.4.20-x86-vc11\Apache24\bin\httpd.exe" -k runservice, но вместо этого %WinDir%\System32
отображается