Sc.exe के साथ एक सेवा बनाते समय संदर्भ मापदंडों में कैसे पारित करें?


143

Windows सेवा का उपयोग करते समय:

sc create ServiceName binPath= "the path"

इंस्टालर वर्ग के संदर्भ में तर्क कैसे पारित किए जा सकते हैं। पैरामीटर संग्रह?

sc.exeदस्तावेज़ीकरण के बारे में मेरा कहना है कि इस तरह के तर्क केवल के अंत में पारित किए जा सकते हैं binPath, लेकिन मुझे कोई उदाहरण नहीं मिला है या इस पर सफलतापूर्वक काम करने में सक्षम नहीं है।


रजिस्ट्री में सेवा कुंजी पर एक नज़र बताती है कि किसी भी आवश्यक पैरामीटर को इमेजपाथ मान के साथ शामिल किया गया है, इसलिए आपका binPath= "c:\abc\def.exe /Param1=ghi"विचार सही लगता है। क्या बैकस्लैश से बचने की आवश्यकता है (यानी "c: \\ abc \\ ...")? सबसे खराब बात, आप सीधे रजिस्ट्री मान को संपादित कर सकते हैं यदि SC.EXE ऐसा नहीं कर सकता है।
ईवल

1
मैंने sc.exe पर छोड़ दिया और installutil.exe का उपयोग कर रहा हूं, जैसे: Installutil.exe / ServiceName = "TheName" / targetdir = "C: \ TheInstallDirectory \" / PackageRoot = "PackageRootPath"
सहानुभूति Greg में

मैंने Installutil.exe का उपयोग किया और पुरानी तकनीक के लिए मैं Windows XP / 2003 संसाधन केट से Instsrv.exe का उपयोग करता हूं।
गैरी किंडल

जवाबों:


257
sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]

ट्रिक आपके बनाएं स्टेटमेंट में = के बाद एक स्पेस छोड़ना है, और स्पेशल कैरेक्टर या स्पेस वाली किसी भी चीज के लिए "" का उपयोग करना है।

सेवा के लिए प्रदर्शन नाम निर्दिष्ट करने के साथ-साथ ऑटो पर स्टार्ट सेटिंग सेट करना उचित है ताकि यह स्वचालित रूप से शुरू हो जाए। आप इसे निर्दिष्ट करके DisplayName= yourdisplaynameऔर start= autoअपने बनाये कथन में कर सकते हैं।

यहाँ एक उदाहरण है:

C:\Documents and Settings\Administrator> sc create asperacentral 
binPath= "C:\Program Files\Aspera\Enterprise Server\bin\Debug\asperacentral.exe" 
DisplayName= "Aspera Central" 
start= auto

यदि यह काम आपको देखना चाहिए:

[SC] CreateService SUCCESS

अद्यतन १

http://support.microsoft.com/kb/251192


39
ध्यान रखें कि binPath के बाद अंतरिक्ष = ( binPath= "C:\...") की जरूरत उपस्थित होना है, वरना यह काम नहीं करेगा।
प्याज-नाइट

1
start= autoएक महत्वपूर्ण है, इसलिए रिबूट के बाद सेवा स्वचालित रूप से शुरू हो जाएगी। अंत उपयोगकर्ता के मामले में बहुत अच्छा नहीं एक विशेषज्ञ है
LaBracca

21
इसके अलावा, यदि आपको अतिरिक्त मापदंडों को पारित करने की binPathआवश्यकता होती है जिसमें उद्धरणों की आवश्यकता होती है, तो वे बच जाते हैं ( \") उदाहरण: यदि पथ की c:\some long path\some.exe "first argument"आवश्यकता थी, तोbinPath= "\"c:\some long path\some.exe\" \"first argument\""
लंक्यमार्ट

1
यदि आपके पास अपने args में "=" के बाद जगह नहीं है (जैसे binPath= ...और DisplayName= ...; मेरे मामले में मैं DisplayName के बाद "=" भूल गया), तो कंसोल createकमांड के लिए उपयोग के निर्देशों को प्रिंट करेगा ; जैसे: DESCRIPTION: Creates a service entry... USAGE: sc <server> create....इत्यादि
लाल मटर

3
"=" के बाद रिक्त स्थान बहुत महत्वपूर्ण है
ErisoHV

152

निर्मित सेवाओं के लिए पैरामीटर में कुछ अजीब समस्याएं हैं, विशेष रूप से यदि कमांड में रिक्त स्थान या उद्धरण शामिल हैं:

यदि आप सेवा के लिए कमांड लाइन पैरामीटर दर्ज करना चाहते हैं , तो आपको पूरे कमांड लाइन को उद्धरणों में संलग्न करना होगा । (और binPath=पहले उद्धरण के बाद और पहले एक जगह छोड़ दें , जैसा कि मृस्वाद्गे ने बताया है)

इसलिए, कमांड के लिए एक सेवा बनाने के लिए PATH\COMMAND.EXE --param1=xyz आप निम्न बिनपाथ पैरामीटर का उपयोग करेंगे:

binPath= "PATH\COMMAND.EXE --param1=xyz"
        ^^                             ^
        ||                             |
  space    quote                     quote

यदि निष्पादन योग्य पथ में रिक्त स्थान हैं , तो आपको पथ को उद्धरण में संलग्न करना होगा ।

तो ऐसे कमांड के लिए जिसमें दोनों मापदंडों और रिक्त स्थान के साथ एक पथ है, आपको नेस्टेड कोट्स की आवश्यकता है । आपको बैकस्लैश के साथ आंतरिक उद्धरण से बचना होगा \"। यह वही है यदि पैरामीटर में स्वयं उद्धरण शामिल हैं, तो आपको उन से भी बचने की आवश्यकता होगी।

भागने के पात्रों के रूप में बैकस्लैश का उपयोग करने के बावजूद, आपको पथ में निहित नियमित बैकस्लैश से बचना नहीं है। यह इसके विपरीत है कि आप आमतौर पर बैकस्लैश का उपयोग कैसे कर सकते हैं बच पात्रों के रूप में।

तो जैसे एक कमांड के लिए
"PATH WITH SPACES \COMMAND.EXE" --param-with-quotes="a b c" --param2:

binPath= "\"PATH WITH SPACES \COMMAND.EXE\" --param-with-quotes=\"a b c\" --param2"
         ^ ^                 ^           ^                      ^       ^         ^
         | |                 |           |                      |       |         | 
 opening     escaped      regular     escaped                    escaped       closing
   quote     quote       backslash    closing                    quotes          quote
     for     for            in         quote                      for              for
   whole     path          path       for path                  parameter        whole
 command                                                                       command

यहाँ SVNerve प्रलेखन से एक ठोस उदाहरण है, जो सभी विशेष मामलों को दर्शाता है:

sc create svnserve 
   binpath= "\"C:\Program Files\CollabNet Subversion Server\svnserve.exe\" --service -r \"C:\my repositories\"  "
   displayname= "Subversion Server" depend= Tcpip start= auto 

(पठनीयता के लिए लाइनब्रेक जोड़े जाते हैं, उन्हें शामिल न करें)

यह कमांड लाइन के साथ एक नई सेवा जोड़ देगा "C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories"

तो संक्षेप में

  • प्रत्येक अनुसूचित जाति पैरामीटर के बाद अंतरिक्ष: binpath=_, displayname=_औरdepend=_
  • प्रत्येक sc पैरामीटर जिसमें रिक्त स्थान होते हैं उन्हें उद्धरणों में संलग्न किया जाना चाहिए
  • बिनपाथ के अंदर के सभी अतिरिक्त उद्धरण बैकस्लैश के साथ बच गए हैं: \"
  • बिनपाथ के अंदर सभी बैकस्लैश बच नहीं रहे हैं

7
मैंने पाया कि यह सुनिश्चित करना महत्वपूर्ण था कि बिनपाथ = और मूल्य "myservice.exe" के बीच एक स्थान है। यानी binPath= "myservice.exe। कमांड लाइन दुभाषिया को इस बात की उम्मीद करनी चाहिए और आदेश का उपयोग करके सीमांकक के रूप में स्थान का उपयोग करके टोकन बनने की आवश्यकता है।
मृस्वाद्गे

मैंने इस तरह से कोशिश की और यह काम कर गया। SC.EXE "\\ ServerName" "ServiceName" BinPath = "SampleService.exe" बनाएं
साईं


5

मेरे पास विंडोज 7 पर काम करने के लिए इसे प्राप्त करने के मुद्दे थे। ऐसा लगता था कि मैंने जो पहला तर्क पारित किया था, binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"उसमें मैंने उसका इस्तेमाल किया था और यह काम कर गया।


4

मैं इसे मापदंडों के बिना बस बनाने के लिए उपयोग करता हूं, और फिर रजिस्ट्री को संपादित करता हूं HKLM\System\CurrentControlSet\Services\[YourService]


2

यह आदेश काम करता है:

sc create startSvn binPath= "\"C:\Subversion\bin\svnserve.exe\" --service -r \"C:\SVN_Repository\"" displayname= "MyServer" depend= tcpip start= auto

2

यह भी महत्वपूर्ण है कि आप आवेदन के कोड में तर्क का उपयोग कैसे करें।

मेरे c # एप्लिकेशन में मैंने ServiceBase क्लास का उपयोग किया:

 class MyService : ServiceBase
{

    protected override void OnStart(string[] args)
    {
       }
 }

मैंने अपनी सेवा का उपयोग करके पंजीकरण किया

sc create myService binpath = "MeyService.exe arg1 arg2"

argsजब मैं इसे सेवा के रूप में चलाता हूं तो मैं चर के माध्यम से तर्कों तक नहीं पहुंच सकता ।

MSDN प्रलेखन सुझाव binPathया ImagePathतर्कों को पुनः प्राप्त करने के लिए मुख्य विधि का उपयोग नहीं कर रहा है। इसके बजाय यह आपके तर्क को OnStartविधि में रखने और फिर उपयोग करने का सुझाव देता है (C #) Environment.GetCommandLineArgs();

पहली दलीलें तक पहुँचने के लिए arg1मुझे ऐसा करना होगा:

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

                log.Info("arg1 == "+Environment.GetCommandLineArgs()[1]);

       }
 }

यह प्रिंट होगा

       arg1 == arg1

आप अपने arg1 और arg2 को आर्ग्स पैरामीटर से मुख्य विधि पर प्राप्त कर सकते हैं।
वोज्शिएक मोइकोलाजेविज़

1

मुझे sc का उपयोग करने का एक तरीका मिला।

sc config binPath = "\" c: \ path इसमें रिक्त स्थान के साथ \ service_executable.exe \ ""

दूसरे शब्दों में, किसी भी "बचने के लिए \" का उपयोग करें आप रजिस्ट्री में संक्रमण से बचना चाहते हैं।


1

कई दोहरे उद्धरण चिह्नों के साथ बैकस्लैश का उपयोग करने का एक सेवा निर्माण उदाहरण।

C:\Windows\system32>sc.exe create teagent binpath= "\"C:\Program Files\Tripwire\TE\Agent\bin\wrapper.exe\" -s \"C:\Program Files\Tripwire\TE\Agent\bin\agent.conf\"" DisplayName= "Tripwire Enterprise Agent"

[SC] CreateService SUCCESS

0

अपने बिनपाथ मूल्य के आरंभ और अंत में उद्धरण अवश्य दें।


1
एक पथ "c: \ abc \ def.exe" को देखते हुए, मैंने Param1 = "ghi" को इस तरह से पास करने का प्रयास किया: binPath = "c: \ abc \ def.exe / Param1 = ghi"। लेकिन कोई काम नहीं ...
सहानुभूति greg

0

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

{sc.exe create svnserve binpath= "${env:programfiles(x86)}/subversion/bin/svnserve.exe --service -r C:/svnrepositories/"   displayname= "Subversion Server" depend= Tcpip start= auto}

0

यदि आपने उपरोक्त सभी को आज़माया है और फिर भी आपकी सेवा के लिए args पास नहीं कर सकते हैं, यदि आपकी सेवा C / C ++ में लिखी गई है, तो यहाँ समस्या क्या हो सकती है: जब आप "sc start arg1 arg2 ..." के माध्यम से अपनी सेवा शुरू करते हैं ... , SC आपकी सेवा के ServiceMain फ़ंक्शन को सीधे उन आर्गों के साथ कॉल करता है। लेकिन जब विंडोज आपकी सेवा शुरू करता है (उदाहरण के लिए, बूट समय पर), तो यह आपकी सेवा का मुख्य कार्य (_tmain) है जिसे रजिस्ट्री के "बिनपाथ" से परम के साथ कहा जाता है।


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