¿Cómo extraigo una lista de servicios y con qué cuenta se ejecutan?

13

El énfasis de esta pregunta está en la segunda mitad.

Sé cómo extraer una lista de todos los servicios y cómo filtrar en su estado. Sin embargo, lo que no estoy seguro de cómo hacer es extraer la cuenta de usuario que el servicio está configurado para "ejecutar como".

No tengo la opción de usar PowerShell (desafortunadamente), así que estoy buscando una forma CMD nativa. Asumí que habría una manera de usar el comando sc query pero todo lo que aparece en la lista es:

SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT

FYI: el sistema operativo es Windows 2003 SP2 y necesito esta información para todos los servicios, por lo que es un proceso largo si tengo que hacerlo manualmente para cada uno de ellos.

Petay87
fuente

Respuestas:

20

wmic:
nombre y cuenta de todos los servicios:
wmic service get name,startname

solo servicios iniciados:
wmic service where started=true get name, startname

servicios con un patrón específico en el nombre:
wmic service where 'name like "%sql%"' get name, startname

bien formateado como tabla html (y luego abierto en su navegador):
(wmic service where 'name like "%sql%"' get name, startname /format:htable >out.html) && out.html

Sintaxis completa aquí: https://msdn.microsoft.com/en-us/library/aa394531%28v=vs.85%29.aspx

wmz
fuente
¿Cuál es la diferencia entre sc queryy wmic?
Pacerier
1
@Pacerier Diferencia en cuanto a qué? Son solo herramientas diferentes (línea cmd) que le permiten consultar / interactuar con los servicios; sc es solo para este propósito, mientras que wmic es más general (ya que permite consultar varias partes del sistema). wmic también es más fácil de usar para este problema en particular (solo una consulta)
wmz
5

Puede lograr esto en dos pasos:

  1. Obtenga la lista de servicios:sc \\localhost query | findstr SERVICE_NAME
  2. Su pieza faltante: sc \\localhost qc+ SERVICE_NAME +| findstr SERVICE_START_NAME

Recomendaría un script por lotes como este:

@echo off
setlocal EnableDelayedExpansion
sc \\localhost query | findstr SERVICE_NAME > services.lst
for /f "tokens=1,2" %%A in (services.lst) do (
    echo %%B
    sc \\localhost qc %%B | findstr SERVICE_START_NAME
)
del services.lst

Eso te da una salida como esta: ingrese la descripción de la imagen aquí

Por supuesto, puede limpiar aún más esa salida o escribir en un archivo CSV de la manera que desee.

armani
fuente
1

CMD no tiene una forma nativa de hacerlo. SC y NET son aplicaciones integradas que vienen con Windows pero eso no significa que sean nativas. En cualquier momento, un administrador puede eliminarlos e incluso CMD queda en la oscuridad.

sc sdshow es lo que obtendrá descriptores de seguridad, pero esto complicará las cosas si no sabe cómo leer las cadenas SDDL.

La forma más simple es obtener Sysinternals PsService.exe del paquete de Herramientas y usarlo como psservice security [service]. Enumerará el SDDL en formato legible, incluidos los nombres de cuenta.

JasonXA
fuente
¿Qué quieres decir con "no hay forma nativa de hacerlo"? ¿No está disponible C:\Windows\System32\sc.exepara todas las versiones de Windows?
Pacerier
Lea de nuevo. Incorporado significa no extraíble como CMD. Si un administrador deshabilita PowerShell, también puede deshabilitar sc y net. La forma más sencilla es utilizar una aplicación portátil que haga todo de forma predeterminada y no esté vinculada al sistema operativo.
JasonXA
1

Aunque no puede usar PowerShell, debería poder usar VBScript para extraer la información de WMI:

Aquí hay un script de VBS que enumerará todos los servicios y la cuenta en la que comienzan:

strComputer = "."

Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServices = objWMIService.ExecQuery ("Select * from Win32_Service")

For Each objService in colServices 
    wscript.echo objService.Name & ": " & objService.StartName
Next

Guárdelo y luego ejecútelo con cscript ScriptName.vbs.

objService.State le daría el estado actual del servicio (ya que mencionó que está buscando filtrar por él).

Más información sobre la clase Win32_Service .

Ƭᴇcʜιᴇ007
fuente