web-dev-qa-db-ja.com

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

Windowsサービスを作成する場合

sc create ServiceName binPath= "the path"

どのように引数をインストーラクラスのContext.Parametersコレクションに渡すことができますか?

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

133
sympatric greg
sc create <servicename> binpath= "<pathtobinaryexecutable>" [option1] [option2] [optionN]

トリックは、createステートメントの=の後にスペースを入れ、特殊文字またはスペースを含むものには ""を使用することです。

自動的に起動するように開始設定をautoに設定するだけでなく、サービスの表示名を指定することをお勧めします。これを行うには、createステートメントでDisplayName= yourdisplaynamestart= 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

UPDATE 1

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

233
Mhmd

特にコマンドにスペースや引用符が含まれている場合、作成されたサービスのパラメータには、特有の形式上の問題があります。

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

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

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

実行可能ファイルへのパススペースを含むの場合は、pathを引用符で囲む必要があります。

したがって、both parameters andスペースを含むパスを持つコマンドの場合は、ネストした引用符が必要です。内側の引用符はバックスラッシュでエスケープする必要があります \"。パラメータ自体に引用符が含まれている場合も同じことが言えますが、それらもエスケープする必要があります。

円記号をエスケープ文字として使用しているにもかかわらず、パスに含まれている通常の円記号をエスケープする必要はありません。これは、バックスラッシュをエスケープ文字として通常使用する方法とは反対です。

だから、のようなコマンドのために
"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内のすべてのバックスラッシュはエスケープされません
132
HugoRune
 sc "YOURSERVICENAME" binpath = "\" C:\ Program Files(x86)\ Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\"-sopTIONALSWITCH" start = auto 

こちらを参照してください。 Windowsサービスの「実行ファイルへのパス」を変更する

11
imjustarah

私はこれをWindows 7上で動作させるのに問題がありました。それは私が渡した最初の引数を無視するように見えたので、私はbinPath= "C:\path\to\service.exe -bogusarg -realarg1 -realarg2"を使いました。

5
Craig Carpenter

私は単にパラメータなしでそれを作成し、それからレジストリHKLM\System\CurrentControlSet\Services\[YourService]を編集するために使います。

4
Tony

このコマンドは機能します。

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

アプリケーションのコードでどのように引数にアクセスするかを考慮に入れることも重要です。

私の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
2
Panciz

私はscを使う方法を見つけました。

sc config binPath = "\" c:\スペースが入ったパス\ service_executable.exe\""

言い換えれば、\を使ってレジストリへのトランジットを生き残りたいものをエスケープします。

1
Rem Onyshczak

私はあなたの提案でこの問題に対処することができませんでした、それは環境変数を使用してそれがパワーシェル(ウィンドウズサーバー2012)でのみ働いたx86フォルダーで最後に:

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

上記のすべてを試してもまだサービスに引数を渡すことができない場合、サービスがC/C++で記述されていると、問題が発生する可能性があります。「sc start arg1 arg2 ...」でサービスを開始した場合、SCはあなたのサービスのServiceMain関数をそれらの引数で直接呼び出します。しかし、Windowsがサービスの起動時(たとえばブート時)に起動すると、レジストリの "binPath"からのパラメータを使用して、サービスのメイン関数(_tmain)が呼び出されます。

0
BlueRiver

多くの二重引用符でバックスラッシュを使用するサービス作成の例。

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
Nash A

BinPath値の前後には必ず引用符を付けてください。

0
cripox