Sc.exeでサービスを作成するとき、コンテキストパラメーターに渡す方法は?
-
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= 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
他のヒント
作成されたサービスのパラメーターには、特にコマンドにスペースまたは引用符が含まれている場合、いくつかの独特な形成問題があります。
入力したい場合 コマンドラインパラメーター サービスのために、あなたは囲む必要があります 全コマンドライン 引用符。 (そして、常にその後スペースを残します 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