sc.exeでサービスを作成する場合、コンテキストパラメータで渡す方法は?


143

以下を使用してWindowsサービスを作成する場合:

sc create ServiceName binPath= "the path"

引数をInstallerクラスのContext.Parametersコレクションに渡すにはどうすればよいですか?

sc.exeドキュメントを読んだところ、そのような引数はの最後にしか渡せなかったとのことですがbinPath、例を見つけられなかったか、これを正常に実行できませんでした。


レジストリのServicesキーを一目見ると、必要なパラメーターがImagePath値に含まれていることがわかります。そのため、あなたbinPath= "c:\abc\def.exe /Param1=ghi"は正しい考えのように見えます。バックスラッシュはエスケープする必要がありますか(例: "c:\\ abc \\ ...")?最悪の場合、SC.EXEで編集できない場合は、後でレジストリ値を直接編集できます。
ewall

1
私はSC.EXEをあきらめたので、同じようinstallutil.exeを使用しています:Installutil.exe / ServiceNameは=」TheName」/ TARGETDIR =」C:\ TheInstallDirectory \」/ PACKAGEROOT =」PackageRootPath」
同所グレッグ

私はInstallutil.exeを使用し、古いテクノロジではWindows XP / 2003 Resource KetのInstsrv.exeを使用しました。
ゲイリーキンデル2011

回答:


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

コツは、createステートメントの=の後にスペースを残し、特殊文字やスペースを含むものには ""を使用することです。

サービスの表示名を指定し、開始設定をautoに設定して、自動的に開始することをお勧めします。あなたは指定することによってこれを行うことができます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

アップデート1

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


39
binPath =(binPath= "C:\...")の後のスペースが存在する必要があることに注意してください。そうしないと、これは機能しません。
オニオンナイト

1
start= autoは重要なものであるため、再起動後にサービスが自動的に開始されます。エンドユーザーがエキスパートでない場合に非常に良い
LaBracca '29

21
また、binPath引用符が必要な追加のパラメーターを渡す必要がある場合は、エスケープする必要があります(\")の例:パスである場合は、次のようc:\some long path\some.exe "first argument"にする必要がありますbinPath= "\"c:\some long path\some.exe\" \"first argument\""
Lankymart

1
引数の「=」の後にスペースがない場合(binPath= ...およびDisplayName= ...;私の場合、DisplayNameの後に「=」を忘れた場合)、コンソールはcreateコマンドの使用方法を出力します。例:DESCRIPTION: Creates a service entry... USAGE: sc <server> create....etc
レッドピー

3
「=」の後のスペースは非常に重要です
ErisoHV

152

作成されたサービスのパラメーターには、特にコマンドにスペースまたは引用符が含まれている場合、いくつかの特有のフォーマットの問題があります。

サービスのコマンドラインパラメータを入力する場合は、コマンドライン全体を引用符で囲む必要があります。(そしてbinPath=、mrswadgeが指摘したように、常に最初の引用の前後にスペースを残してください)

したがって、コマンドのサービスを作成するにPATH\COMMAND.EXE --param1=xyz は、次のbinPathパラメータを使用します。

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

以下は、すべての特殊なケースを示すSVNserveドキュメントの具体例です。

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"ます。

要約すると

  • 各scパラメータの後のスペース:binpath=_displayname=_およびdepend=_
  • スペースを含む各scパラメータは引用符で囲む必要があります
  • binpath内のすべての追加の引用符はバックスラッシュでエスケープされます。 \"
  • binpath内のすべてのバックスラッシュはエスケープされません

7
binPath =と値 "myservice.exe"の間にスペースがあることを確認することが重要であることがわかりました。すなわちbinPath= "myservice.exe。コマンドラインインタープリターはこれを予期し、スペースを区切り文字として使用してコマンドをトークン化する必要があります。
mrswadge 2013年

私はこの方法を試してみましたが、うまくいきました。SC.EXE "\\ ServerName" Create "ServiceName" BinPath = "SampleService.exe"
Sai


5

これをWindows 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ドキュメントでは、Mainメソッドを使用してbinPathまたはImagePath引数を取得しないことを推奨しています。代わりに、OnStartメソッドにロジックを配置して(C#)を使用することをお勧めしますEnvironment.GetCommandLineArgs();

最初の引数arg1にアクセスするには、次のようにする必要があります。

class MyService : ServiceBase
 {

    protected override void OnStart(string[] args)
    {

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

       }
 }

これは印刷されます

       arg1 == arg1

また、Mainメソッドのargsパラメータからarg1とarg2を取得することもできます。
WojciechMikołajewicz19年

1

scの使い方を見つけました。

sc config binPath = "\" c:\ path with it with service \ 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

binPath値の先頭と末尾には必ず引用符を付けてください。


1
パス "c:\ abc \ def.exe"を指定して、binPath = "c:\ abc \ def.exe / Param1 = ghi"のようにParam1 = "ghi"を渡そうとしました。しかし、実用
的ではあり

0

私はあなたの提案で問題を処理することができませんでした、最後にx86フォルダーは環境変数を使用してPower Shell(Windows Server 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関数を直接呼び出します。ただし、Windowsがサービスを開始するとき(たとえば、ブート時に)、呼び出されるのはサービスのメイン関数(_tmain)であり、レジストリの「binPath」からのパラメーターを使用します。


0

それはPowershellでは機能していないので、私の場合はCMDを使用する必要があります


PowerShell 5.1で修正
oetzi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.