Buenas,
opino que eso de un virus que vaya apagando los PCs por amor al arte, es una autentica tonteria ya que si fuera apagado el PC solo hay que volver a encenderlo, y si el usuario está delante, solo tiene que poner shutdown -a y abortaria este proceso.
Sobre la siguiente afirmacion:
Esto tampoco te sirve.... para que sirva tiene que tener en lugar de <00> (o el numero que sea) tiene que tener: <20>....Si tiene 20 tienes acceso a la makina por NetBios....
Solo indicar que <20> es cuando hay recursos compartidos y por lo tanto se puede entrar por netbios a los mismos, pero siempre existen en los Windows de arquitectura NT (nt,2k,xp,2k3) los recursos administrativos ipc$ , admin$ y c$ , d$ , etc..
Solo con tener activados los recursos administrativos por defecto ya se puede conectar al ipc$ y admin$ para hacer un psexec, psshutdown o cualquier otro proceso remoto.
Por otra parte, el tener un bath script para la tarea de apagar masivamente los PCs es util en grandes redes corporativas donde los trabajadores segun acaban su jornada de trabajo, apagan el monitor (o ni siquiera) y se van, tan felices, dejando el PC ahi encendido.
Cuando son mas de 700 PCs, eso es un consumo electrico bastante importante, por lo que se puede programar que a cierta hora se haga un apagado masivo de PCs en el rango de IPs donde estan los PC de los trabajadores (los servidores ni tocarlos..)
Dejo a continuacion un pequeño script que tengo para esta tarea, utiliza la utilidad psshutdown de las pstools.
Primero hace ping a las ips del rango especificado, en el caso de obtener respuesta intenta hacer el shutdown, si tiene deshabilitado ipc$ y/o admin$ dará error , reportando este error al final en una lista de PCs apagados correctamente o si ha habido error.
Se puede poner que solicite usuario y contraseña modificando un poco el codigo, sino asume el usuario actual, por lo que debe tener privilegios (Domain Admin por ej..)
Para los que miren el codigo.. al hacer la comparacion de ips, si se hace directamente por el string completo no compara tal cual si una ip es mayor que otra y puede dar errores, por lo que opté por poner la ip en formato longip, pero dependiendo que rango, puede dar problemas por ser un numero excesivamente grande, asi que la conversion a longip esta modificada multiplicando a 64 cuando realmente tendria que ser a 256.
shtdwn.bat
@echo off
If %1'==/?' Goto ayuda
If %1'==' Goto ayuda
If %2'==' Goto ayuda
If Not %3'==' Goto ayuda
goto Empieza
:ayuda
echo.
echo ------------------------------------
echo LAN massive pc shutdown
echo by
echo CrowDat Kurobudetsu
echo ------------------------------------
echo.
echo Usage:
echo.
echo %~n0 IPstart IPend
echo.
echo Example:
echo %~n0 10.10.0.1 10.10.15.255
echo.
goto :EOF
:Empieza
set vuelve=Empeza2
set calc=%2
goto conv
:Empeza2
set /a longip2=(64*64*64*%a%)+(64*64*%b%)+(64*%c%)+%d%
set vuelve=Empeza3
set calc=%1
goto conv
:Empeza3
set /a longip=(64*64*64*%a%)+(64*64*%b%)+(64*%c%)+%d%
If "%longip%" GEQ "%longip2%" goto END
echo Results > results.txt
echo ---------- >> results.txt
echo Pinging ...
:d
If %d% EQU 255 goto c
echo %a%.%b%.%c%.%d% ...
ping -n 1 -w 500 %a%.%b%.%c%.%d% > nul
set rsp=%errorlevel%
set ip=%a%.%b%.%c%.%d%
set vuelve=d2
set calc=%ip%
goto conv
:d2
set /a longip=(64*64*64*%a%)+(64*64*%b%)+(64*%c%)+%d%
If %rsp% EQU 0 Goto cambia
If %rsp% GEQ 1 echo %ip% [Down] >> results.txt
:sigue
If "%longip%" GEQ "%longip2%" goto end
set /a d+=1
goto d
:cambia
set ip=%a%.%b%.%c%.%d%
echo psshutdown -f -r -t 0 \\%ip%
goto sigue
:fallo
echo %ip% [Fail] >> results.txt
goto sigue
:c
set /a c+=1
set d=0
If "%c%" EQU "255" goto b
goto d
:b
set /a b+=1
set c=0
If "%b%" EQU "255" goto a
goto d
:a
set /a a+=1
set a=0
If "%a%" EQU "255" goto end
goto d
goto end
:END
echo.
echo.
type results.txt
echo.
set a=
set b=
set c=
set d=
set ip=
set rsp=
set vuelve=
del results.txt >nul
goto :EOF
:conv
FOR /F "TOKENS=1,2,3,4 DELIMS=." %%F IN ('echo %calc%') DO (set /a a=%%F & set /a b=%%G & set /a c=%%H & set /a d=%%I)
goto %vuelve%
Saludos.