Мне нужно запросить службу Windows на путь к ее исполняемому файлу через командную строку. Я думаю, что способ, которым ябысделать это: sc qc myServiceName
, но когда я это делаю, я получаю следующую ошибку:
[SC] Ошибка QueryServiceConfig 122:
Область данных, переданная системному вызову, слишком мала.
[SC] GetServiceConfig требует 1094 байта
Я думаю, это означает, что команда sc отправляет структуру данных в какую-то другую библиотеку, которая слишком мала для данных, которые нужно вернуть. Вместо того, чтобы SC вежливо повторить попытку с большей структурой данных (1094 байта), она вылетает и выдает мне это ужасное сообщение об ошибке. Спасибо Micro$oft.
Так есть ли способ обойти эту ошибку? Мне просто нужен путь к исполняемому файлу, но я извлеку его из другого текста, если понадобится.
решение1
Я тоже столкнулся с этой проблемой, когда пытался получить сведения о службе, путь к исполняемому файлу которой был очень длинным.Это обсуждениесодержит обходной путь; вы можете передать размер буфера в качестве аргумента sc qc
. То есть, если вы сделаете:
sc qc <service name> 5000
ошибка «область данных, переданная системному вызову, слишком мала» исчезает.
Также смSC ККСтраница MSDN:
sc [<ServerName>] qc [<ServiceName>] [<BufferSize>]
где:
<BufferSize> Указывает размер (в байтах) буфера. Размер буфера по умолчанию составляет 1024 байта.
решение2
Я нашел работающее решение:
reg query "HKLM\System\CurrentControlSet\Services\<serviceName>" /v "ImagePath"
Конечно, это требует некоторого анализа, но это дает мне полный путь, который указывает диалоговое окно services.msc.
решение3
Это можно сделать в 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
решение4
Начиная с PowerShell 7:
(Get-Service theServiceName).BinaryPathName