Comando de Windows para obtener el estado del servicio?
-
03-07-2019 - |
Pregunta
Necesito saber el estado de un servicio al final de mi script por lotes que reinicia los servicios usando " net stop thingie " y " net start thingie " ;.
En mi mundo ideal favorito, me gustaría enviarme un correo electrónico al estado, leer en las noches frías de invierno, para tranquilizarme con la calidez y la comodidad de un servidor que sé que funciona correctamente.
Para que lo sepa, estoy usando una plataforma Windows Server 2003, y un archivo por lotes parece ser la mejor opción. No me importa usar otra cosa, y sería muy abierto a sugerencias, pero solo por el bien del conocimiento (como un zombi anhela cerebros, pensé, ¿por qué no inflar el mío), hay un comando que me permite verificar? ¿En el estado de un servicio, en la línea de comando?
¿Debo simplemente redirigir la salida del comando a un archivo?
¿Dónde diablos están mis pantalones? (Dios mío, realmente espero que el humor insertado en esto no insulte a nadie. Es miércoles por la mañana, y también necesito el humor: P)
[Editar:] La solución que usé está (ya no) disponible para descargar desde --link redacted--
Se utiliza como un conjunto de tareas que se ejecutará durante la noche, y al revisar mi correo electrónico por la mañana, veo si el servicio se ha reiniciado correctamente o no.
Solución
Usando Windows Script:
Set ComputerObj = GetObject("WinNT://MYCOMPUTER")
ComputerObj.Filter = Array("Service")
For Each Service in ComputerObj
WScript.Echo "Service display name = " & Service.DisplayName
WScript.Echo "Service account name = " & Service.ServiceAccountName
WScript.Echo "Service executable = " & Service.Path
WScript.Echo "Current status = " & Service.Status
Next
Puede filtrar fácilmente lo anterior para el servicio específico que desea.
Otros consejos
¿Has probado sc.exe
?
C:\> for /f "tokens=2*" %a in ('sc query audiosrv ^| findstr STATE') do echo %b
4 RUNNING
C:\> for /f "tokens=2*" %a in ('sc query sharedaccess ^| findstr STATE') do echo %b
1 STOPPED
Tenga en cuenta que dentro de un archivo por lotes duplicaría cada signo de porcentaje.
Puede llamar a net start " nombre del servicio "
en su servicio. Si no está iniciado, lo iniciará y devolverá errorlevel = 0, si ya está iniciado, devolverá errorlevel = 2.
mira también hier:
INICIO NETO | ENCONTRAR " Nombre del servicio " > nula IF errorlevel 1 ECHO El servicio no se está ejecutando
acaba de copiar de: http://ss64.com/nt/sc.html
Si PowerShell está disponible para usted ...
Get-Service -DisplayName *Network* | ForEach-Object{Write-Host Si PowerShell está disponible para usted ...
Stopped : napagent
Stopped : NetDDE
Stopped : NetDDEdsdm
Running : Netman
Running : Nla
Stopped : WMPNetworkSvc
Stopped : xmlprov
Te dará ...
<*>
Puede reemplazar la **** Network **** con un nombre de servicio específico si solo necesita marcar un servicio.
.Status : Si PowerShell está disponible para usted ...
<*>
Te dará ...
<*>
Puede reemplazar la **** Network **** con un nombre de servicio específico si solo necesita marcar un servicio.
.Name}
Te dará ...
<*>Puede reemplazar la **** Network **** con un nombre de servicio específico si solo necesita marcar un servicio.
Tal vez esta podría ser la mejor manera de iniciar un servicio y verificar el resultado
Por supuesto, desde dentro de un Lote como File.BAT pone algo como este ejemplo, pero simplemente reemplaza " NameOfSercive " con el nombre de servicio que desee y reemplace las líneas REM con su propio código:
@ECHO OFF
REM Put whatever your Batch may do before trying to start the service
net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error
REM Put Whatever you want in case Service was not running and start correctly
GOTO ContinueWithBatch
:AlreadyRunning
REM Put Whatever you want in case Service was already running
GOTO ContinueWithBatch
:Error
REM Put Whatever you want in case Service fail to start
GOTO ContinueWithBatch
:ContinueWithBatch
REM Put whatever else your Batch may do
Otra cosa es verificar su estado sin cambiarlo, para eso hay una manera mucho más simple de hacerlo, simplemente ejecuta:
net start
Por lo tanto, sin parámetros mostrará una lista con todos los servicios que se inician ...
Entonces, un simple grep o encontrarlo después en una tubería podría caber ...
Por supuesto, desde dentro de un Lote como File.BAT pone algo como este ejemplo, pero simplemente reemplaza " NameOfSercive " con el nombre de servicio que desee y reemplace las líneas REM con su propio código:
@ECHO OFF
REM Put here any code to be run before check for Service
SET TemporalFile=TemporalFile.TXT
NET START | FIND /N "NameOfSercive" > %TemporalFile%
SET CountLines=0
FOR /F %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
IF 0==%CountLines% GOTO ServiceIsNotRunning
REM Put here any code to be run if Service Is Running
GOTO ContinueWithBatch
:ServiceIsNotRunning
REM Put here any code to be run if Service Is Not Running
GOTO ContinueWithBatch
:ContinueWithBatch
DEL -P %TemporalFile% 2>nul
SET TemporalFile=
REM Put here any code to be run after check for Service
Espero que esto pueda ayudar !! Es lo que normalmente uso.
Bueno, veo "Nick Kavadias " diciendo esto:
" de acuerdo con este http://www.computerhope.com/nethlp.htm debería ser NET START / LIST ... "
Si escribe en Windows XP esto:
NET START /LIST
obtendrá un error, simplemente escriba en su lugar
NET START
La / LIST es solo para Windows 2000 ... Si lees completamente la web, verías que / LIST solo está en la sección de Windows 2000.
Espero que esto ayude !!!
mi intención era crear un script que activara y desactivara los servicios (en 1 script)
net start NameOfSercive 2>nul if errorlevel 2 goto AlreadyRunning if errorlevel 1 goto Error
...
¡¡Ayudé mucho !! TYVM z666
pero cuando, por ejemplo, el servicio está deshabilitado (también errorlevel = 2?) va a " AlreadyRuning " y nunca llega a
if errorlevel 1 goto Error ?!!
Quería una salida para ese caso ...
:AlreadyRunning net stop NameOfSercive if errorlevel 1 goto Error :Error Echo ERROR!!1! Pause
mis 2 centavos, espero que esto ayude
Bueno, no estoy seguro de si puede enviar por correo electrónico los resultados de un archivo por lotes. Si puedo hacer una sugerencia alternativa que resolvería su problema vbscript. No estoy muy bien con vbscript pero puede usarlo para consultar los servicios que se ejecutan en la máquina local. La siguiente secuencia de comandos le enviará por correo electrónico el estado de todos los servicios que se ejecutan en la máquina en la que se ejecuta la secuencia de comandos. Obviamente, querrá reemplazar el servidor smtp y la dirección de correo electrónico. Si forma parte de un dominio y ejecuta este script como un usuario privilegiado (deben ser un administrador en la máquina remota), también puede consultar máquinas remotas reemplazando localhost con el fqdn.
Dim objComputer, objMessage
Dim strEmail
' If there is an error getting the status of a service it will attempt to move on to the next one
On Error Resume Next
' Email Setup
Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = "Service Status Report"
objMessage.From = "service_report@noreply.net"
objMessage.To = "youraddress@example.net"
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
'Name or IP of Remote SMTP Server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.example.net"
'Server port (typically 25)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
Set objComputer = GetObject("WinNT://localhost")
objComputer.Filter = Array("Service")
For Each aService In objComputer
strEmail = strEmail &chr(10) & aService.Name & "=" & aService.Status
Next
objMessage.TextBody = strEmail
objMessage.Configuration.Fields.Update
objMessage.Send
Espero que esto te ayude! ¡Disfruta!
Editar: Ahh, una cosa más: un estado de servicio de 4 significa que el servicio se está ejecutando, un estado de servicio de 1 significa que no lo está. No estoy seguro de lo que significa 2 o 3, pero estoy dispuesto a apostar que se están deteniendo / empezando.
de acuerdo con este http://www.computerhope.com/nethlp.htm Debería ser NET START / LIST pero no puedo hacer que funcione en el cuadro XP. Estoy seguro de que hay algunos WMI que te darán la lista.
Ros el código que publico también es para saber cuántos servicios se están ejecutando ...
Imagine que quiere saber cuántos servicios son como Oracle *, luego coloca Oracle en lugar de NameOfSercive ... y obtiene la cantidad de servicios como Oracle * ejecutándose en la variable% CountLines% y si desea hacer algo si solo hay 4 que puedes hacer algo como esto:
IF 4 ==% CountLines% GOTO FourServicesAreRunning
Eso es mucho más potente ... y su código no le permite saber si el servicio deseado se está ejecutando ... si hay otro elemento que comienza con el mismo nombre ... imagine: -Servicio a uno -ServiceOnePersonal
Si busca ServiceOne, pero solo ejecuta ServiceOnePersonal, su código le dirá que ServiceOne se está ejecutando ...
Mi código se puede cambiar fácilmente, ya que lee todas las líneas del archivo y lee línea por línea, también puede hacer lo que quiera con cada servicio ... vea esto:
@ECHO OFF
REM Put here any code to be run before check for Services
SET TemporalFile=TemporalFile.TXT
NET START > %TemporalFile%
SET CountLines=0
FOR /F "delims=" %%X IN (%TemporalFile%) DO SET /A CountLines=1+CountLines
SETLOCAL EnableDelayedExpansion
SET CountLine=0
FOR /F "delims=" %%X IN (%TemporalFile%) DO @(
SET /A CountLine=1+CountLine
REM Do whatever you want to each line here, remember first and last are special not service names
IF 1==!CountLine! (
REM Do whatever you want with special first line, not a service.
) ELSE IF %CountLines%==!CountLine! (
REM Do whatever you want with special last line, not a service.
) ELSE (
REM Do whatever you want with rest lines, for each service.
REM For example echo its position number and name:
echo !CountLine! - %%X
REM Or filter by exact name (do not forget to not remove the three spaces at begining):
IF " NameOfService"=="%%X" (
REM Do whatever you want with Service filtered.
)
)
REM Do whatever more you want to all lines here, remember two first are special as last one
)
DEL -P %TemporalFile% 2>nul
SET TemporalFile=
REM Put here any code to be run after check for Services
Por supuesto, solo enumera los servicios en ejecución, no sé de qué manera net puede enumerar los servicios que no se ejecutan ...
Espero que esto ayude !!!