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


15

コマンドプロンプトを使用して、実行可能ファイルへのパスをWindowsサービスに照会する必要があります。私がこれ行う方法sc qc myServiceNameは次のとおりだと思いますが、そうすると次のエラーが発生します:

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

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

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

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

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

回答:


20

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

sc qc <service name> 5000

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


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

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

どこ:

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


2
FYI 2^13 = 8192は、バッファサイズの最大値です。
nebffa

sc queryex type= service state= all | find /i "myServiceNameすべてのサービスをリストしますが、残念ながらパスはありません。
シャヤン

13

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

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

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


10

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


残念ながら、XPにはデフォルトではPowershellがないため、PowerShellに依存することはできません。XP、サーバー2008、および7のサポートが必要です。すべて追加ソフトウェアをインストールする必要はありません。
ジャレッド

@ジャレッドそれはあまりにも悪いです。これを単一のマシンから多数のリモートマシンに対して実行することはできませんか?
MDMarra

いいえ、これは実際にはアプリケーションのアンインストーラーで実行するためのちょっとしたスクリプトです。しかし、私は機能する解決策を見つけ出し、それに対する答えを追加しました。
ジャレッド

4

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

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

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

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


1
うまくいきません。しかし、一方で、この作品:「WMICサービスは|見つける『<サービス名>』
djangofan

@djangofanどのような出力が得られ、どのサービスを使用しますか?別のバージョンを持っているかもしれませんwmic(Windows 7 SP1を使用しています)。
ベンピルブロ

@Ben Pilbrowそれは私にとってもうまくいきませんでした。wmicはパス名を取得していません(次の行に何もない「PathName」を返すだけです)。これは、パスに埋め込まれたパラメーターが非常に長いためであるためかどうかわかりません。
ジャレッド

私のために働いたが、私は少し結果を処理する必要がありました:((wmicサービスSQLBrowser get PathName)-match " "")[0].replace("" "、" ")
-katbyte

wmic serviceよく働く。すべてのサービスとそのパスをリストします。
Shayan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.