Sc.exe ile bir hizmet oluştururken bağlam parametrelerine nasıl geçilir?


143

Şunları kullanarak Windows hizmeti oluştururken:

sc create ServiceName binPath= "the path"

Bağımsız değişkenler Installer sınıfının Context.Parameters koleksiyonuna nasıl aktarılabilir?

Belgeleri okuduğumda sc.exe, bu tür argümanların yalnızca sonunda geçilebileceği binPath, ancak bir örnek bulamadım veya bunu başarıyla yapabildim.


Kayıt Defteri'ndeki Hizmetler anahtarına bir bakış, gerekli parametrelerin ImagePath değerine dahil edildiğini gösterir, bu nedenle binPath= "c:\abc\def.exe /Param1=ghi"doğru fikir gibi görünür. Ters eğik çizgilerden kaçınılması gerekiyor mu (yani "c: \\ abc \\ ...")? En kötü şey, SC.EXE bunu yapamazsa, daha sonra doğrudan Kayıt Defteri değerini düzenleyebilirsiniz.
ewall

1
Sc.exe'den vazgeçtim ve installutil.exe'yi şu şekilde kullanıyorum: Installutil.exe / ServiceName = ”TheName” / targetdir = ”C: \ TheInstallDirectory \” / PackageRoot = ”PackageRootPath”
sempatik greg

Installutil.exe kullandım ve eski teknoloji için Windows XP / 2003 Resource Ket'ten Instsrv.exe kullanıyorum.
Gary Kindel

Yanıtlar:


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

İşin püf noktası, create ifadenizdeki = işaretinden sonra bir boşluk bırakmak ve ayrıca özel karakterler veya boşluklar içeren her şey için "" kullanmaktır.

Hizmet için bir Görünen Ad belirtmeniz ve başlangıç ​​ayarının otomatik olarak başlaması için otomatik olarak ayarlanması önerilir. Bunu, create ifadenizi belirterek DisplayName= yourdisplaynameve start= autoiçinde yapabilirsiniz .

İşte bir örnek:

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

Bu işe yaradıysa şunu görmelisiniz:

[SC] CreateService SUCCESS

GÜNCELLEME 1

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


39
Binpath sonra boşluk = (unutmayın binPath= "C:\...") ihtiyacı mevcut olması, yoksa bu işi olmaz.
Soğan Şövalyesi

1
start= autoönemlidir, bu nedenle yeniden başlattıktan sonra servis otomatik olarak başlatılacaktır. Son kullanıcının uzman olmaması durumunda çok iyi
LaBracca

21
Ayrıca binPathtırnak içinde gerektiren ekstra parametreler geçmeniz gerekiyorsa, bunların kaçması gerekir ( \") örnek: eğer yol c:\some long path\some.exe "first argument"olsaydıbinPath= "\"c:\some long path\some.exe\" \"first argument\""
Lankymart

1
Eğer argümanlarınızda "=" karakterinden sonra bir boşluk yoksa ( binPath= ...ve DisplayName= ...benim durumumda DisplayName'den sonra "=" karakterini unuttum), konsol createkomut için kullanım talimatlarını basacaktır ; like: DESCRIPTION: Creates a service entry... USAGE: sc <server> create....etc
Kırmızı Bezelye

3
"="
Den

152

Oluşturulan hizmetler için parametrelerde, özellikle komutta boşluk veya tırnak varsa, bazı özel biçimlendirme sorunları vardır:

Hizmet için komut satırı parametreleri girmek istiyorsanız , tüm komut satırını tırnak içine almanız gerekir . (Ve binPath=mrswadge'ın işaret ettiği gibi, ilk alıntıdan önce ve önce bir boşluk bırakın )

Bu nedenle, komut için bir hizmet oluşturmak PATH\COMMAND.EXE --param1=xyz için aşağıdaki binPath parametresini kullanırsınız:

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

Eğer yol yürütülebilir boşluk içeriyorsa , sen içine zorunda yolunu tırnak içinde.

Olan bir komut için Yani hem parametreleri ve boşluk içeren bir yol, size gereken yuvalanmış tırnak . Ters eğik çizgiler ile iç tırnak kaçmak zorunda \". Aynı şey parametrelerin kendisinde tırnak işareti içeriyorsa, bunlardan da kaçmanız gerekir.

Ters eğik çizgileri kaçış karakteri olarak kullanmanıza rağmen, yoldaki normal ters eğik çizgilerden kaçmak zorunda değilsiniz. Bu normalde ters eğik çizgileri kaçış karakteri olarak nasıl kullandığınıza aykırıdır.

Yani aşağıdaki gibi bir komut için
"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

İşte tüm özel durumları gösteren SVNserve belgelerinden somut bir örnek:

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

(satır aralıkları okunabilirlik için eklenir, bunları dahil etmeyin)

Bu, komut satırına yeni bir hizmet ekler "C:\Program Files\CollabNet Subversion Server\svnserve.exe" --service -r "C:\my repositories".

Özet olarak

  • Her sc parametre sonra alanı: binpath=_, displayname=_vedepend=_
  • boşluk içeren her sc parametresi tırnak işaretleri içine alınmalıdır
  • binathath içindeki tüm ek tırnak işaretleri ters eğik çizgilerle kaçar: \"
  • binathath içindeki tüm ters eğik çizgiler kaçmaz

7
BinPath = ve "myservice.exe" değeri arasında bir boşluk olmasını sağlamak önemli olduğunu gördüm. yani binPath= "myservice.exe. Komut satırı yorumlayıcısı bunu bekliyor olmalı ve sınırlayıcı olarak boşluk kullanarak komutun tokenleştirilmesini gerektirmelidir.
mrswadge

Bu şekilde denedim ve işe yaradı. SC.EXE "\\ SunucuAdı" Oluştur "HizmetAdı" BinPath = "SampleService.exe"
Sai


5

Windows 7 üzerinde çalışmak için bunu elde sorunları vardı. Bu ilk kullandığım argüman göz ardı gibiydi, bu yüzden kullandım binPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"ve çalıştı.


4

Ben sadece parametre olmadan oluşturmak ve sonra kayıt defterini düzenlemek için kullanın HKLM\System\CurrentControlSet\Services\[YourService].


2

Bu komut çalışır:

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

2

Ayrıca, uygulamanın kodundaki Bağımsız Değişkenlere nasıl eriştiğinizi de dikkate almak önemlidir.

C # uygulamamda ServiceBase sınıfını kullandım:

 class MyService : ServiceBase
{

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

Hizmetimi kullanarak kaydettim

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

Ancak argsbir hizmet olarak çalıştırdığımda değişken üzerinden bağımsız değişkenlere erişemedim .

MSDN belgeleri, binPathveya ImagePathbağımsız değişkenlerini almak için Main yöntemini kullanmamanızı önerir . Bunun yerine mantığınızı OnStartyönteme yerleştirip (C #) yöntemini kullanmanızı önerir Environment.GetCommandLineArgs();.

İlk argümanlara erişmek arg1için şöyle yapmalıyım:

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

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

       }
 }

bu yazdırır

       arg1 == arg1

Arg1 ve arg2 öğelerinizi Main yöntemindeki args parametresinden de alabilirsiniz.
Wojciech Mikołajewicz

1

Sc kullanmanın bir yolunu buldum.

sc config binPath = "\" c: \ yol içindeki boşluklarla \ service_executable.exe \ ""

Diğer bir deyişle, \ "kullanarak kayıt defterine geçiş hayatta kalmak istediğiniz herhangi bir" 's.


1

Birçok çift tırnak işareti içeren ters eğik çizgi kullanımına ilişkin bir hizmet oluşturma örneği.

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

BinPath değerinizin başında ve sonunda tırnak işareti bulunduğundan emin olun.


1
"C: \ abc \ def.exe" yolu verildiğinde, Param1 = "ghi" komutunu şu şekilde aktarmaya çalıştım: binPath = "c: \ abc \ def.exe / Param1 = ghi". But no work ...
sympatric greg

0

Önerilerinizle ilgili sorunu çözemedim, sonunda ortam değişkenlerini kullanarak yalnızca güç kabuğunda (windows server 2012) çalıştığı x86 klasörü ile:

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

0

Yukarıdakilerin tümünü denediyseniz ve hizmetinize hala argümanlar iletemiyorsanız, hizmetiniz C / C ++ ile yazılmışsa, sorun şu olabilir: hizmetinizi "sc start arg1 arg2 ..." ile başlattığınızda SC, hizmetinizin ServiceMain işlevini doğrudan bu değişkenlerle çağırır. Ancak Windows hizmetinizi başlattığında (örneğin önyükleme zamanında), hizmetinizin ana işlevi (_tmain) olarak adlandırılır ve kayıt defterinin "binPath" parametresinden parazitlerdir.


0

Powershell'de çalışmıyor ve benim durumumda CMD kullanmalı


PowerShell 5.1'de düzeltildi
oetzi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.