Bagaimana saya bisa mendapatkan jalur ke layanan Windows yang dapat dieksekusi TANPA menggunakan sc qc?

15

Saya perlu menanyakan layanan windows agar jalurnya dapat dieksekusi melalui command prompt. Saya pikir cara saya akan melakukan ini adalah:, sc qc myServiceNametetapi ketika saya melakukan itu, saya mendapatkan kesalahan berikut:

[SC] QueryServiceConfig GAGAL 122:

Area data yang diteruskan ke panggilan sistem terlalu kecil.

[SC] GetServiceConfig membutuhkan 1094 byte

Saya pikir ini berarti bahwa perintah sc mengirim struktur data ke beberapa perpustakaan lain yang terlalu kecil untuk data yang perlu dikembalikan. Alih-alih SC mencoba ulang dengan baik dengan struktur data yang lebih besar (1094 bytes) itu meledak dan memberi saya pesan kesalahan yang jelek ini. Terima kasih, Micro $ oft.

Jadi apakah ada cara untuk mengatasi kesalahan ini? Saya hanya perlu path ke executable, tetapi akan menguraikannya dari beberapa teks lain jika diperlukan.

Jared
sumber

Jawaban:

20

Saya mengalami masalah ini juga ketika mencoba untuk mendapatkan detail dari layanan di mana jalan ke executable sangat panjang. Diskusi ini berisi solusi; Anda bisa meneruskan ukuran buffer sebagai argumen sc qc. Yaitu, jika Anda melakukannya:

sc qc <service name> 5000

kesalahan "area data yang diteruskan ke panggilan sistem terlalu kecil" hilang.


Juga lihat halaman SC QC MSDN:

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

dimana:

<BufferSize> Menentukan ukuran (dalam byte) buffer. Ukuran buffer default adalah 1.024 byte.

Ken Keenan
sumber
2
FYI, 2^13 = 8192adalah nilai maksimum untuk ukuran buffer.
nebffa
sc queryex type= service state= all | find /i "myServiceNamedaftar semua layanan tetapi sayangnya tidak ada jalur.
Shayan
13

Saya menemukan solusi yang bisa diterapkan:

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

Tentu saja ini membutuhkan beberapa penguraian, tetapi itu memberi saya path lengkap yang disediakan oleh kotak dialog services.msc.

Jared
sumber
10

Anda dapat melakukan ini di PowerShell dengan kueri WMI seperti ini:

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

Ini akan memberi Anda path lengkap, termasuk opsi seperti yang ditunjukkan di services.msc. Ganti saja winrmdalam contoh saya dengan layanan apa pun yang ingin Anda cari.

Permintaan di atas untuk winrmoutput harusC:\Windows\System32\svchost.exe -k NetworkService

MDMarra
sumber
Sayangnya, saya tidak dapat bergantung pada PowerShell karena XP tidak memilikinya secara default. Saya memerlukan dukungan untuk XP, server 2008, dan 7, semuanya tanpa menginstal perangkat lunak tambahan.
Jared
@ Jared itu terlalu buruk. Anda tidak dapat menjalankan ini dari satu mesin terhadap banyak mesin jarak jauh?
MDMarra
Tidak, ini sebenarnya sedikit skrip untuk dihapus di uninstaller untuk suatu aplikasi. Saya menemukan solusi yang berhasil dan menambahkan jawaban untuk itu.
Jared
4

Cobalah menggunakan wmicutilitas baris perintah. Berikut ini contoh layanan pada mesin saya yang disebut CrashPlanService.

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

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

Pada dasarnya wmic service <<YourService>> get PathName,.

Ben Pilbrow
sumber
1
Tidak cukup berhasil. Tetapi, di sisi lain, ini berfungsi: "layanan wmic | find" <servicename> "
djangofan
@ Djangofan output apa yang Anda dapatkan, dan dengan layanan yang mana? Mungkin Anda punya versi berbeda wmic(Saya menggunakan Windows 7 SP1)?
Ben Pilbrow
@ Ben Pilbrow Itu juga tidak berhasil bagi saya. wmic tidak mendapatkan nama path (hanya mengembalikan "PathName" dengan tidak ada pada baris berikut). Tidak yakin apakah ini karena ada banyak parameter yang tertanam di jalur sehingga sangat panjang.
Jared
bekerja untuk saya tetapi saya harus memproses hasilnya sedikit: ((layanan wmic SQLBrowser mendapatkan PathName) -match " "")[0].replace("" "," ")
katbyte
wmic servicebekerja dengan baik. Daftar semua layanan dengan jalurnya.
Shayan