Làm cách nào tôi có thể nhận được đường dẫn đến một dịch vụ Windows thực thi mà KHÔNG sử dụng sc qc?


15

Tôi cần truy vấn một dịch vụ windows cho đường dẫn đến nó có thể thực thi được thông qua dấu nhắc lệnh. Tôi nghĩ rằng cách tôi sẽ làm điều này là: sc qc myServiceNamenhưng khi tôi làm điều đó, tôi nhận được lỗi sau:

[SC] QueryServiceConfig FAILED 122:

Vùng dữ liệu được truyền cho một cuộc gọi hệ thống quá nhỏ.

[SC] GetServiceConfig cần 1094 byte

Tôi nghĩ điều này có nghĩa là lệnh sc đang gửi cấu trúc dữ liệu đến một số thư viện khác quá nhỏ so với dữ liệu cần phải trả về. Thay vì SC thử lại một cách độc đáo với cấu trúc dữ liệu lớn hơn (1094 byte), nó đánh bom và đưa cho tôi thông báo lỗi xấu xí này. Cảm ơn Micro $ oft.

Vì vậy, có cách nào để khắc phục lỗi này? Tôi chỉ cần đường dẫn đến tệp thực thi, nhưng sẽ phân tích nó ra khỏi một số văn bản khác nếu cần.

Câu trả lời:


20

Tôi cũng gặp phải vấn đề này khi cố gắng lấy thông tin chi tiết về dịch vụ trong đó đường dẫn đến tệp thực thi rất dài. Thảo luận này có một cách giải quyết; bạn có thể truyền kích thước bộ đệm làm đối số sc qc. Đó là, nếu bạn làm:

sc qc <service name> 5000

lỗi "vùng dữ liệu được truyền cho một cuộc gọi hệ thống quá nhỏ" sẽ biến mất.


Xem thêm trang SC QC MSDN:

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

Ở đâu:

<BufferSize> Chỉ định kích thước (tính bằng byte) của bộ đệm. Kích thước bộ đệm mặc định là 1.024 byte.


2
FYI, 2^13 = 8192là giá trị tối đa cho kích thước bộ đệm.
nebffa

sc queryex type= service state= all | find /i "myServiceNameliệt kê tất cả các dịch vụ nhưng tiếc là không có đường dẫn.
Shaya

13

Tôi tìm thấy một giải pháp khả thi:

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

Tất nhiên điều này cần một số phân tích cú pháp, nhưng nó cung cấp cho tôi đường dẫn đầy đủ mà hộp thoại services.msc cung cấp.


10

Bạn có thể làm điều này trong PowerShell với truy vấn WMI như thế này:

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

Điều này sẽ cung cấp cho bạn đường dẫn đầy đủ, bao gồm các tùy chọn như chúng được hiển thị trong services.msc. Chỉ cần thay thế winrmtrong ví dụ của tôi bằng bất kỳ dịch vụ nào bạn muốn tìm kiếm.

Các truy vấn trên cho winrmđầu ra nênC:\Windows\System32\svchost.exe -k NetworkService


Thật không may, tôi không thể phụ thuộc vào powershell vì XP không có mặc định. Tôi cần hỗ trợ cho XP, máy chủ 2008 và 7, tất cả mà không cần cài đặt bất kỳ phần mềm bổ sung nào.
Jared

@Jared đó là quá xấu. Bạn không thể chạy cái này từ một máy duy nhất chống lại một loạt các máy từ xa?
MDMarra

Không, đây thực sự là một chút kịch bản trong trình gỡ cài đặt cho một ứng dụng. Tôi đã tìm ra một giải pháp hoạt động và thêm một câu trả lời cho nó mặc dù.
Jared

4

Hãy thử nó bằng cách sử dụng wmictiện ích dòng lệnh. Đây là một ví dụ về một dịch vụ trên máy của tôi được gọi CrashPlanService.

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

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

Về cơ bản , wmic service <<YourService>> get PathName.


1
Không hoạt động tốt. Tuy nhiên, mặt khác, điều này hoạt động: "dịch vụ wmic | tìm" <tên dịch vụ> "
djangofan

@djangofan bạn nhận được đầu ra nào, và với dịch vụ nào? Có lẽ bạn đã có một phiên bản khác wmic(Tôi đang dùng Windows 7 SP1)?
Ben Pilbrow

@Ben Pilbrow Điều đó cũng không hiệu quả với tôi. wmic không nhận được tên đường dẫn (chỉ trả về "PathName" không có gì ở dòng sau). Không chắc chắn nếu điều này là do có rất nhiều tham số được nhúng trong đường dẫn làm cho nó rất dài.
Jared

làm việc cho tôi nhưng tôi phải xử lý kết quả một chút: ((dịch vụ SQLBrowser lấy PathName) -match " "")[0].replace("" "," ")
katbyte

wmic servicelàm việc tuyệt vời Liệt kê tất cả các dịch vụ với đường dẫn của chúng.
Shaya
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.