¿Cómo puedo obtener la ruta a un ejecutable de servicio de Windows SIN usar sc qc?

¿Cómo puedo obtener la ruta a un ejecutable de servicio de Windows SIN usar sc qc?

Necesito consultar un servicio de Windows para conocer la ruta a su ejecutable a través del símbolo del sistema. Pienso de la manera que yoharíahacer esto es: sc qc myServiceName, pero cuando lo hago, aparece el siguiente error:

[SC] QueryServiceConfig FALLÓ 122:

El área de datos pasada a una llamada al sistema es demasiado pequeña.

[SC] GetServiceConfig necesita 1094 bytes

Creo que esto significa que el comando sc está enviando una estructura de datos a alguna otra biblioteca que es demasiado pequeña para los datos que deben devolverse. En lugar de que SC vuelva a intentarlo con una estructura de datos más grande (1094 bytes), falla y me da este feo mensaje de error. Gracias Micro$oft.

Entonces, ¿hay alguna forma de solucionar este error? Solo necesito la ruta al ejecutable, pero la analizaré a partir de otro texto si es necesario.

Respuesta1

También encontré este problema al intentar obtener los detalles de un servicio donde la ruta al ejecutable era muy larga.Esta discusióncontiene una solución alternativa; puede pasar un tamaño de búfer como argumento a sc qc. Es decir, si lo haces:

sc qc <service name> 5000

El error "el área de datos pasada a una llamada al sistema es demasiado pequeña" desaparece.


Ver tambiéncontrol de calidad del SCPágina de MSDN:

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

dónde:

<BufferSize> Especifica el tamaño (en bytes) del búfer. El tamaño de búfer predeterminado es 1024 bytes.

Respuesta2

Encontré una solución viable:

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

Por supuesto, esto necesita un poco de análisis, pero me proporciona la ruta completa que proporciona el cuadro de diálogo services.msc.

Respuesta3

Puedes hacer esto en PowerShell con una consulta WMI como esta:

$service = get-wmiobject -query 'select * from win32_service where name="winrm"'; echo $service.pathname

Esto le proporcionará la ruta completa, incluidas las opciones que se muestran en services.msc. Simplemente reemplace winrmen mi ejemplo con cualquier servicio que desee buscar.

La consulta anterior winrmdebería generarC:\Windows\System32\svchost.exe -k NetworkService

Respuesta4

A partir de PowerShell 7:

(Get-Service theServiceName).BinaryPathName

información relacionada