Un apaño muy típico mio, y realmente rápido y facil de hacer, pasa por controlarlo desde el batch de windows para posteriormente ejecutar el comando que sea, aunque esto se puede hacer desde powershell de forma muy sencilla. Veamoslo primero desde un .bat y vamos a hacerlo a lo artesanal, así repasamos algunos conceptos básicos como volcar y buscar en un archivo .txt o los bucles for, así le añadimos un poco de lío.
REM deshabilitamos el echo y retardamos la carga de las variables, para los bucles for
@echo off
setlocal enabledelayedexpansion
:: Establecer variables
REM En este caso vamos a separar los almacenamientos de los servidores
set ADMIN_UDs_Red=almacenamiento01 almacenamiento02 almacenamiento03
set ADMIN_Servers=servidor01 servidor02 servidor03
REM Vamos a volcar el resultado a un log, controlamos la ruta para crearla si es necesario y el nombre del log depende de la fecha, para poder lanzarlo a diario cuando llegamos al trabajo. Vamos a borrar su contenido con el echo. >
set ruta=C:\Connectivity_Logs
if not exist %ruta% mkdir %ruta%
set rutalog=%ruta%\%date:~6,4%%date:~3,2%%date:~0,2%_Connectivity_Test.log
echo. >%rutalog%
REM Nos vamos a apoyar en un par de archivos txt y una variable que me permita controlar que si hay una ip que no tiene conectividad mande un mail
set pinged=%ruta%\ping.txt
set pinged2=%ruta%\ping2.txt
set ENVIOMAIL=NO
:: Lanzar comprobaciones
REM Volcamos una cabecera en el .log
echo. >>%rutalog%
echo ************************* >>%rutalog%
echo *** CONNECTIVITY TEST *** >>%rutalog%
echo ************************* >>%rutalog%
echo. >>%rutalog%
REM Recorremos las unidades de red de la variable ADMIN_UDs
for %%a in (%ADMIN_UDs_Red%) do (
echo Checking %%a
REM Hacemos un ping y volcamos el resultado al primer .txt
PING -w 3000 %%a > %pinged%
REM Buscamos si en el primer .txt hay indicios de conectividad y volcamos al segundo .txt
@find /C "TTL=" %pinged% > %pinged2%
REM Ahora la variable estado es la que marcará la conectividad, viendo el número que se ha volcado al segundo .txt si no es 0 es que ha encontrado alguna coincidencia, en este caso por como hemos hecho el ping será 1
set estado=[nOK]
for /F "tokens=1,2,3" %%h in (%pinged2%) do (
set control=%%j
if "%%h" EQU "----------" (
if "!control!" NEQ "0" set estado=OK
)
)
REM Volcamos el resultado al .log
echo Checked ... %%a: !estado! >>%rutalog%
REM En caso de no haber conectividad en cualquiera de las ips activa el envio de un mail
if !ENVIOMAIL! EQU NO (
if !estado! EQU [nOK] set ENVIOMAIL=SI
)
)
REM Realizamos exactamente lo mismo con la lista de servidores
for %%a in (%ADMIN_Servers%) do (
echo Checking %%a
PING -w 3000 %%a > %pinged%
@find /C "TTL=" %pinged% > %pinged2%
set estado=[nOK]
for /F "tokens=1,2,3" %%h in (%pinged2%) do (
set control=%%j
if "%%h" EQU "----------" (
if "!control!" NEQ "0" set estado=OK
)
)
echo Checked ... %%a: !estado! >>%rutalog%
if !ENVIOMAIL! EQU NO (
if !estado! EQU [nOK] set ENVIOMAIL=SI
)
)
REM Volcamos un pie de log para constatar que hemos terminado con el
echo. >>%rutalog%
echo ************************* >>%rutalog%
echo *** END *** >>%rutalog%
echo ************************* >>%rutalog%
REM Borramos los ficheros .txt en los que nos hemos apoyado.
del %pinged%
del %pinged2%
REM Aqui controlariamos el envio del mail, en este caso solo hago un echo.
ECHO %ENVIOMAIL%
PAUSE
Si quieres saber como enviar el mail, mira esta entrada: Enviar un mail con PowerShell
Bien, esto sería mas fácil haciéndolo desde powershell, ya que con un único comando obtenemos true o false al comprobar la conectividad y lo almacenamos en una variable:
a$=test-connection -computername <nombre_servidor> -quiet
En este caso la variable a$ tendrá el resultado true o false de la comprobación de conexión.
Por ejemplo, para saber si tenemos conectividad a internet, podemos lanzar directamente el comando en la consola de windows powershell:
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. Reservados todos los derechos.
PS C:\> test-connection -computername google.com -quiet
True
PS C:\>
Si consultamos la ayuda, podemos ver que admite algunas variantes, por ejemplo si queremos comprobar varios equipos:
test-connection -computername server01, server02, server12 -credential domain01\user01
Incluso personalizando los parametros del ping
test-connection -computername Server01 -count 3 -delay 2 -TTL 256 -buffersize 256 -throttle 32
Podríamos ir mas allá y concatenar la condición de conexión con un servidor a si esta es true lanzar una sesión interactiva:
if (test-connection -computername Server01 -quiet) {new-pssession Server01}
Veamos como lo realiza:
PS C:\> if (test-connection -computername servidor01 -quiet) {new-pssession servidor01}
Id Name ComputerName State ConfigurationName Availability
-- ---- ----------------- ----------------- ------------ -----------
1 Session1 servidor01 Opened Microsoft.PowerShell Available
PS C:\>
Nos ha creado la sesión en el servidor, introducimos el número de id en el comando Enter-PSSession 1 y cambiamos a esa sesión interactiva para lanzar comandos en el propio servidor:
PS C:\> Enter-PSSession 1
[servidor01]: PS C:\Users\usuario01\Documents>
Para gustos colores yo a veces prefiero coger scripts que ya tengo hechos y no perder ni un segundo y otras veces me apetece recordar un poco comandos y métodos olvidados.
Piensa en variantes de este método, si cambias el listado de servidores o almacenamientos por lista de dominios controlas si hay conectividad hacia los dominios que administras, o los que consultas de normal, etcétera.
Para gustos colores yo a veces prefiero coger scripts que ya tengo hechos y no perder ni un segundo y otras veces me apetece recordar un poco comandos y métodos olvidados.
Piensa en variantes de este método, si cambias el listado de servidores o almacenamientos por lista de dominios controlas si hay conectividad hacia los dominios que administras, o los que consultas de normal, etcétera.
SaluDOS.