it-swarm.com.de

Windows-Befehl zum Abrufen des Dienststatus?

Ich muss den Status eines Dienstes am Ende meines Batch-Skripts kennen, das Dienste mit "net stop thingie" und "net start thingie" neu startet.

In meiner liebsten idealen Welt möchte ich den Staat per E-Mail an mich senden, in kalten Winternächten lesen und mich mit der Wärme und dem Komfort eines Servers beruhigen, von dem ich weiß, dass er richtig läuft.

Nur um zu wissen, ich verwende eine Windows Server 2003-Plattform, und eine Batch-Datei schien die beste Wahl zu sein. Ich habe nichts dagegen, etwas anderes zu verwenden, und wäre sehr offen für Vorschläge, aber nur aus Wissensgründen (da ein Zombie Gehirne verlangt, dachte ich, warum nicht meine eigenen aufblähen), gibt es einen Befehl, mit dem ich überprüfen kann über den Status eines Dienstes in der Befehlszeile?

Soll ich die Ausgabe des Befehls einfach in eine Datei umleiten?

Wo zum Teufel sind meine Hosen? (Meine Güte, ich hoffe wirklich, dass der eingesetzte Humor niemanden beleidigt. Es ist Mittwochmorgen und Humor, den ich auch brauche: P)

[Bearbeiten:] Die Lösung, die ich verwendet habe, steht (nicht mehr) zum Download zur Verfügung unter --link redacted--

Es wird als Task-Set verwendet, das während der Nacht ausgeführt werden soll. Wenn ich morgens meine E-Mail abriege, sehe ich, ob der Dienst ordnungsgemäß neu gestartet wurde.

21

Windows Script verwenden:

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

Sie können das Obige einfach nach dem gewünschten Dienst filtern.

5
MaSuGaNa

Haben Sie sc.exe ausprobiert?

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

Beachten Sie, dass Sie innerhalb einer Stapeldatei jedes Prozentzeichen verdoppeln.

26
Rômulo Ceccon

Sie können net start "service name" in Ihrem Dienst anrufen. Wenn es nicht gestartet ist, wird es gestartet und errorlevel = 0 zurückgegeben. Wenn es bereits gestartet ist, wird errorlevel = 2 zurückgegeben.

19
JRL

Verwenden Sie pstools - insbesondere psservice und "query" - zum Beispiel:

psservice query "serviceName"
12
Marc Gravell

siehe auch hier:

NET START | FINDEN Sie "Dienstname"> nul IF errorlevel 1 ECHO Der Dienst wird nicht ausgeführt

gerade kopiert von: http://ss64.com/nt/sc.html

10
Ros

Wenn PowerShell für Sie verfügbar ist ...

Get-Service -DisplayName *Network* | ForEach-Object{Write-Host $_.Status : $_.Name}

Werde dir geben...

Stopped : napagent
Stopped : NetDDE
Stopped : NetDDEdsdm
Running : Netman
Running : Nla
Stopped : WMPNetworkSvc
Stopped : xmlprov

Sie können das **** Network **** durch einen bestimmten Dienstnamen ersetzen, wenn Sie nur einen Dienst überprüfen möchten.

9
aphoria

meine Absicht war es, ein Skript zu erstellen, das Dienste ein- und ausschaltet (in einem Skript).

net start NameOfSercive 2>nul
if errorlevel 2 goto AlreadyRunning
if errorlevel 1 goto Error

...

Sehr geholfen !! TYVM z666

aber wenn z. Dienst ist deaktiviert (auch errorlevel = 2?), geht auf "AlreadyRuning" und kommt nie zu

if errorlevel 1 goto Error  ?!!

ich wollte eine Ausgabe für diesen Fall ...

 :AlreadyRunning
 net stop NameOfSercive
 if errorlevel 1 goto Error


 :Error
 Echo ERROR!!1!
 Pause

meine 2 Cents, hoffe das hilft

2
xy77

Nun, ich sehe "Nick Kavadias", der das sagt:

"Nach dieser http://www.computerhope.com/nethlp.htm sollte es NET START/LIST sein ..."

Wenn Sie in Windows XP Folgendes eingeben:

NET START /LIST

sie erhalten eine Fehlermeldung, geben Sie stattdessen ein 

NET START

Die/LIST ist nur für Windows 2000 ... Wenn Sie ein solches Web vollständig lesen, wird die/LIST nur unter Windows 2000 angezeigt.

Hoffe das hilft!!!

2
z666zz666z

Vielleicht ist dies der beste Weg, um einen Dienst zu starten und das Ergebnis zu überprüfen

Natürlich aus einem Stapel wie File.BAT, fügen Sie etwas wie dieses Beispiel ein, ersetzen Sie einfach "NameOfSercive" durch den gewünschten Dienstnamen und ersetzen Sie die REM - Zeilen durch Ihren eigenen Code:

@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

Eine andere Sache ist, den Zustand zu überprüfen, ohne ihn zu ändern. Dafür gibt es eine viel einfachere Möglichkeit, es auszuführen:

net start

Ohne Parameter wird eine Liste mit allen Diensten angezeigt, die gestartet werden ... 

Also ein einfaches grep oder find danach auf ein Rohr passen ... 

Natürlich aus einem Stapel wie File.BAT, fügen Sie etwas wie dieses Beispiel ein, ersetzen Sie einfach "NameOfSercive" durch den gewünschten Dienstnamen und ersetzen Sie die REM - Zeilen durch Ihren eigenen Code:

@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

Hoffe das kann helfen !! Es ist was ich normalerweise benutze.

2
z666zz666z

Ich bin mir nicht sicher, ob Sie die Ergebnisse aus einer Batchdatei per E-Mail versenden können. Wenn ich einen alternativen Vorschlag machen kann, wäre das Problem vbscript gelöst. Ich bin mit vbscript alles andere als großartig, aber Sie können damit die Dienste abfragen, die auf dem lokalen Rechner ausgeführt werden. Das folgende Skript sendet Ihnen den Status aller Dienste, die auf dem Computer ausgeführt werden, auf dem das Skript ausgeführt wird. Sie möchten natürlich den SMTP-Server und die E-Mail-Adresse ersetzen. Wenn Sie Teil einer Domäne sind und dieses Skript als privilegierter Benutzer ausführen (dies muss ein Administrator auf dem Remote-Computer sein), können Sie auch Remote-Computer abfragen, indem Sie localhost durch fqdn ersetzen.

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 = "[email protected]"
objMessage.To = "[email protected]"
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

Hoffe das hilft dir! Genießen!

Edit: Ahh noch ein Service Status von 4 bedeutet, dass der Service läuft, ein Service Status von 1 bedeutet, dass dies nicht der Fall ist. Ich bin nicht sicher, was 2 oder 3 bedeutet, aber ich wette, dass sie aufhören/starten.

1
Sam Stelfox

Ros ist der Code, den ich poste, um zu wissen, wie viele Dienste laufen ...

Stellen Sie sich vor, Sie möchten wissen, wie viele Services wie Oracle * sind, dann setzen Sie Oracle anstelle von NameOfSercive ... und Sie erhalten die Anzahl der Services wie Oracle *, die für die Variable% CountLines% ausgeführt werden, und wenn Sie nur etwas tun möchten 4 Sie können so etwas tun:

IF 4 ==% CountLines% GOTO FourServicesAreRunning

Das ist viel leistungsfähiger ... und Ihr Code lässt Sie nicht wissen, ob der gewünschte Dienst ausgeführt wird ... ob ein anderes srecive mit demselben Namen beginnt ... Stellen Sie sich vor: - ServiceOne - ServiceOnePersonal

Wenn Sie nach ServiceOne suchen, jedoch nur ServiceOnePersonal ausführen, wird der Code angezeigt, dass ServiceOne ausgeführt wird.

Mein Code kann einfach geändert werden, da er alle Zeilen der Datei liest und Zeile für Zeile liest. Er kann auch tun, was Sie für jeden Dienst wollen ... siehe dazu:

@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

Natürlich listet es nur laufende Dienste auf, ich weiß nicht, wie das Netz nicht laufende Dienste auflisten kann ...

Hoffe das hilft!!!

0
z666zz666z

entsprechend dieser http://www.computerhope.com/nethlp.htm sollte es NET START/LIST sein, aber ich kann es nicht mit dem XP - Feld erreichen. Ich bin mir sicher, dass es einige WMIs gibt, die Ihnen die Liste geben.

0
Nick Kavadias