Dịch vụ Windows chạy trong thư mục nào?


83

Tôi đã tạo một Dịch vụ Windows .NET rất đơn giản và cài đặt nó bằng tiện ích InstallUtil.exe.

Trong dịch vụ, tôi có một đoạn mã như sau:

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

Tôi đã tạo một tệp có tên test_file.txt trong cùng thư mục với dịch vụ nhưng phần được nhận xét của mã không bao giờ được thực thi ...?


Người dùng chạy dịch vụ có quyền chính xác đối với tệp không?
CSharpAtl

Câu trả lời:


78

Các dịch vụ được bắt đầu từ một ứng dụng có tên là Service Control Manager. Ứng dụng này nằm trong thư mục hệ thống % WinDir% \ System32

Trên Windows 7 Ultimate - 64 bit, đường dẫn này thực sự là: % WinDir% \ SysWOW64

Để biết thêm thông tin, hãy xem Trình quản lý kiểm soát dịch vụ tại MSDN .

Cảm ơn Harper Shelby đã chỉ ra vấn đề với bài viết gốc.


1
svchost.exe là một máy chủ dịch vụ cho hầu hết các dịch vụ windows nội bộ. Các dịch vụ có thể, và trong trường hợp các dịch vụ không phải của Windows, rất có thể chạy trên một máy chủ exe khác.
Michael

1
Cảm ơn - thả tệp vào đó làm cho nó hoạt động để tôi có thể xác nhận vị trí đó: c: \ windows \ system32
Guy

1
@Guy - Tôi đang cố gắng nghiên cứu điều đó. Tôi không thể tìm thấy lý do 'chính đáng', mặc dù tôi nghi ngờ đó là vì đó là thư mục mà SCM (Trình quản lý kiểm soát dịch vụ) chạy từ đó và vì vậy nó được chuyển cho quy trình con (dịch vụ) từ môi trường của quy trình mẹ.
Harper Shelby

Dịch vụ được khởi động bởi Trình quản lý kiểm soát dịch vụ (services.exe) cũng nằm trong% WINDIR% \ system32. Xem en.wikipedia.org/wiki/Service_Control_Manager
Dirk Vollmar

2
Đối với tôi (trên Windows 7 64-bit) thì %WinDir%\SysWOW64thay vào đó
Strigoides

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

sẽ xuất ra thư mục hiện tại. Đặt mã đó vào phương thức khởi động của dịch vụ của bạn và sử dụng một công cụ như DebugView để kiểm tra kết quả đầu ra. Sau đó, bạn sẽ biết thư mục khởi động của dịch vụ của bạn.

Kỹ thuật đơn giản này sẽ hữu ích với nhiều vấn đề trong phát triển dịch vụ, đặc biệt là để gỡ lỗi khởi động dịch vụ.

Bạn có thể mong đợi thư mục làm việc của dịch vụ của bạn là thư mục chứa tệp thực thi dịch vụ (tôi cũng vậy). Bạn có thể thay đổi thư mục đó bằng các dòng mã sau:

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

14

Bạn có thể làm cho nó hoạt động như vậy:

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

1
+1, điều này cho phép phần còn lại của ứng dụng hoạt động như thể nó là một .exe thường được gọi trong đó thư mục hiện tại là đường dẫn của nó. Cảm ơn, đây chính xác là những gì tôi cần! Tránh được việc phải viết lại mã đã sử dụng các đường dẫn tương đối.
Paul

3

Cũng muốn biết dịch vụ Windows đang chạy trong thư mục nào nhưng mã nguồn không phải của tôi nên không thể sửa đổi nó. Nhập trong Command Prompt sc qc <service name>sẽ hiển thị thư mục trong BINARY_PATH_NAME.

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

khi truy vấn MyService nhận được:

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

Đó là đường dẫn chứa tệp nhị phân của dịch vụ, không được đảm bảo bằng với thư mục "làm việc hiện tại" của dịch vụ có thể thay đổi nhiều lần trong thời gian hoạt động của quy trình (dịch vụ). Các tên tệp tương đối (như trong ví dụ OP) được giải quyết dựa trên thư mục làm việc hiện tại, không phải thư mục chứa tệp nhị phân thực thi.
Christian.K

sc qc apache2.4hiển thị ...BINARY_PATH_NAME : "E:\root\Public Cache\Apache Httpd\httpd-2.4.20-x86-vc11\Apache24\bin\httpd.exe" -k runservice, nhưng thay vào đó là thư mục làm việc%WinDir%\System32
Pacerier
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.