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

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

コマンドプロンプトからWindowsサービスの実行ファイルへのパスを問い合わせる必要があります。だろうこれを行うには、次の操作を実行します。sc qc myServiceNameただし、これを行うと、次のエラーが発生します。

[SC] QueryServiceConfig 失敗 122:

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

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

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

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

答え1

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

sc qc <service name> 5000

「システムコールに渡されるデータ領域が小さすぎます」というエラーが解消されます。


こちらもご覧くださいSC品質管理MSDN ページ:

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

どこ:

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

答え2

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

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

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

答え3

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

答え4

PowerShell 7 から開始:

(Get-Service theServiceName).BinaryPathName

関連情報