Secara default, layanan Windows dimulai pada direktori sytem32 (biasanya C:\WINDOWS\system32
).
Apakah ada cara untuk mengatur direktori kerja yang berbeda? Saya sedang memikirkan beberapa parameter registri di bawah ini HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService
.
Jadi - dapatkah ini dilakukan?
windows
configuration
service
directory
Tomalak
sumber
sumber
Jawaban:
Anda bisa menggunakan injeksi DLL untuk memanggil
SetCurrentDirectory
setelah proses sudah diluncurkan. Ini akan mengharuskan Anda untuk membangun aplikasi injektor, ditambah DLL untuk menyuntikkan. Ada beberapa tutorial; mungkin dua yang terbaik yang saya temukan adalah:Anda membutuhkan latar belakang pemrograman C ++ yang layak (dan lingkungan kerja yang baik) untuk bisa melaluinya.
Namun, ini mengasumsikan bahwa layanan sedang melihat direktori saat ini. Kemungkinan lain adalah menggunakan
%path%
. Anda mengatakan bahwa itu "dimulai padasystem32
, mencoba beberapa lokasi lagi, dan akhirnya direktori sendiri", jadi ini sepertinya lebih mungkin bagi saya.Bandingkan direktori yang Anda lihat
procmon
dengan%path%
. Jika sama, pertimbangkan untuk memodifikasiSYSTEM %path%
atau%path%
pengguna yang menjalankan layanan, sehingga direktori yang Anda inginkan untuk dicari adalah yang pertama.Saya percaya Fred benar, namun - Anda tidak mungkin melihat manfaat kinerja yang signifikan dengan melakukan semua ini, kecuali itu terjadi sangat sering. Operasi buka file sederhana tidak terlalu mahal, terutama jika itu adalah jalur lokal dan file tersebut sebenarnya tidak ada.
sumber
%PATH%
untuk akun pengguna yang dijalankan oleh layanan adalah ide yang baik.Seperti MattB, saya tidak tahu cara untuk mengubah direktori kerja layanan tanpa akses ke kode sumber. Untuk skenario khusus ini, ada kemungkinan bahwa pemeriksaan direktori tambahan tidak memaksakan banyak aktivitas disk yang tidak perlu relatif terhadap jumlah i / o yang diperlukan untuk operasi pengindeksan teks lengkap. Bahkan jika Anda bisa mengoptimalkannya, indeks teks lengkapnya akan menjadi disk intensif oleh sifat binatang itu.
sumber
Tambahkan nilai string "AppDirectory" ke Kunci Parameter dan setel nilai ke direktori kerja yang Anda inginkan.
sumber
srvany
. Tidak yakin tentang layanan normal.Lakukan ini dalam fungsi utama Layanan:
GetModuleFilename
. Ini akan mengambil nama file modul (exe) termasuk path, dalam formulirC:\path\to\exe\your_service.exe
.std::string
fungsifind_last_of()
), untuk menemukan backslash terakhir. Strip / potong string dari sana untuk mendapatkan path ke modul Anda dan karena itu direktori exe Anda.SetCurrentDirectory
dan voila!sumber