El énfasis de esta pregunta está en la segunda mitad.
Sé cómo extraer una lista de todos los servicios y cómo filtrar según su estado. Sin embargo, lo que no estoy seguro de cómo hacer es extraer la cuenta de usuario en la que el servicio está configurado para "ejecutarse".
No tengo la opción de usar PowerShell (desafortunadamente), así que estoy buscando una forma CMD nativa. Supuse que habría una manera de usar el comando sc query pero todo lo que aparece es:
SERVICE_NAME
TYPE
STATE
WIN32_EXIT_CODE
SERVICE_EXIT_CODE
CHECKPOINT
WAIT_HINT
Para su información: 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.
Respuesta1
wmic:
Nombre y cuenta para todos los servicios:
wmic service get name,startname
servicios iniciados solamente:
wmic service where started=true get name, startname
servicios con patrón específico en el nombre:
wmic service where 'name like "%sql%"' get name, startname
muy 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
Respuesta2
Puedes lograr esto en dos pasos:
- Obtenga la lista de servicios:
sc \\localhost query | findstr SERVICE_NAME
- La pieza que te falta:
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 un resultado como este:
Por supuesto, puede limpiar aún más esa salida o escribir en un archivo CSV de la forma que desee.
Respuesta3
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 y luego incluso CMD queda en la oscuridad.
sc sdshow es lo que le proporcionará descriptores de seguridad, pero esto complicará las cosas si no sabe cómo leer cadenas SDDL.
La forma más sencilla es obtener Sysinternals PsService.exe del paquete de herramientas y utilizarlo como [servicio] de seguridad psservice. Enumerará el SDDL en formato legible, incluidos los nombres de las cuentas.
Respuesta4
Aunque no puedes usar PowerShell, aún deberías poder usar VBScript para extraer la información de WMI:
Aquí hay un script VBS que enumerará todos los servicios y la cuenta con 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 elClase Win32_Service.