Мне нужно запросить у службы 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)