Як я можу отримати шлях до служби Windows, виконуваної БЕЗ використання sc qc?


15

Мені потрібно запитати службу Windows щодо шляху до її виконання через командний рядок. Я думаю, що я це зробив би так: sc qc myServiceNameале коли я це роблю, я отримую таку помилку:

[SC] QueryServiceConfig FAILED 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


На жаль, я не можу залежати від powershell, оскільки XP не має його за замовчуванням. Мені потрібна підтримка XP, Server 2008 та 7, і все це не встановлюючи додаткового програмного забезпечення.
Джаред

@Jred це дуже погано. Вам не вдається запустити це з однієї машини на купі віддалених машин?
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 service | find" <servicename> "
djangofan

@djangofan, який вихід ви отримуєте та за допомогою якого обслуговування? Можливо, у вас інша версія wmic(я в Windows 7 SP1)?
Бен Пілбров

@Ben Pilbrow Це теж не працювало для мене. wmic не отримує ім'я контуру (просто повертає "PathName" без нічого в наступному рядку). Не впевнений, чи це так, тому що в шляху вбудовано багато параметрів, що робить його дуже довгим.
Джаред

працював на мене, але мені довелося трохи обробити результат: ((wmic сервіс SQLBrowser отримати PathName) -match " "")[0].replace("" "," ")
katbyte

wmic serviceпрацює чудово. Перераховує всі служби зі своїми шляхами.
Шаян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.