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

15

Necesito consultar a un servicio de Windows la ruta a su ejecutable a través del símbolo del sistema. Creo que la forma en que haría esto es: sc qc myServiceNamepero cuando hago eso, aparece el siguiente error:

[SC] QueryServiceConfig FALLÓ 122:

El área de datos pasada a una llamada del 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 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), bombardea y me da este feo mensaje de error. Gracias Micro $ oft.

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

Jared
fuente

Respuestas:

20

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

sc qc <service name> 5000

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


Consulte también la página SC QC MSDN:

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

dónde:

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

Ken Keenan
fuente
2
FYI, 2^13 = 8192es el valor máximo para el tamaño del búfer.
nebffa
sc queryex type= service state= all | find /i "myServiceNameenumera todos los servicios pero desafortunadamente no hay ruta.
Shayan
13

Encontré una solución viable:

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

Por supuesto, esto necesita algún análisis, pero me da la ruta completa que proporciona el cuadro de diálogo services.msc.

Jared
fuente
10

Puede 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 dará 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 para winrmdebería salirC:\Windows\System32\svchost.exe -k NetworkService

MDMarra
fuente
Desafortunadamente, no puedo depender de powershell ya que XP no lo tiene por defecto. Necesito soporte para XP, servidor 2008 y 7, todo sin instalar ningún software adicional.
Jared
@ Jared eso es muy malo. ¿No puede ejecutar esto desde una sola máquina contra un montón de máquinas remotas?
MDMarra
No, esto es realmente un poco de script para ir en el desinstalador de una aplicación. Sin embargo, descubrí una solución que funciona y agregué una respuesta.
Jared
4

Pruébelo con la wmicutilidad de línea de comandos. Aquí hay un ejemplo de un servicio en mi máquina llamado CrashPlanService.

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

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

Básicamente, wmic service <<YourService>> get PathName.

Ben Pilbrow
fuente
1
No funciona del todo. Pero, por otro lado, esto funciona: "wmic service | find" <servicename> "
djangofan
@djangofan, ¿qué resultado obtienes y con qué servicio? ¿Quizás tenga una versión diferente de wmic(Estoy en Windows 7 SP1)?
Ben Pilbrow
@Ben Pilbrow Eso tampoco funcionó para mí. wmic no obtiene el nombre de la ruta (solo devuelve "PathName" sin nada en la línea siguiente). No estoy seguro si esto se debe a que hay muchos parámetros incrustados en la ruta que la hacen muy larga.
Jared
funcionó para mí, pero tuve que procesar el resultado un poco: ((wmic service SQLBrowser get PathName) -match " "")[0].replace("" "," ")
katbyte
wmic serviceFunciona genial. Enumera todos los servicios con sus rutas.
Shayan