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

StackOverflow https://stackoverflow.com/questions/3663331

  •  01-10-2019
  •  | 
  •  

質問

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

sc create ServiceName binPath= "the path"

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

の私の読書 sc.exe ドキュメントは、そのような議論はの終わりにしか渡されなかったということです binPath, 、しかし、私は例を見つけていないか、これをうまく行うことができませんでした。

役に立ちましたか?

解決

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

秘trickは、作成ステートメントの後にスペースを残し、特殊文字やスペースを含むものに「」を使用することです。

サービスのディスプレイ名を指定し、自動的に開始するように開始設定を自動に設定することをお勧めします。これを指定することでこれを行うことができます 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

更新1

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

他のヒント

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

入力したい場合 コマンドラインパラメーター サービスのために、あなたは囲む必要があります 全コマンドライン 引用符。 (そして、常にその後スペースを残します 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パラメーターは引用符で囲む必要があります
  • ビンパス内のすべての追加の引用は、バックスラッシュで逃げられます: \"
  • ビンパス内のすべてのバックスラッシュは逃げられません
sc create "YOURSERVICENAME" binpath= "\"C:\Program Files (x86)\Microsoft SQL Server\MSSQL11\MSSQL\Binn\sqlservr.exe\" -sOPTIONALSWITCH" start= auto 

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

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

パラメーターなしで作成するだけで、レジストリを編集します HKLM\System\CurrentControlSet\Services\[YourService].

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

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

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

C#アプリケーションでは、ServiceBaseクラスを使用しました。

 class MyService : ServiceBase
{

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

使用してサービスを登録しました

sc 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

SCを使用する方法を見つけました。

sc config binpath = "" c: path init service_executable.exe ""

言い換えれば、を使用して、「あなたが登録へのトランジットを生き残りたい」を逃れます。

ビンパス値の開始と終了時に見積もりを持っていることを確認してください。

私はあなたの提案で問題を処理することができませんでした。最後に、環境変数を使用してPower Shell(Windows Server 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}

上記のすべてを試してみて、それでもサービスにbargsを渡すことができない場合、サービスがC/C ++で書かれている場合、問題は次のとおりです。 、SCは、これらのARGSを使用して、サービスのServiceMain関数を直接呼び出します。ただし、Windowsがサービスを開始すると(たとえば、ブートタイム)、レジストリの「ビンパス」のパラメーションを使用して、サービスのメイン関数(_tmain)が呼ばれます。

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

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top