В якому каталозі працює служба Windows?


83

Я створив дуже просту службу .NET Windows і встановив її за допомогою утиліти InstallUtil.exe.

У сервісі я маю шматок коду як такий:

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

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


Чи має користувач, який запускає службу, правильні дозволи на файл?
CSharpAtl

Відповіді:


78

Послуги запускаються з програми, яка називається Service Control Manager. Ця програма живе в системному каталозі % WinDir% \ System32

У Windows 7 Ultimate - 64 біти цей шлях насправді: % WinDir% \ SysWOW64

Для отримання додаткової інформації див. Диспетчер керування послугами на MSDN .

Дякую Харпер Шелбі за те, що вказав на проблему з початковим повідомленням.


1
svchost.exe є хостом служби для більшості внутрішніх служб Windows. Служби можуть, а у випадку служб, які не є Windows, швидше за все, працювати на іншому хості exe.
Майкл

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замість цього
Стрігоїдс

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

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

Цей простий прийом буде корисний при багатьох проблемах у розробці сервісу, особливо для налагодження запуску служби.

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

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

15

Ви можете змусити це працювати так:

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

Це шлях, де знаходиться бінарний файл служби, який не гарантовано дорівнює "поточному робочому" каталогу служби, який може змінюватися кілька разів під час безвідмовної роботи (сервісного) процесу. Відносні імена файлів (як у прикладі OP) вирішуються щодо поточного робочого каталогу, а не до каталогу, де знаходиться виконуваний двійковий файл.
Крістіан.

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
Pacerier
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.