marcimarc85
Goto Top

Bestimmte Dienste per BATCH auslesen und nach Auswahl beenden

Einen schönen guten Tag,

Folgendes:

Ich möchte ein Batch Script erstellen, was nach Aufruf eine Bestimmte Auswhl an Diensten auflistet, nummeriert (1,2,3......8,9).
Dann soll die Abfrage kommen, welcher Dienst beendet werden soll. Diese Abfrage soll dann mit der Nummer beantwortet werden, die vorab zugeordnet wurde.
Nach Eingabe der Nummer wird der Dienszt dann auf disabled geändert und der Task beendet (mus sso sein, da sich entsprechnede Dienste sonst immer wieder neu starten -> Ist softwareseitig so gewollt)

Mit wmic service where 'name like "%App %"' get name weden mir die Dienste aufgelistet:

App Dienst 1
App Dienst 2
App Dienst 3
App Dienst 4

Die Dienste unterscheiden sich allerdings vom Namen und Anzahl auf den Servern. Daher wird speziell nach dem Wort "App" gesucht gefolgt von einer Wildcard, da alle Dienste "App" voarngestell im Namen haben.

Wie bekomme ich nun jeden erkannten Dienst einer eigenen Variablen zugeordnet, die ich mit einer Nummer ansprechen kann?
Daran hänge ich gerade irgendwie fest.

Vielen Dank schonmal

Content-ID: 2619148687

Url: https://administrator.de/contentid/2619148687

Ausgedruckt am: 22.11.2024 um 04:11 Uhr

colinardo
colinardo 27.04.2022, aktualisiert am 28.04.2022 um 07:51:47 Uhr
Goto Top
Servus,
immer noch mit Batch unterwegs? face-smile.
@echo off &setlocal enabledelayedexpansion
:start
cls
echo Ihre Auswahl:
echo.
set cnt=1
for /f "tokens=2 delims==" %%a in ('wmic service where "name like 'App%%'" get name /value') do for /f "delims=" %%b in ("%%a") do (  
	echo		[!cnt!] %%b
	set "svc!cnt!=%%b"  
	set /a cnt+=1
)
echo.
set /p "num=Nummer eingeben:"  
set "service=!svc%num%!"  

if defined service (	
	echo Der Service !service! wird gestoppt und deaktiviert.
	sc stop !service!
	sc config !service! start= disabled
) else (
	echo Ungueltige Nummer.
	timeout /t 2 >nul
	goto start
)
Grüße Uwe
MarciMarc85
MarciMarc85 28.04.2022 aktualisiert um 07:20:28 Uhr
Goto Top
Zitat von @colinardo:

Servus,
immer noch mit Batch unterwegs? face-smile.

Grüße Uwe

Guten Morgen Uwe,

Super! Vielen Dank. ! Genau so hatte ich mir das vorgestellt. Da ist allerdings noch ein Fehler bei der Abfrage bzw. Anzeige der Dienste drin. Es wird auf einem Testsystem die korrekte Anzahl der Dienste angezeigt, aber nur

[1] App
[2] App
...
...
[5] App

anstatt

[1] App Servicename
[2] App Servicename

usw.


Wenn ih anstatt %%b, %%a verwende, wird mir in der onsole der komplette Dienstname ausgegeben inkl vorangestellter Nummer. Aber spätestens bei der Abfrage des zu beendenden Dienstes und nach eingabe der entsprechenden Nummer kommt die Meldung :

'App' is not recognized as an internal or external command,
operable program or batch file.


Grüße

PS: Wäre es denn per Powershell geschmeidiger? dann müsste ich wahrscheinlich auf allen Servern erst die Execution Policy anpassen.
colinardo
colinardo 28.04.2022 aktualisiert um 09:01:18 Uhr
Goto Top
Sorry was vergessen, o. korrigiert.
Wäre es denn per Powershell geschmeidiger?
Auf jeden Fall, da könntest du sogar noch eine komplette GUI draus bauen wenn man
unbedingt wollte, oder eben einen Einzeiler bauen. Kann ich dir gerne was nachliefern wenn gewünscht, bin nur gerade noch unterwegs.
Mal auf die Schnelle ein Einzeiler dafür
Get-Service -Name App* | ogv -Title 'Dienste zum beenden und deaktivieren wählen' -Passthru | stop-service -Force -Passthru | set-service -Startuptype disabled  
dann müsste ich wahrscheinlich auf allen Servern erst die Execution Policy anpassen.
Die Execution Policy ist ja eigentlich nur Schall und Rauch und lässt sich mit einem -EP "Bypass" bei Bedarf eh umgehen, schöner und effektiver ist es aber natürlich wenn man sie entsprechend ändert.

Frage mich aber warum dieser "App-Schmuh" überhaupt angewendet wird.und das auch noch manuell?
MarciMarc85
MarciMarc85 28.04.2022 um 08:21:11 Uhr
Goto Top
Zitat von @colinardo:

Sorry was vergessen, o. korrigiert.
Wäre es denn per Powershell geschmeidiger?
Auf jeden Fall, da könntest du sogar noch eine komplette GUI draus bauen wenn man
unbedingt wollte. Kann ich dir gerne was nachliefern wenn gewünscht, bin nur gerade noch unterwegs.
dann müsste ich wahrscheinlich auf allen Servern erst die Execution Policy anpassen.
Die Execution Policy ist ja eigentlich nur Schall und Rauch und lässt sich mit einem -EP "Bypass" bei Bedarf eh umgehen, schöner und effektiver ist es aber natürlich wenn man sie entsprechend ändert.

Frage mich aber warum dieser "App-Schmuh" überhaupt angewendet wird.und das auch noch manuell?

Hi Uwe,

Danke für die schnelle Rückmeldung.

Wenn Du da was für die Powershell parat hast, würde ich natürlich nicht nein sagen. Mit GUI natürlich noch besser!
Perfekt wäre es, wenn man als Abfrage auch noch die Möglichkeit hätte, nicht nur einen Service auszuwählen, der beendet werden soll, sondern auch alle entsprechenden aus der Liste auf einmal. Dieses Szenario kommt ab und an auch mal vor, bzw. ist notwendig,

Dass "App" davor ist natürlich nur ein Synonym. Ich kann hier aus Datenschutzgründen natürlich nicht den korrekten Namen offenlegen. An sich, ist es auch garnicht so verkehrt, dass die Anwendung so ein "Signalwort" in den Servicenamen vorangestellt hat, denn dadurch kann ich in vielen Anwendungsgebieten genau dies Dienste recht einfach rausfiltern.

Beste Grüße
colinardo
Lösung colinardo 28.04.2022 aktualisiert um 09:01:03 Uhr
Goto Top
Auf die Schnelle ein Einzeiler mit Gui. Da lassen sich auch mehrere oder alle markieren und mit Klick auf OK dann stoppen und deaktivieren.
Get-Service -Name App* | ogv -Title 'Dienste zum beenden und deaktivieren wählen' -Passthru | stop-service -Force -Passthru | set-service -Startuptype disabled  
(edit: Tippfehler korrigiert)
Entsprechende Rechte des ausführenden Principals natürlich vorausgesetzt.
MarciMarc85
Lösung MarciMarc85 28.04.2022 aktualisiert um 14:30:11 Uhr
Goto Top
Zitat von @colinardo:

Auf die Schnelle ein Einzeiler mit Gui. Da lassen sich auch mehrere oder alle markieren und mit Klick auf OK dann stoppen und deaktivieren.
Get-Service -Name App* | ogv -Title 'Dienste zum beenden und deaktivieren wählen' -Passthru | stop-service -Force -Passthru | set-service -Startuptype disabled  
(edit: Tippfehler korrigiert)
Entsprechende Rechte des ausführenden Principals natürlich vorausgesetzt.

OK. Diese Lösung ist wirklich simpel und gleichzeitig genial. Finde ich sogar besser, als die Batch-Variante !
Vielen Dank!

EDIT: Ich bräuchte ansatt dem stop-service das Kommando Stop-Process -Id <Prozess-ID des Dienstes> -Force -ErrorAction Stop

Hintergrund. Einige der Dienste warten leider ständig auf das Abarbeiten einiger Tasks und lassen sich nicht normal beenden: Sie bleiben dann immer im Status "wird beendet" . Daher muss wirklich der jeweilige Prozess gekilled werden.
MarciMarc85
MarciMarc85 29.04.2022 um 07:50:53 Uhr
Goto Top
Hast du da noch einen Tipp?
colinardo
colinardo 29.04.2022 aktualisiert um 08:54:45 Uhr
Goto Top
Sorry,
wenn du deinen Post nachträglich änderst nachdem ich ihn gelesen habe, bekomme ich das nicht mit face-wink.
EDIT: Ich bräuchte ansatt dem stop-service das Kommando Stop-Process -Id <Prozess-ID des Dienstes> -Force -ErrorAction Stop
Bitte:
$ErrorActionPreference = 'Stop'  
Get-Service -Name App* | ogv -Title 'Dienste zum beenden und deaktivieren wählen' -Passthru | %{  
    try{
        $id = (gcim win32_Service -Filter "Name = '$($_.Name)'").ProcessId  
        if ($id -gt 0){
            Stop-Process -Id $id -Force
        }
        set-service -Name $_.Name -Startuptype disabled
    }catch{
        write-host "Error processing service '$($_.Name)' : $($_.Exception.Message)" -F Red  
    }
}
Grüße Uwe
MarciMarc85
MarciMarc85 29.04.2022 um 09:05:30 Uhr
Goto Top
Zitat von @colinardo:

Sorry,
wenn du deinen Post nachträglich änderst nachdem ich ihn gelesen habe, bekomme ich das nicht mit face-wink.
EDIT: Ich bräuchte ansatt dem stop-service das Kommando Stop-Process -Id <Prozess-ID des Dienstes> -Force -ErrorAction Stop
Bitte:
$ErrorActionPreference = 'Stop'  
Get-Service -Name App* | ogv -Title 'Dienste zum beenden und deaktivieren wählen' -Passthru | %{  
    try{
        $id = (gcim win32_Service -Filter "Name = '$($_.Name)'").ProcessId  
        if ($id -gt 0){
            Stop-Process -Id $id -Force
        }
        set-service -Name $_.Name -Startuptype disabled
    }catch{
        write-host "Error processing service '$($_.Name)' : $($_.Exception.Message)" -F Red  
    }
}
Grüße Uwe


Besten Dank. Jetzt läuft alles genauso, wie ich das brauche. Manchmal denke ich einfach zu kompliziert und komm dann nicht auf die Lösung.