Windows सेवा: क्या मैं वर्तमान कार्यशील निर्देशिका को कॉन्फ़िगर कर सकता हूं?


11

डिफ़ॉल्ट रूप से, Windows सेवाएँ sytem32 निर्देशिका (आमतौर पर C:\WINDOWS\system32) में शुरू होती हैं ।

क्या एक अलग कार्य निर्देशिका स्थापित करने का कोई तरीका है? मैं नीचे कुछ रजिस्ट्री पैरामीटर के बारे में सोच रहा हूं HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SomeService

तो - क्या यह किया जा सकता है?


3
@Tomalak: क्या यह आपके द्वारा लिखी गई सेवा है? आप इसे कोड के माध्यम से कर सकते हैं, लेकिन मुझे नहीं लगता कि सेवा सेटिंग्स के माध्यम से कोई रास्ता है।
मैट

नहीं, यह मेरे द्वारा लिखी गई सेवा नहीं है। मैं यहाँ कुछ कम ज्ञात रजिस्ट्री सेटिंग की उम्मीद कर रहा था।
टॉमालक

इसे करने का उद्देश्य क्या है?
user35115

@ user35115: ठीक है, ईमानदार होने के लिए ... procmon के साथ एक असंबंधित समस्या पर नज़र रखने के दौरान, मैंने देखा कि एक निश्चित I / O-भारी सेवा (एक पूर्ण पाठ अनुक्रमणिका) लगातार गलत स्थानों (बहुत गूंगा) में अपनी खुद की फाइलों की जांच करती है। यह सिस्टम 32 पर शुरू होता है, कुछ और स्थानों की कोशिश करता है, और अंततः इसकी अपनी निर्देशिका है। मुझे लगा कि जब यह तुरंत अपनी निर्देशिका में चलेगा, तो यह कम अनावश्यक फ़ाइल जाँच करेगा। ऐसा नहीं है कि यह वर्तमान में काम नहीं करेगा , फिर भी यह मुझे आश्चर्यचकित करता है कि क्या सुधार के लिए जगह थी।
टॉमालक 19

1
@ user35115, एक निश्चित ऐप के बड़े पैमाने पर कॉन्फ़िगरेशन सेटिंग्स (अपाचे, आदि) से बचने के लिए, जो सभी कार्यशील निर्देशिका के सापेक्ष हैं ।
18

जवाबों:


5

SetCurrentDirectoryप्रक्रिया शुरू होने के बाद कॉल करने के लिए आप DLL इंजेक्शन का उपयोग कर सकते हैं । इसके लिए आपको एक इंजेक्टर एप्लिकेशन और प्लस डीएलएल को इंजेक्ट करना होगा। कुछ ट्यूटोरियल मौजूद हैं; शायद मैंने जो दो सबसे अच्छे पाए हैं वे हैं:

उस के माध्यम से प्राप्त करने के लिए आपको सी ++ प्रोग्रामिंग पृष्ठभूमि (और एक कामकाजी माहौल) की एक सभ्य राशि की आवश्यकता होगी।

हालाँकि, यह मानता है कि सेवा वर्तमान निर्देशिका को देख रही है। एक और संभावना है कि यह उपयोग कर रहा है %path%। आप कहते हैं कि यह "शुरू होता है system32, कुछ और स्थानों की कोशिश करता है, और अंततः इसकी अपनी निर्देशिका है", इसलिए यह मेरे लिए अधिक संभावना है।

उन निर्देशिकाओं की तुलना करें जिन्हें आप procmonअपने साथ देखते हैं %path%। यदि वे समान हैं, तो सेवा चलाने वाले उपयोगकर्ता के SYSTEM %path%या तो संशोधित करने पर विचार %path%करें, ताकि आप जिस निर्देशिका को खोजना चाहते हैं वह पहले हो।

मेरा मानना ​​है कि फ्रेड सही है, हालांकि - जब तक यह बहुत बार नहीं हो रहा है, तब तक आप इसमें से कोई भी महत्वपूर्ण प्रदर्शन लाभ देखने की संभावना नहीं है । सरल फ़ाइल खुला संचालन विशेष रूप से महंगा नहीं है, खासकर अगर यह एक स्थानीय पथ है और फ़ाइल वास्तव में मौजूद नहीं है।


सिस्टम PATH पर्यावरण चर वह पहली चीज थी जो मेरे लिए दिमाग में आई थी। PATH वैरिएबल के शुरू होने पर सेवा के पथ को सम्मिलित करना, हालांकि हर दूसरे अनुप्रयोग के बारे में सिर्फ मेरे प्रदर्शन पर नकारात्मक प्रभाव पड़ेगा इसलिए मैं यह सलाह नहीं दूंगा।
Marnix van Valen

मेरे पास इस तरह से वापस जाने के लिए कोई कठिन संख्या नहीं है, लेकिन मेरा अंतर्ज्ञान मुझे बताता है कि पथ को संशोधित करने से कोई व्यावहारिक प्रदर्शन लाभ या हानि नहीं होगी। यह एक काफी सामान्य परिदृश्य है; स्थापना के दौरान पथ को संशोधित करने पर सिस्टम के प्रदर्शन को नकारात्मक रूप से प्रभावित करने के लिए, Windows समर्थन उपकरण, या SQL सर्वर, कोई भी दोष नहीं देता है। यह पहली बार नहीं है, जब मैंने किसी को घोषणा करते हुए देखा है और "omg, उन सभी फ़ाइल एक्सेसों को देखो!", यह महसूस करते हुए कि यह अधिकांश अनुप्रयोगों के लिए विशिष्ट नहीं है।
विखंडन

रचनात्मकता के लिए +1। :-) मैं पूरी तरह से समझता हूं कि ये फ़ाइल संचालन औसत रूप से प्रदर्शन को प्रभावित नहीं करते हैं, इसलिए मैं वास्तव में DLL इंजेक्शन समाधान लिखने में परेशान नहीं होने वाला हूं। %PATH%हालाँकि, उपयोगकर्ता खाते के लिए संशोधित सेवा के तहत एक अच्छा विचार है।
तोलक

1
केवल इस सेवा को चलाने के लिए एक विशेष उपयोगकर्ता बनाना और इस उपयोगकर्ता के लिए% PATH% को संशोधित करना बहुत अच्छा तरीका है। +1
सनी

@fission: हां, इसका मतलब है कि मैं आपका जवाब स्वीकार करता हूं। ;) यह वह नहीं है जिसकी मैंने उम्मीद की थी, लेकिन यह उतना ही करीब है जितना इसे मिलता है, मुझे लगता है।
तोमलक

1

मैटबी की तरह, मुझे सर्विस कोड की वर्किंग डायरेक्टरी w / o एक्सेस को सोर्स कोड में बदलने का कोई तरीका नहीं पता है। इस विशिष्ट परिदृश्य के लिए, यह संभावना है कि अतिरिक्त निर्देशिका जांच पूर्ण टेक्स्ट इंडेक्सिंग ऑपरेशन के लिए आवश्यक i / o की मात्रा के सापेक्ष बहुत अनावश्यक डिस्क गतिविधि नहीं लगाती है। यहां तक ​​कि अगर आप उन्हें दूर कर सकते हैं, तो जानवर की प्रकृति से पूर्ण पाठ सूचकांक डिस्क गहन होगा।


1

पैरामीटर कुंजी के लिए "AppDirectory" स्ट्रिंग मान जोड़ें और अपने इच्छित कार्य निर्देशिका में मान सेट करें।


हम्म। बस परीक्षण किया गया है, काम नहीं करता है (विंडोज 7 पर, REG_EXPAND_SZ डेटा प्रकार का उपयोग किया गया है)। क्या आप इसकी पुष्टि कर सकते हैं कि यह वास्तव में आपके लिए काम करता है, कृपया
तोमलक

उपयोग करते समय यह काम करता है srvany। सामान्य सेवाओं के बारे में निश्चित नहीं।
कॉन्स्टेंटिन स्पिरिन

1

सेवा मुख्य कार्य के भीतर ऐसा करें:

  • के लिए एक कॉल करें GetModuleFilename। यह फॉर्म में, पथ सहित मॉड्यूल (एक्सई) फ़ाइल नाम को पुनः प्राप्त करेगा C:\path\to\exe\your_service.exe
  • अंतिम बैकस्लैश खोजने के लिए स्ट्रिंग जोड़तोड़ (शायद std::stringफ़ंक्शन का उपयोग करके find_last_of()) का उपयोग करें । अपने मॉड्यूल को पथ प्राप्त करने के लिए स्ट्रिप / वहां से ट्रिम करें और इसलिए आपके exe की निर्देशिका।
  • फ़ंक्शन SetCurrentDirectoryऔर वॉइला को कॉल करें !

1
मत भूलना GetModuleFilename समारोह कॉल :) में HMODULE पैरामीटर के लिए अशक्त पारित करने के लिए
uprightech
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.