Windows सेवा किस निर्देशिका में चलती है?


86

मैंने एक बहुत ही साधारण .NET विंडोज सर्विस बनाई है और इसे इंस्टाल यूटीआईएल। Exe यूटिलिटी का उपयोग करके इंस्टॉल किया है।

सेवा में मेरे पास कोड का एक टुकड़ा है:

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

मैंने सेवा के रूप में एक ही निर्देशिका में test_file.txt नामक एक फ़ाइल बनाई है, लेकिन कोड का टिप्पणी किया गया भाग कभी निष्पादित नहीं किया जा रहा है ...?


क्या सेवा चलाने वाले उपयोगकर्ता के पास फ़ाइल पर सही अनुमति है?
CSharpAtl

जवाबों:


80

सेवा नियंत्रण प्रबंधक नामक एक एप्लिकेशन से सेवाएं शुरू की जाती हैं। यह एप्लिकेशन सिस्टम निर्देशिका % WinDir% \ System32 में रहता है

विंडोज 7 अल्टीमेट - 64 बिट्स पर यह रास्ता वास्तव में है: % WinDir% \ SysWOW64

अधिक जानकारी के लिए MSDN पर सेवा नियंत्रण प्रबंधक देखें ।

मूल पोस्ट के साथ समस्या को इंगित करने के लिए धन्यवाद हार्पर शेल्बी।


1
svchost.exe अधिकांश आंतरिक विंडोज़ सेवाओं के लिए एक सेवा होस्ट है। सेवा कर सकते हैं, और गैर-विंडोज सेवाओं के मामले में सबसे अधिक संभावना है, एक अलग exe मेजबान में चलाते हैं।
माइकल

1
धन्यवाद - फ़ाइल को वहाँ छोड़ने से काम हो जाता है इसलिए मैं उस स्थान की पुष्टि कर सकता हूँ: c: \ windows \ system32
Guy

1
@ गुय - मैं उस पर शोध करना चाह रहा था। मुझे एक 'अच्छा' कारण नहीं मिल रहा है, हालांकि मुझे संदेह है क्योंकि यह वह निर्देशिका है जिसे SCM (सेवा नियंत्रण प्रबंधक) से चलाता है, और इसलिए यह मूल प्रक्रिया के वातावरण से चाइल्ड प्रोसेस (सर्विस) को पास हो जाता है।
हार्पर शेल्बी

सेवा नियंत्रण प्रबंधक (Services.exe) द्वारा शुरू की जाती है जो% WINDIR% \ system32 में भी रहती है। En.wikipedia.org/wiki/Service_Control_Manager
डिर्क वोल्मार

2
मेरे लिए (64-बिट विंडोज 7 पर) इसके %WinDir%\SysWOW64बजाय
स्ट्राइगोइड्स

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

वर्तमान निर्देशिका का उत्पादन करेगा। उस कोड को अपनी सेवा के स्टार्टअप विधि में डालें और आउटपुट की जांच करने के लिए डीबग्यूव्यू जैसे टूल का उपयोग करें। तब आपको अपनी सेवा के स्टार्टअप फ़ोल्डर का पता चल जाएगा।

यह सरल तकनीक सेवा विकास में कई समस्याओं के साथ उपयोगी होगी, विशेष रूप से सेवा स्टार्टअप को डिबग करने के लिए।

आप शायद अपनी सेवा के कार्यशील फ़ोल्डर की अपेक्षा करते हैं कि वह फ़ोल्डर जहां सेवा निष्पादन योग्य है (इसलिए मैंने किया था)। आप उस फ़ोल्डर को कोड की निम्न पंक्तियों का उपयोग करके बदल सकते हैं:

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

16

आप इसे इस तरह काम कर सकते हैं:

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

1
+1, यह शेष एप्लिकेशन को कार्य करने की अनुमति देता है जैसे कि यह सामान्य रूप से आह्वान किया गया था। exe जहां वर्तमान निर्देशिका यह पथ है। धन्यवाद, यह वही है जो मुझे चाहिए था! कोड को फिर से लिखना करने से परहेज किया जो रिश्तेदार रास्तों का उपयोग करते थे।
पॉल

3

यह भी जानना चाहता था कि कौन सी फ़ोल्डर में विंडोज सेवा चल रही है लेकिन स्रोत कोड मेरा नहीं था इसलिए इसे संशोधित नहीं किया जा सका। कमांड प्रॉम्प्ट sc qc <service name>में टाइप करना BINARY_PATH_NAME में फ़ोल्डर प्रदर्शित करता है।

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

जब MyService को क्वेरी मिलती है:

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

यह वह मार्ग है जहां सेवा बाइनरी स्थित है, जो सेवा के "वर्तमान कार्य" निर्देशिका के बराबर होने की गारंटी नहीं है जो कि (सेवा) प्रक्रिया के समय के दौरान कई बार बदल सकती है। रिश्तेदार फ़ाइल नाम (ओपी उदाहरण के रूप में) वर्तमान कार्यशील निर्देशिका के खिलाफ हल किए जाते हैं, न कि उस निर्देशिका में जहां निष्पादन योग्य बाइनरी स्थित है।
क्रिश्चियन.के।

sc qc apache2.4दिखाता है ...BINARY_PATH_NAME : "E:\root\Public Cache\Apache Httpd\httpd-2.4.20-x86-vc11\Apache24\bin\httpd.exe" -k runservice, लेकिन इसके बजाय काम करने वाली निर्देशिका है%WinDir%\System32
Pacerier

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.