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

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

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

Связанный контент