Layanan Windows: Dapatkah saya mengkonfigurasi direktori kerja saat ini?

11

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?

Tomalak
sumber
3
@ Tomalak: Apakah ini layanan yang Anda tulis? Anda dapat melakukannya melalui kode, tetapi saya tidak berpikir ada cara melalui pengaturan layanan.
MattB
Tidak, ini bukan layanan yang saya tulis. Saya berharap pengaturan registri sedikit diketahui di sini.
Tomalak
Apa tujuan melakukannya?
user35115
@ user35115: Ya, sejujurnya ... Saat melacak masalah yang tidak terkait dengan procmon, saya perhatikan bahwa layanan I / O-heavy (pengindeks teks lengkap) secara konsisten memeriksa file-file sendiri di lokasi yang salah (cukup bodoh). Itu dimulai pada system32, mencoba beberapa lokasi lagi, dan akhirnya direktori sendiri. Saya pikir ketika itu akan berjalan di direktori sendiri segera, itu akan melakukan pemeriksaan file yang tidak perlu. Bukannya itu tidak akan berfungsi saat ini, namun itu membuat saya bertanya-tanya apakah ada ruang untuk perbaikan.
Tomalak
1
@ user35115, Untuk menghindari keharusan mengubah pengaturan konfigurasi aplikasi tertentu (mis. Apache, dll), yang semuanya relatif terhadap direktori kerja.
Pacerier

Jawaban:

5

Anda bisa menggunakan injeksi DLL untuk memanggil SetCurrentDirectorysetelah 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 pada system32, mencoba beberapa lokasi lagi, dan akhirnya direktori sendiri", jadi ini sepertinya lebih mungkin bagi saya.

Bandingkan direktori yang Anda lihat procmondengan %path%. Jika sama, pertimbangkan untuk memodifikasi SYSTEM %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.

pembelahan
sumber
Variabel lingkungan sistem PATH adalah hal pertama yang terlintas dalam pikiran saya. Memasukkan jalur layanan di awal variabel PATH akan memiliki efek negatif pada kinerja hampir setiap aplikasi lain jadi saya tidak akan menyarankan itu.
Marnix van Valen
Saya tidak memiliki angka yang sulit untuk mendukung hal ini, tetapi intuisi saya memberi tahu saya bahwa tidak ada keuntungan atau kerugian kinerja praktis yang akan muncul dari memodifikasi jalan. Ini adalah skenario yang cukup umum; tidak ada yang menyalahkan, katakanlah, Alat Dukungan Windows, atau SQL Server, karena berdampak negatif terhadap kinerja sistem ketika memodifikasi jalur selama instalasi. Ini bukan pertama kalinya saya melihat seseorang melihat procmon dan pergi "omg, lihat semua akses file itu!", Tidak menyadari bahwa itu khas untuk sebagian besar aplikasi.
fisi
+1 untuk kreativitas. :-) Saya sepenuhnya memahami bahwa operasi file ini tidak mempengaruhi kinerja secara terukur, jadi saya tidak akan repot-repot menulis solusi injeksi DLL. Memodifikasi %PATH%untuk akun pengguna yang dijalankan oleh layanan adalah ide yang baik.
Tomalak
1
Membuat pengguna khusus untuk menjalankan layanan ini saja dan memodifikasi% PATH% untuk pengguna ini terdengar sebagai cara yang sangat baik untuk dilakukan. +1
Cerah
@ fisi: Ya, itu berarti saya menerima jawaban Anda. ;) Bukan itu yang saya harapkan, tapi sedekat mungkin, kurasa.
Tomalak
1

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.

Fred
sumber
1

Tambahkan nilai string "AppDirectory" ke Kunci Parameter dan setel nilai ke direktori kerja yang Anda inginkan.

Menandai
sumber
Hm Hanya diuji, tampaknya tidak berfungsi (Pada Windows 7, digunakan tipe data REG_EXPAND_SZ). Bisakah Anda mengkonfirmasi kembali bahwa ini benar-benar berfungsi untuk Anda?
Tomalak
Ini berfungsi saat menggunakan srvany. Tidak yakin tentang layanan normal.
Konstantin Spirin
1

Lakukan ini dalam fungsi utama Layanan:

  • Telepon ke GetModuleFilename. Ini akan mengambil nama file modul (exe) termasuk path, dalam formulir C:\path\to\exe\your_service.exe.
  • Gunakan manipulasi string (mungkin menggunakan std::stringfungsi find_last_of()), untuk menemukan backslash terakhir. Strip / potong string dari sana untuk mendapatkan path ke modul Anda dan karena itu direktori exe Anda.
  • Lakukan panggilan ke fungsi SetCurrentDirectorydan voila!
uprightech
sumber
1
jangan lupa untuk memberikan nol ke parameter HMODULE dalam panggilan fungsi GetModuleFilename :)
uprightech