web-dev-qa-db-ja.com

sc qcを使用せずにWindowsサービス実行可能ファイルへのパスを取得するにはどうすればよいですか?

コマンドプロンプトから実行可能ファイルへのパスをWindowsサービスに問い合わせる必要があります。私が思うにはするこれを行う方法は:sc qc myServiceNameですが、その場合、次のエラーが発生します。

[SC] QueryServiceConfigが失敗しました122:

システムコールに渡されたデータ領域が小さすぎます。

[SC] GetServiceConfigには1094バイトが必要です

これは、scコマンドが返す必要のあるデータには小さすぎる他のライブラリにデータ構造を送信していることを意味すると思います。 SCより大きなデータ構造(1094バイト)でうまく再試行するのではなく、爆破してこの醜いエラーメッセージを表示します。Micro$ oftに感謝します。

このエラーを回避する方法はありますか?実行可能ファイルへのパスが必要なだけですが、必要に応じて他のテキストから解析します。

15
Jared

私は実行可能な解決策を見つけました:

reg query "HKLM\System\CurrentControlSet\Services\<serviceName>" /v "ImagePath"

もちろん、これには多少の解析が必要ですが、services.mscダイアログボックスが提供する完全なパスが得られます。

13
Jared

実行可能ファイルへのパスが非常に長いサービスの詳細を取得しようとしたときにも、この問題が発生しました。 このディスカッション には回避策が含まれています。 sc qcの引数としてバッファサイズを渡すことができます。つまり、次の場合:

sc qc <service name> 5000

「システムコールに渡されるデータ領域が小さすぎます」というエラーはなくなりました。


SC QC MSDNページも参照してください。

sc [<ServerName>] qc [<ServiceName>] [<BufferSize>]

どこ:

<BufferSize>バッファーのサイズ(バイト単位)を指定します。デフォルトのバッファサイズは1,024バイトです。

21
Ken Keenan

PowerShellでこれを行うには、次のようなWMIクエリを使用します。

$service = get-wmiobject -query 'select * from win32_service where name="winrm"'; echo $service.pathname

これにより、services.mscに表示されるオプションを含む完全なパスが得られます。この例のwinrmを、検索したいサービスに置き換えてください。

上記のwinrmのクエリはC:\Windows\System32\svchost.exe -k NetworkServiceを出力するはずです

10
MDMarra

wmicコマンドラインユーティリティを使用して試してください。これは私のマシンでCrashPlanServiceというサービスの例です。

C:\Users\Ben>wmic service CrashPlanService get PathName

PathName
"C:\Program Files\CrashPlan\CrashPlanService.exe"

基本的に、 wmic service <<YourService>> get PathName

4
Ben Pilbrow
$binpath = (Get-ItemProperty -Path HKLM:SYSTEM\CurrentControlSet\Services\<serviceName>).ImagePath
$binpath = ($binpath).Substring(1,($binpath).IndexOf("<serviceBinFileName>")-1)
0
Zosoabi