次のようなコマンドラインパラメータを受け入れることができるWindowsサービスアプリケーションがあります。
MyService -option
これまでのところ、パラメーターを指定してサービスを開始する場合は、[サービスのプロパティ]ダイアログ([開始パラメーター]ボックス内)から手動で実行するか、次のコマンドを使用します。
sc start MyService -option
このパラメーターを使用してサービスを「永久に」インストールするにする方法です。ユーザーは毎回パラメーターを設定する必要なく、サービスを開始/停止する必要があります。
ところで、ImagePathレジストリエントリにパラメータを追加しても機能せず、次のようにインストールすることもできません。
MyService -option /install
更新:これまでの回答に感謝します。質問を絞り込むのに役立ちます。
私が達成したいのは、同じ実行可能ファイルに複数のサービスがある場合に備えて、パラメーターをサービスレベル自体(プロパティのように)に設定することです。 binpath configオプションは、レジストリのImagePathエントリを更新するだけです。サービス固有にすることはできません。
sc config MyService binPath= MyService.exe -option
更新
個々のサービスパラメータは、レジストリのキーHKLM\SYSTEM\CurrentControlSet\Services\<serviceName>\Parameters
に格納されています。パラメータがサービスにどのように渡されるかはわかりません。 IbelieveSCMはこれらの値を読み取り、次に StartService
を呼び出すと、それらを ServiceMain
に渡します コールバック。
パラメータを構成ファイルに入れてみませんか?
ServiceBase.OnStart ドキュメントによると:
コンソールに入力された引数は保存されません。これらは、サービスがコントロールパネルから開始されたときに一度だけサービスに渡されます。サービスが自動的に開始されるときに存在する必要がある引数は、サービスのレジストリキー(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services \)のImagePath文字列値に配置できます。 GetCommandLineArgsメソッドを使用して、レジストリから引数を取得できます。例:string [] imagePathArgs = Environment.GetCommandLineArgs();。
ImagePathを介してコマンドラインで渡される引数には、main()またはGetCommandLine()を介してアクセスできます。コマンドライン引数を使用してインストールしてから、ServiceMainで、lpszArgsパラメータに引数が渡されているかどうかを確認します。そうでない場合は、GetCommandLineを呼び出して、その方法で渡されたものがないか確認します。
Powershellはこれを実行できますが、それを実現するには.Netを使用する必要があります。
new-Object System.ServiceProcess.ServiceController("$ServiceName",$ComputerName)).Start("$Parameter")
同じ実行可能ファイルを持つサービスが複数ある場合は、それらを異なるサービス名でインストールします。パラメータの代わりにサービス名を参照できます。
サービス名を取得するには、これを使用できます WindowsサービスはどのようにしてServiceNameを決定できますか?
SC(サービス制御)コマンドを使用します。これは、単に開始および停止するよりも多くのオプションを提供します。
DESCRIPTION:
SC is a command line program used for communicating with the
NT Service Controller and services.
USAGE:
sc <server> [command] [service name] ...
The option <server> has the form "\\ServerName"
Further, help on commands can be obtained by typing: "sc [command]"
Commands:
query-----------Queries the status for a service, or
enumerates the status for types of services.
queryex---------Queries the extended status for a service, or
enumerates the status for types of services.
start-----------Starts a service.
pause-----------Sends a PAUSE control request to a service.
interrogate-----Sends an INTERROGATE control request to a service.
continue--------Sends a CONTINUE control request to a service.
stop------------Sends a STOP request to a service.
config----------Changes the configuration of a service (persistent).
description-----Changes the description of a service.
failure---------Changes the actions taken by a service upon failure.
qc--------------Queries the configuration information for a service.
qdescription----Queries the description for a service.
qfailure--------Queries the actions taken by a service upon failure.
delete----------Deletes a service (from the registry).
create----------Creates a service. (adds it to the registry).
control---------Sends a control to a service.
sdshow----------Displays a service's security descriptor.
sdset-----------Sets a service's security descriptor.
GetDisplayName--Gets the DisplayName for a service.
GetKeyName------Gets the ServiceKeyName for a service.
EnumDepend------Enumerates Service Dependencies.
The following commands don't require a service name:
sc <server> <command> <option>
boot------------(ok | bad) Indicates whether the last boot should
be saved as the last-known-good boot configuration
Lock------------Locks the Service Database
QueryLock-------Queries the LockStatus for the SCManager Database
EXAMPLE:
sc start MyService