Script para Detener Servicios de windows

Iniciado por dracrac, 8 Septiembre 2015, 20:10 PM

0 Miembros y 1 Visitante están viendo este tema.

dracrac

Saludos

He hecho un script para detener los servicios de windows que nos interese pero no acaba de funcionar. Alguien me podria ayudar a ver los problemas? Gracias
Aqui pongo el script:

Código (DOS) [Seleccionar]
@echo off
:PARAR
cls
setlocal EnableDelayedExpansion
echo.
set /p servein=Nombre del Servicio:
set dname=%servein%
for /f "tokens=3*" %%a in ('sc GetDisplayName %dname% ^| findstr "Nombre"') do (set serveid=%%a %%b)
(sc query %servein% | FIND "NOMBRE") > tanca.txt
for /f "tokens=2" %%i in (tanca.txt) do (set cadena=%%i)
set cadenafinal=%serveid% : %cadena%
IF %ErrorLevel% EQU 1 (echo.&echo Servicio %servein% no existe !!)
IF %ErrorLevel% EQU 0 (
for /f "tokens=4" %%a in ('sc query %servein% ^| findstr "ESTADO"') do (set "parat=%%a")
rem echo parat:!parat!
if "!parat!" == "STOPPED" (
echo.
echo El servicio %servein% ya esta detenido  
echo.
echo  Nombre Descriptivo: %serveid%
echo  Nombre del Servicio: %servein%
for /f "tokens=3" %%a in ('sc qc %servein% ^| find "TIPO_INICIO"') do (set "stype=%%a")
if !stype! == 2 (set "stype=AUTOMATIC")
if !stype! == 3 (set "stype=MANUAL")
if !stype! == 4 (set "stype=DISABLED")
echo  !parat! / !stype!
)
if "!parat!" == "RUNNING" (
sc config %servein% start= disabled > nul
sc stop %servein% > nul
echo errorlevel:%errorlevel%

REM si sc qc servei retorna un 5 el servei esta protegit
if %errorlevel% == 5 (
echo.
echo Acceso denegado
echo El servicio %servein% no se puede detener esta protegido por el sistema
echo si de detiene puede crear inestabilidad en el sistema
)
REM si sc qc servei retorna un 0 el servei esta iniciat pertant el parem
if %errorlevel% == 0 (
sc config %servein% start= disabled > nul
sc stop %servein% > nul
rem for /f "tokens=3,*" %%c in ('sc query %servein% ^| findstr "ESTADO" ') do ( echo %%d : %cadenafinal% )
for /f "tokens=3,*" %%c in ('sc query %servein% ^| findstr "ESTADO" ') do (
echo  El servicio se esta parando...%%d..OK
echo  Nombre Descriptivo: %serveid%
echo  Nombre del Servicio: %cadena%
)
)
)
)
REM Delete variables
del tanca.txt
set "ErrorLevel="
set "parat="
set "dname="
set "serveid="
set "servein="
set "cadena="
echo.
set /p otro=Parar Otro (s/n)?
if %otro% == n goto PREGUNTA
goto PARAR


el problema esta que el comando:

sc stop %servein% > nul
echo errorlevel:%errorlevel%


no me lee bien la variable %errorlevel% y no va donde tiene que ir. Por ejemplo provando con un servicio protegido como schedule que no se puede parar con el comando sc no me entra dentor del if errorlevel 5.

Alguien podria ayudarme? Gracias!!

Mad Antrax

No me gusta usar batch para hacer éste tipo de cosas, creo que lenguajes como VBS y similares dejan un código más limpio. El siguiente ejemplo es un script que iniciará cualquier servicio que esté marcado como "automático" que que no se esté ejecutando actualmente:

Código (vb) [Seleccionar]
On Error Resume Next
Set oWSH = CreateObject("WScript.Shell")
Set oWMI = GetObject("winmgmts:\\.\root\CIMV2")

Function ForceConsole()
If InStr(LCase(WScript.FullName), "cscript.exe") = 0 Then
oWSH.Run "cscript " & Chr(34) & WScript.ScriptFullName & Chr(34)
WScript.Quit
End If
End Function

Function printf(txt)
WScript.StdOut.WriteLine txt
End Function

Function scanf()
scanf = LCase(WScript.StdIn.ReadLine)
End Function

Function StartServices()
Set cQuery = oWMI.ExecQuery("SELECT * FROM Win32_Service WHERE StartMode = 'Auto' AND State <> 'Running'")
For Each oItem In cQuery
printf " [>] " & oItem.Name
printf " [>] " & oItem.Caption
printf " "
Call oItem.StartService()
Next
End Function

Call ForceConsole()
printf "Buscando servicios automaticos que se hayan detenido..." & vbcrlf
Call StartServices()
printf ""
printf "Proceso terminado, pulsa <enter para salir>"
scanf


Modificarlo para hacer justo lo contrario no te costará nada :)
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

Eleкtro

#2
Código (dos) [Seleccionar]
SetLocal EnableDelayedExpansion
SC.exe Stop "service_name"
Echo !ERRORLEVEL!


...o también:
Código (dos) [Seleccionar]
SC.exe Stop "service_name"
Call Echo %%ERRORLEVEL%%


De todas formas y sin duda alguna la mejor solución es evitar Batch siempre que puedas. Prueba el código del compañero @Mad Antrax.

Saludos








dracrac

Gracias Mad Antrax por tu respuesta i tu alternativa!

Pero me gustaria saber porque no funciona el codigo que he hecho, creo que esta correcto pero por alguna razón no se comporta del todo como debe.

Me gustaria saber porque el comando sc se comporta diferente cuando lo escribes en la linea de comandos que cuando esta dentro de un fichero bat, que es lo que pasa en el ejemplo que he puesto.

dracrac

#4
Gracias de nuevo Elektro era eso lo que pasaba!  :D

Porque razón/es es mejor utilizar otro lenguaje diferente del batch? Cual me aconsejas que utilize para hacer estas cosas y porque?  

y  Para que cosas utilizas el batch?

Mad Antrax

Cita de: dracrac en  9 Septiembre 2015, 10:35 AM
Gracias de nuevo Elektro era eso lo que pasaba!  :D

Porque razón/es es mejor utilizar otro lenguaje diferente del batch? Cual me aconsejas que utilize para hacer estas cosas y porque?  

y  Para que cosas utilizas el batch?

Realmente puedes utilizar el lenguaje que desees y te sientas más cómodo. Utilizar lenguajes de bajo nivel te obligará a escribir más código, mientras que los lenguajes de alto nivel te permitirán simplificar un grupo de instrucciones en líneas de código más simple. VBS, además tiene mejoras como el uso de objetos y eventos. Según tu necesidad habrá cosas que con batch no podrás hacer.

Así pues, siempre y cuando te sea como batch, úsalo. Pero es bueno conocer y tener otras alternativas.

:)
No hago hacks/cheats para juegos Online.
Tampoco ayudo a nadie a realizar hacks/cheats para juegos Online.

Eleкtro

#6
Cita de: dracrac en  9 Septiembre 2015, 10:35 AMPorque razón/es es mejor utilizar otro lenguaje diferente del batch? Cual me aconsejas que utilize para hacer estas cosas y porque?

Por muchas razones que no caben en un libro, pero yo principálmente lo recomiendo por la reducción de código y tiempo que supone desarrollar en otros lenguajes. Claro ...si migrases a un lenguaje orientado a objetos entonces vas a encontrar la gloría en comparación con el patoso Batch.

Por ejemplo Batch, o mejor dicho la aplicación externa SC.exe (o WMIC.exe) no te permite tener ningún tipo de control real sobre el estado de los servicios, cosa que podrías elaborar de forma muy sofisticada con C#/VB.Net. Solo por ponerte un ejemplo acorde a este problema.




Cita de: dracrac en  9 Septiembre 2015, 10:35 AMCual me aconsejas que utilize para hacer estas cosas y porque?

Te respondo a tu pregunta mostrándote una cita reciente:

Cita de: Eleкtro en  8 Septiembre 2015, 00:09 AMDentro de los lenguajes integrados en Windows, si simplemente buscas algo más o menos tan sencillo cómo Batch ...pero que le da mil vueltas, ese lenguaje sería VisualBasicScript (VBS) (aunque es otro lenguaje muy limitado también), y luego le seguiría PowerShell (PS).

Si tu intención es aprender programación, entonces ninguno de esos lenguajes sería una buena opción, puedes empezar por Ruby o Python por ejemplo en lo referente al Scripting. Pero no te guies por una simple opinión cómo la mía, el mejor lenguaje siempre será aquél con el que más agusto te sientas (al escribi la sintaxis) y con el que puedas realizar todas las tareas que necesites hacer. Pero prueba algo distinto a Batch para comparar, hazme caso en eso.

Mi primer lenguaje fue Batch ...hace muchos años ya, por ese motivo entiendo que una persona no puede ser consciente de la mierd@ que supone Batch y de todos los inconvenientes, innecesarios inconvennientes por los que estás pasando para hacer cualquier código hasta que descubras un lenguaje de verdad.




Cita de: dracrac en  9 Septiembre 2015, 10:35 AMPara que cosas utilizas el batch?

No utilizo Batch absolutamente para nada (excepto para mostrar ejemplos de ayuda en el foro), cuando lo utilizaba era más o menos para llevar a cabo tareas similares...relacionadas con el sistema, pero todo lo que explico es de memoria ...no por tener práctica usándolo diariamente xD (aunque la práctica la tengo adquirida iguálmente cuando lo aprendí), ya que es un lenguaje simple y sencillo, se aprende y con el paso de los años es como montar en bici, todo se recuerda.

Saludos!








dracrac