de comando do Windows para obter o status do serviço?
-
03-07-2019 - |
Pergunta
Eu preciso saber o status de um serviço no final do meu script em lotes que reinicia serviços usando "thingie net stop" e "thingie net start".
No meu mundo ideal mais favorito, eu gostaria de e-mail do estado para mim mesmo, para ler nas noites frias de Inverno, para me tranquilizar com o calor eo conforto de um servidor que eu sei que está funcionando direito.
Só para você saber, eu estou usando uma plataforma de servidor Windows 2003, e um arquivo de lote parecia ser a melhor escolha. Eu não me importo com qualquer outra coisa, e seria muito aberto a sugestões, mas apenas por uma questão de conhecimento (como um zumbi implora cérebros, eu pensei, por que não inflar meu próprio), existe um comando que me permite verificar sobre o estado de um serviço, na linha de comando?
Eu deveria redirecionar a saída do comando para um arquivo?
Onde diabos estão minhas calças? (Puxa, eu realmente espero que o humor inserido neste não vai insultar ninguém é quarta-feira de manhã, e humor eu preciso muito:. P)
[Edit:] A solução que eu usei é (não) disponível para download a partir --link redigido -
É usado como um conjunto de tarefas a serem executadas durante a noite, e verificar meu e-mail na parte da manhã, eu ver se ou não o serviço corretamente reiniciado.
Solução
Usando o 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
Você pode facilmente filtrar o acima para o serviço específico que você deseja.
Outras dicas
Você já tentou 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
Note-se que dentro de um arquivo de lote que você dobrar cada signo por cento.
Você pode chamar net start "service name"
em seu serviço. Se não for iniciado, ele vai começar a ele e regresso errorlevel = 0, se ele já começou ele vai voltar errorlevel = 2.
olhar também hier:
NET START | ENCONTRAR "Nome do serviço"> nul Se errorlevel 1 ECHO O serviço não está em execução
acabou de copiar a partir de: http://ss64.com/nt/sc.html
Se PowerShell está disponível para você ...
Get-Service -DisplayName *Network* | ForEach-Object{Write-Host $_.Status : $_.Name}
Vamos dar-lhe ...
Stopped : napagent
Stopped : NetDDE
Stopped : NetDDEdsdm
Running : Netman
Running : Nla
Stopped : WMPNetworkSvc
Stopped : xmlprov
Você pode substituir o **** de rede **** com um nome de serviço específico se você só precisa verificar um serviço.
Talvez esta poderia ser a melhor maneira de começar um serviço e verificar o resultado
É claro que de dentro de um lote como FILE.BAT colocar algo como este exemplo, mas apenas substituir "NameOfSercive" com o nome do serviço que você quer e substituir as linhas REM com seu próprio 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
Outra coisa é verificar o seu estado sem alterá-lo, por que não há uma maneira muito mais simples de fazê-lo, basta executar:
net start
Como que, sem parâmetros ele irá mostrar uma lista com todos os serviços que são iniciados ...
Assim, um simples grep ou encontrar depois em uma tubulação caberia ...
É claro que de dentro de um lote como FILE.BAT colocar algo como este exemplo, mas apenas substituir "NameOfSercive" com o nome do serviço que você quer e substituir as linhas REM com seu próprio 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 isso pode ajudar !! É o que eu uso normalmente.
Bem, eu ver "Nick Kavadias" dizendo o seguinte:
"de acordo com esta http://www.computerhope.com/nethlp.htm -lo deve ser NET START / LISTA ... "
Se você digitar no Windows XP isto:
NET START /LIST
Você receberá um erro, basta digitar em vez
NET START
A / LIST é apenas para Windows 2000 ... Se você ler totalmente tais web você veria o / LIST é apenas na secção Windows 2000.
Espero que isso ajude !!!
minha intenção era criar um script que alterna serviços ON e OFF (em 1 de script)
net start NameOfSercive 2>nul if errorlevel 2 goto AlreadyRunning if errorlevel 1 goto Error
...
Ajudou !! Tyvm z666
mas quando por exemplo serviço for desativado (também errorlevel = 2?) ele vai para "AlreadyRuning" e nunca chega a
if errorlevel 1 goto Error ?!!
i queria uma saída para esse caso ...
:AlreadyRunning net stop NameOfSercive if errorlevel 1 goto Error :Error Echo ERROR!!1! Pause
meus 2 centavos, espero que isso ajude
Bem, eu não tenho certeza sobre se você pode enviar e-mail os resultados de que a partir de um arquivo de lote. Se eu puder fazer uma sugestão alternativa que iria resolver o seu VBScript problema. Estou longe de ser grande com o VBScript, mas você pode usá-lo para consultar os serviços em execução na máquina local. O script abaixo lhe enviaremos o status de todos os serviços em execução na máquina o script é executado no. Você obviamente quer substituir o servidor SMTP e o endereço de email. Se você faz parte de um domínio e você executar este script como um usuário privilegiado (eles têm que ser um administrador na máquina remota) você pode consultar máquinas remotas, assim, substituindo localhost com o 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 isso ajude você! Divirta-se!
Edit: Ahh mais uma coisa um status de 4 significa que o serviço está sendo executado um serviço, um status de 1 significa serviço não é. Não estou certo do que 2 ou 3 meios, mas eu estou disposto a apostar que eles estão parando / partida.
de acordo com esta http://www.computerhope.com/nethlp.htm -lo deve ser NET START / LIST mas eu não posso obtê-lo para trabalhar em pela caixa XP. Eu tenho certeza que há alguns WMI que lhe dará a lista.
Ros o código i postar também é para saber quantos serviços estão sendo executados ...
Imagine que você quer saber quantos serviços são como a Oracle * então você coloca a Oracle em vez de NameOfSercive ... e você terá o número de serviços como Oracle * correndo na variável% CountLines% e se você quiser fazer algo se há apenas 4 você pode fazer algo como isto:
SE 4 ==% CountLines% GOTO FourServicesAreRunning
Isso é muito mais poderoso ... e seu código não permite saber se o serviço desejado está sendo executado ... se houver outra partida srecive com mesmo nome ... imagine: -ServiceOne -ServiceOnePersonal
Se você procurar ServiceOne, mas é só correr ServiceOnePersonal seu código irá dizer ServiceOne está funcionando ...
Meu código pode ser easly mudou, já que ele lê todas as linhas do arquivo e linha de leitura por linha também pode fazer o que quiser para cada serviço ... veja isto:
@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
É claro que ele só lista de execução serviços, eu não sei alguma forma líquida pode listar não executar serviços ...
Espero que isso ajude !!!