Dịch vụ Windows: Tôi có thể định cấu hình thư mục làm việc hiện tại không?


11

Theo mặc định, các dịch vụ Windows bắt đầu trong thư mục sytem32 (thường C:\WINDOWS\system32).

Có cách nào để thiết lập một thư mục làm việc khác không? Tôi đang nghĩ về một số tham số đăng ký dưới đây HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService.

Vì vậy - điều này có thể được thực hiện?


3
@Tomalak: Đó có phải là dịch vụ bạn đã viết không? Bạn có thể làm điều đó thông qua mã, nhưng tôi không nghĩ có cách nào thông qua cài đặt dịch vụ.
MattB

Không, đó không phải là dịch vụ tôi đã viết. Tôi đã hy vọng một số thiết lập đăng ký ít được biết đến ở đây.
Tomalak

Mục đích của việc đó là gì?
dùng35115

@ user35115: Thành thật mà nói Nó bắt đầu tại system32, thử thêm một vài vị trí và cuối cùng là thư mục riêng của nó. Tôi hình dung khi nào nó sẽ chạy trong thư mục riêng của nó ngay lập tức, nó sẽ kiểm tra tập tin ít hơn không cần thiết. Không phải là nó sẽ không hoạt động hiện tại, nhưng nó làm tôi tự hỏi liệu có chỗ để cải thiện.
Tomalak

1
@ user35115, Để tránh phải thay đổi hàng loạt cài đặt cấu hình của một ứng dụng nhất định (giả sử Apache, v.v.), tất cả đều liên quan đến thư mục làm việc.
Pacerier

Câu trả lời:


5

Bạn có thể sử dụng tệp DLL để gọi SetCurrentDirectorysau khi quá trình đã được khởi chạy. Điều này sẽ yêu cầu bạn xây dựng một ứng dụng kim phun, cộng với DLL để tiêm. Một số hướng dẫn tồn tại; có lẽ hai cái tốt nhất tôi tìm thấy là:

Bạn sẽ cần một lượng lớn nền tảng lập trình C ++ (và môi trường xây dựng hoạt động) để vượt qua điều đó.

Tuy nhiên, điều này giả định rằng dịch vụ đang xem thư mục hiện tại. Một khả năng khác là nó đang sử dụng %path%. Bạn nói rằng nó "bắt đầu tại system32, thử thêm một vài vị trí, và cuối cùng là thư mục riêng của nó", vì vậy điều này có vẻ nhiều khả năng đối với tôi.

So sánh các thư mục bạn nhìn thấy procmonvới của bạn %path%. Nếu chúng giống nhau, hãy xem xét sửa đổi SYSTEM %path%hoặc %path%của người dùng đang chạy dịch vụ, để thư mục bạn muốn tìm kiếm trước tiên.

Tuy nhiên, tôi tin rằng Fred đã đúng - bạn khó có thể thấy bất kỳ lợi ích hiệu suất đáng kể nào bằng cách thực hiện bất kỳ điều nào trong số này, trừ khi điều đó xảy ra rất thường xuyên. Các thao tác mở tệp đơn giản không đặc biệt tốn kém, đặc biệt nếu đó là đường dẫn cục bộ và tệp không thực sự tồn tại.


Biến môi trường PATH hệ thống là điều đầu tiên tôi nghĩ đến. Tuy nhiên, việc chèn đường dẫn của dịch vụ khi bắt đầu biến PATH sẽ có tác động tiêu cực đến hiệu suất của mọi ứng dụng khác vì vậy tôi không khuyên điều đó.
Marnix van Valen

Tôi không có số liệu cứng để sao lưu điều này, nhưng trực giác của tôi cho tôi biết rằng sẽ không có sự mất hoặc giảm hiệu suất thực tế nào xảy ra từ việc sửa đổi đường dẫn. Đây là một kịch bản khá phổ biến; Không ai đổ lỗi, giả sử, Công cụ hỗ trợ của Windows hoặc SQL Server, đã tác động tiêu cực đến hiệu năng hệ thống khi nó sửa đổi đường dẫn trong khi cài đặt. Đây không phải là lần đầu tiên tôi thấy ai đó nhìn vào procmon và đi "omg, nhìn vào tất cả những lần truy cập tệp đó!", Không nhận ra rằng đó là điển hình cho hầu hết các ứng dụng.
phân hạch

+1 cho sự sáng tạo. :-) Tôi hoàn toàn hiểu rằng các thao tác tệp này không ảnh hưởng đến hiệu suất, vì vậy tôi sẽ không thực sự bận tâm đến việc viết một giải pháp tiêm DLL. %PATH%Mặc dù vậy, sửa đổi tài khoản người dùng mà dịch vụ chạy theo là một ý tưởng hay.
Tomalak

1
Tạo một người dùng đặc biệt để chỉ chạy dịch vụ này và sửa đổi% PATH% cho người dùng này nghe có vẻ là một cách rất tốt. +1
Nắng

@fission: Vâng, điều đó có nghĩa là tôi chấp nhận câu trả lời của bạn. ;) Đó không phải là những gì tôi đã hy vọng, nhưng nó gần như nó được, tôi đoán vậy.
Tomalak

1

Giống như MattB, tôi không biết cách nào để thay đổi thư mục làm việc của dịch vụ với quyền truy cập vào mã nguồn. Đối với kịch bản cụ thể này, có thể các kiểm tra thư mục bổ sung không áp đặt nhiều hoạt động đĩa không cần thiết liên quan đến lượng i / o cần thiết cho hoạt động lập chỉ mục toàn văn bản. Ngay cả khi bạn có thể tối ưu hóa chúng đi, chỉ mục toàn văn bản sẽ bị đĩa tăng cường bởi bản chất của con thú.


1

Thêm một giá trị chuỗi "AppDirectory" vào Khóa tham số và đặt giá trị vào thư mục làm việc mong muốn của bạn.


Hừm. Chỉ được thử nghiệm, dường như không hoạt động (Trên Windows 7, đã sử dụng loại dữ liệu REG_EXPAND_SZ). Bạn có thể xác nhận lại điều này thực sự hiệu quả với bạn không?
Tomalak

Điều này hoạt động khi sử dụng srvany. Không chắc chắn về các dịch vụ bình thường.
Konstantin Spirin

1

Làm điều này trong chức năng chính của Dịch vụ:

  • Gọi cho GetModuleFilename. Nó sẽ lấy tên tệp mô-đun (exe) bao gồm cả đường dẫn, trong biểu mẫu C:\path\to\exe\your_service.exe.
  • Sử dụng các thao tác chuỗi (có thể sử dụng std::stringhàm find_last_of()), để tìm dấu gạch chéo ngược cuối cùng. Tách / cắt chuỗi từ đó để có được đường dẫn đến mô-đun của bạn và do đó thư mục của exe của bạn.
  • Gọi cho chức năng SetCurrentDirectoryvà thì đấy!

1
đừng quên truyền null cho tham số HMODULE trong lệnh gọi hàm GetModuleFilename :)
uprightech
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.