Назад | Перейти на главную страницу

Как я могу получить путь к исполняемому файлу службы Windows БЕЗ использования sc qc?

Мне нужно запросить у службы Windows путь к исполняемому файлу через командную строку. Я думаю, как я бы сделать это:sc qc myServiceName, но когда я это сделаю, я получаю следующую ошибку:

[SC] QueryServiceConfig НЕ ВЫПОЛНЕН 122:

Область данных, переданная системному вызову, слишком мала.

[SC] GetServiceConfig требуется 1094 байта.

Я думаю, это означает, что команда sc отправляет структуру данных в какую-то другую библиотеку, которая слишком мала для данных, которые необходимо вернуть. Вместо того, чтобы аккуратно повторить попытку SC с большей структурой данных (1094 байта), он выйдет из строя и выдает мне это уродливое сообщение об ошибке. Спасибо, Micro $ oft.

Так есть ли способ обойти эту ошибку? Мне просто нужен путь к исполняемому файлу, но при необходимости я выделю его из другого текста.

Я тоже столкнулся с этой проблемой, когда пытался получить подробную информацию о службе, где путь к исполняемому файлу был очень длинным. Это обсуждение содержит обходной путь; вы можете передать размер буфера в качестве аргумента для sc qc. То есть, если вы это сделаете:

sc qc <service name> 5000

ошибка «область данных, переданная системному вызову, слишком мала» исчезнет.


Также см SC QC Страница MSDN:

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

где:

<BufferSize> Определяет размер (в байтах) буфера. Размер буфера по умолчанию составляет 1024 байта.

Я нашел работоспособное решение:

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

Конечно, это требует некоторого анализа, но он дает мне полный путь, который предоставляет диалоговое окно services.msc.

Вы можете сделать это в 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

Попробуйте с помощью wmic утилита командной строки. Вот пример службы на моей машине под названием CrashPlanService.

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

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

В принципе, wmic service <<YourService>> get PathName.

$binpath = (Get-ItemProperty -Path HKLM:SYSTEM\CurrentControlSet\Services\<serviceName>).ImagePath
$binpath = ($binpath).Substring(1,($binpath).IndexOf("<serviceBinFileName>")-1)