コマンドプロンプトから実行可能ファイルへのパスをWindowsサービスに問い合わせる必要があります。私が思うにはするこれを行う方法は:sc qc myServiceName
ですが、その場合、次のエラーが発生します。
[SC] QueryServiceConfigが失敗しました122:
システムコールに渡されたデータ領域が小さすぎます。
[SC] GetServiceConfigには1094バイトが必要です
これは、scコマンドが返す必要のあるデータには小さすぎる他のライブラリにデータ構造を送信していることを意味すると思います。 SCより大きなデータ構造(1094バイト)でうまく再試行するのではなく、爆破してこの醜いエラーメッセージを表示します。Micro$ oftに感謝します。
このエラーを回避する方法はありますか?実行可能ファイルへのパスが必要なだけですが、必要に応じて他のテキストから解析します。
私は実行可能な解決策を見つけました:
reg query "HKLM\System\CurrentControlSet\Services\<serviceName>" /v "ImagePath"
もちろん、これには多少の解析が必要ですが、services.mscダイアログボックスが提供する完全なパスが得られます。
実行可能ファイルへのパスが非常に長いサービスの詳細を取得しようとしたときにも、この問題が発生しました。 このディスカッション には回避策が含まれています。 sc qc
の引数としてバッファサイズを渡すことができます。つまり、次の場合:
sc qc <service name> 5000
「システムコールに渡されるデータ領域が小さすぎます」というエラーはなくなりました。
SC QC MSDNページも参照してください。
sc [<ServerName>] qc [<ServiceName>] [<BufferSize>]
どこ:
<BufferSize>バッファーのサイズ(バイト単位)を指定します。デフォルトのバッファサイズは1,024バイトです。
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
を出力するはずです
wmic
コマンドラインユーティリティを使用して試してください。これは私のマシンでCrashPlanService
というサービスの例です。
C:\Users\Ben>wmic service CrashPlanService get PathName
PathName
"C:\Program Files\CrashPlan\CrashPlanService.exe"
基本的に、 wmic service <<YourService>> get PathName
。
$binpath = (Get-ItemProperty -Path HKLM:SYSTEM\CurrentControlSet\Services\<serviceName>).ImagePath
$binpath = ($binpath).Substring(1,($binpath).IndexOf("<serviceBinFileName>")-1)