Usare Ping In Script Batch

Tempo fa avevo presentato un articolo che mostra come utilizzare il comando ping all’interno di un batch script:

http://www.morzello.com/dblog/articolo.asp?articolo=41

Come spiegato, il comando restituisce sempre lo stesso errorlevel, rendendo vano un eventuale tentativo di capire se il ping è andato a buon fine o meno all’interno di uno script.

Oggi presento una variante che consente di ottenere lo stesso risultato senza dover scrivere codice vbscript.

Di seguito trovate un piccolo file .BAT (o .CMD) che potete utilizzare per testare l’esito di un ping:

ping nomeserver | findstr "TTL="
echo %errorlevel%

Mentre il comando ping restituisce sempre lo stesso errorlevel, findstr discrimina l’uscita a seconda che nell’output esista o meno una corrispondenza utile. A questo punto possiamo testare l’uscita del comando findstr invece che di ping.

Alla prossima.

Un frontend per Ping e WOL in Windows

Nei precedenti articoli di questo blog si è parlato di come sfruttare il protocollo wol ed il comando ping di windows per gestire l’accensione e lo spegnimento di un computer remoto.

Poichè si è fatto uso di script a riga di comando, ho ricevuto alcune email in cui viene richiesta una possibile soluzione “a finestre”.

Purtroppo il mio tempo a disposizione non è molto ma sfruttando comunque il linguaggio di scripting (vbscript) sono riuscito a fare un piccolo applicativo in grado di mostrare lo stato (acceso/spento) di computer appartenenti alla stessa rete con la possibilità di usare il protocollo wol nel caso in cui questi risultassero spenti.

L’esempio che segue consiste in una pagina html di tipo Microsoft (R) HTML Application host (con estensione hta)


<HTML>
<HEAD>
<TITLE>Pannello di Controllo</TITLE>

<HTA:APPLICATION
     ID=”objPannello”
     APPLICATIONNAME=”Pannello di Controllo”
     SCROLL=”No”
     SINGLEINSTANCE=”yes”
>

<SCRIPT LANGUAGE=”VBScript”>
<!–
  option Explicit
  dim strTR
  dim aServer(5)

  aServer(0)=”tizio.local”
  aServer(1)=”caio.local”
  aServer(2)=”sempronio.local”
  aServer(3)=”cesare.local”
  aServer(4)=”cleopatra.local”
  aServer(5)=”antonio.local”
  
  strTR=”<tr>” & _
    ”<td>+SERVERNAME+</td>” & _
    ”<td>+STATUS+</td>” & _
    ”<td>+COMMAND+</td>” & _
    ”</tr>”

  

  function ServerView(ServerName)

    dim objShell, objExec
    dim strPingResult
  
    Set objShell = CreateObject(“WScript.Shell”)
    Set objExec = objShell.Exec(“ping -n 2 -w 1000 ” & ServerName)

    strPingResult = UCase(objExec.StdOut.ReadAll)
    
    ServerView= ( CBool(InStr(UCase(strPingResult), ” TTL=”)))

  end function

  function ServerCommand(ServerName)
    dim objShell
    Set objShell = CreateObject(“WScript.Shell”)  
    objShell.run(“wol.bat ” & replace(ServerName,”.local”,”"))

  end function

–>

</SCRIPT>
</HEAD>
<BODY >
<H3>Pannello di Controllo</H3>
<HR>
<FORM NAME=”ValidForm”>  

<table width=”100%”>
<tr>

<td width=”50%”><b>Server</b></td>
<td width=”20%”><b>Status</b></td>

<td width=”30%”><b>Comandi</b></td>

</tr>

<SCRIPT LANGUAGE=”VBScript”>
<!–
  dim Ciclo
  dim strOutPut, strServerStatus

  dim blserverStatus

  Self.ResizeTo 575,475

  for Ciclo=lbound(aServer) to ubound(aServer)
    blServerStatus=ServerView(aServer(Ciclo))
    if blServerStatus then
      strServerStatus=”ON”
      strCommand=”Attivo”
    else
      strServerStatus=”OFF”
      strCommand=”<INPUT onclick=’ServerCommand(“”" & aServer(Ciclo) & “”")’ NAME=’” & aServer(Ciclo) & “‘ TYPE=’BUTTON’ VALUE=’Attiva’>”
      ’msgbox “<INPUT onclick=’ServerCommand(“”" & aServer(Ciclo) & “”")’ NAME=’” & aServer(Ciclo) & “‘ TYPE=’BUTTON’ VALUE=’Attiva’>”
    end if
    strOutput= replace(strTR,”+SERVERNAME+”,aServer(Ciclo))
    strOutput= replace(strOutput,”+STATUS+”,strServerStatus)
    strOutput= replace(strOutput,”+COMMAND+”,strCommand)  

    document.write strOutput
  next

–>
</script>

</table>
<hr>
<INPUT NAME=”Submit” TYPE=”BUTTON” VALUE=”Aggiorna” onclick=”Location.Reload(True)”>
</FORM>
</BODY>
</HTML>

Potete nominare questo file come volete, purchè mantenga l’estensione hta, altrimenti windows non ne consentirà l’esecuzione.

Prima di concludere volevo ricordare che per maggiori informazioni sul wol, potete dare una occhiata questo articolo.

Alla prossima.

Un ping per Windows con Errorlevel

Tempo fa ho pubblicato un articolo nel quale si fa uso del comando ping per capire se un computer è acceso oppure no.

Purtroppo il comando ping di windows, almeno nella versione in mio possesso, non ha una gestione degli ERRORLEVEL in uscita; in pratica alla fine della esecuzione, restituisce sempre il medesimo valore, sia che il ping abbia successo o meno, rendendo vane le possibilità di impiegarlo all’interno di uno script.

Di seguito presento un breve listato scritto in vbscript che esegue il comando ping e restituisce un codice di errore in modo da poterlo sfruttare all’interno di un file batch dos.

‘######################################
‘ServerPing.vbs ver 1.0
‘di Benintende Vittorio

‘Questo software viene rilasciato sotto
‘licenza GPL e senza garanzia alcuna.
‘######################################

‘Il seguente codice esegue un Ping e tiene
‘traccia dell’output generato per capire
‘l’esito del comando.

‘Poichè quando il comando va a buon fine
‘contiene sempre il TTL del pacchetto
‘inviato, se l’output contiene “TTL=” nella
‘sequenza di caratteri allora si presume che
‘il ping abbia raggiunto la destinazione.

‘Di seguito due esempi esplicativi:

‘Esempio 1:
‘Esecuzione di Ping 192.168.0.1 con 32 byte di dati:

‘Risposta da 192.168.1.20: Host di destinazione irraggiungibile.
‘Risposta da 192.168.1.20: Host di destinazione irraggiungibile.
‘Risposta da 192.168.1.20: Host di destinazione irraggiungibile.
‘Richiesta scaduta.

‘Statistiche Ping per 192.168.0.1:
‘ Pacchetti: Trasmessi = 4, Ricevuti = 3, Persi = 1 (25% persi),
‘Tempo approssimativo percorsi andata/ritorno in millisecondi:
‘ Minimo = 0ms, Massimo = 0ms, Medio = 0ms

‘Esempio 2:
‘Esecuzione di Ping 192.168.0.1 con 32 byte di dati:

‘Risposta da 192.168.0.1: byte=32 durata=73ms TTL=64
‘Risposta da 192.168.0.1: byte=32 durata=87ms TTL=64
‘Risposta da 192.168.0.1: byte=32 durata=103ms TTL=64
‘Risposta da 192.168.0.1: byte=32 durata=68ms TTL=64

‘Statistiche Ping per 192.168.0.1:
‘ Pacchetti: Trasmessi = 4, Ricevuti = 4, Persi = 0 (0% persi),
‘Tempo approssimativo percorsi andata/ritorno in millisecondi:
‘ Minimo = 68ms, Massimo = 103ms, Medio = 82ms

option explicit

dim strMyComputer
Dim objExec, objArgs, objShell
Dim strPingResults
dim lngPos

‘command line
Set objArgs = WScript.Arguments

For lngPos = 0 to objArgs.Count – 1
Select Case UCase(objArgs(lngPos))
Case Else
if cbool(len(trim(objArgs(lngPos)))) then strMyComputer=objArgs(lngPos)
End Select

Next

If not cbool(len(Trim(strMyComputer))) then wscript.quit(100)

Set objShell = CreateObject(“WScript.Shell”)
Set objExec = objShell.Exec(“ping -n 2 -w 1000 ” & strMyComputer)

strPingResults = UCase(objExec.StdOut.ReadAll)

wscript.quit(Not CBool(InStr(UCase(strPingResults), ” TTL=”)))

Per pingare l’indirizzo IP 192.168.0.1 da console ad esempio è sufficiente impartire la seguente istruzione:

cscript ServerPing.vbs 192.168.0.1

Ad esempio è possibile utilizzare il precedente script per accedere a condivisioni di rete solo quando queste sono raggiungibili:

::
:: abilita gli shares se i server sono attivi
::

@ECHO OFF
SET LOGFILE=”%APPDATA%\_share.log”
SET DOMAIN=miodominio
SET SERVER1=tizio
SET SERVER2=caio
SET SERVER3=sempronio

ECHO ———- >> %LOGFILE%
DATE /T >> %LOGFILE%
TIME /T >> %LOGFILE%
ECHO Looking for shares at %SERVER1% >> %LOGFILE%

cscript ServerPing.Vbs %SERVER1%.%DOMAIN% >NUL 2>&1

IF ERRORLEVEL 0 GOTO SETSERVER1
GOTO SERVER2

:SETSERVER1
ECHO Try to mount M: Drive (share1 on %SERVER1%) >> %LOGFILE%
NET USE M: \\%SERVER1%.%DOMAIN%\share1 >NUL 2>&1
ECHO Exit with error %ERRORLEVEL% >> %LOGFILE%

ECHO Try to mount L: Drive (share_nascosto$ on %SERVER1%) >> %LOGFILE%
NET USE L: \\%SERVER1%.%DOMAIN%\share_nascosto$ >NUL 2>&1
ECHO Exit with error %ERRORLEVEL% >> %LOGFILE%

ECHO Try to mount N: Drive (foto on %SERVER1%) >> %LOGFILE%
NET USE N: \\%SERVER1%.%DOMAIN%\foto >NUL 2>&1
ECHO Exit with error %ERRORLEVEL% >> %LOGFILE%

:SERVER2
ECHO Looking for shares at %SERVER2% >> %LOGFILE%

cscript ServerPing.Vbs %SERVER2%.%DOMAIN% >NUL 2>&1

IF ERRORLEVEL 0 GOTO SETSERVER2
GOTO SERVER3

:SETSERVER2
ECHO Try to mount O: Drive (share1 on %SERVER2%) >> %LOGFILE%
NET USE O: \\%SERVER2%.%DOMAIN%\share1 >NUL 2>&1
ECHO Exit with error %ERRORLEVEL% >> %LOGFILE%

:SERVER3

IF %COMPUTERNAME%==%SERVER3% GOTO GOEXIT

ECHO Looking for shares at %SERVER3% >> %LOGFILE%

cscript ServerPing.Vbs %SERVER3%.%DOMAIN% >NUL 2>&1

IF ERRORLEVEL 0 GOTO SETSERVER3
GOTO GOEXIT

:SETSERVER3
ECHO Try to mount P: Drive (Share1 on %SERVER3%) >> %LOGFILE%
NET USE P: \\%SERVER3%.%DOMAIN%\share1 >NUL 2>&1
ECHO Exit with error %ERRORLEVEL% >> %LOGFILE%

:GOEXIT

SET LOGFILE=
SET DOMAIN=
SET SERVER1=
SET SERVER2=
SET SERVER3=

Con questo ho finito.
Alla prossima.

Qual’è il mio indirizzo IP su Internet?

Se vuoi sapere qual’è il tuo indirizzo IP sulla rete in questo momento, te lo dico io:





Di seguito il codice asp utilizzato per raccogliere questa informazione:

<html>
<body>
<%
Dim myIP

myIP = Request.ServerVariables(“HTTP_X_FORWARDED_FOR”)
If myIP=”" Then myIP = Request.ServerVariables(“REMOTE_ADDR”)
response.write “Il tuo è: ” & myIP & “.”
%>
</body>
</html>

Modificare le impostazioni di rete “al volo” (netsh e file di registro)

Chi come me usa un computer portatile fornito dall’azienda per lavoro, ha spesso la necessità di modificare al volo le impostazioni di rete.
Qualche anno fa, prima di diventare un consulente, lavoravo come amministratore di rete per la stessa società in cui lavoro oggi.
Le richieste di aiuto più frequenti erano legate alla impossibilità di navigare sulla rete. Nella maggior parte dei casi passavo ore al telefono spiegando cosa fare per cambiare indirizzo IP, DNS, Proxy, …
Senza considerare poi che quasi tutti i consulenti “vorrebbero” utilizzare il portatile sdraiati sul divano davanti la tv con la scusa di “lavorare da casa”.
Oggi esistono tanti programmi in grado di modificare in tempo reale le impostazioni di rete ma qualche anno fa trovare una soluzione completa non era facile.
Di seguito vi presento due script in VB Script che ho scritto velocemente nel mio tempo libero e che aiutano l’utente a modificare le impostazioni di rete senza dover installare programmi sul portatile.

Change IP
Il primo script si chiama Change IP ed implementa un piccolo tool che raccoglie le preferenze dell’utente e le salva in un file di input compatibile con netsh (network shell).
netsh è una utilità di windows eseguibile dalla console che consente di modificare tutti i parametri di rete che normalmente vengono gestiti tramite le proprietà della periferica ovvero tramite il pannello di controllo.
Dopo aver salvato il file di input (con estensione .conf), viene creato un link a netsh sul desktop.
Basta richiamare il link (con privilegi di amministratore) per cambiare al volo le impostazioni di rete.
Nonostante fosse possibile fare a meno di netsh impiegando solo codice vbscript, scelsi questa soluzione perchè non avevo molto tempo da dedicare allo sviluppo e volevo dare all’utente la possibilità di spostare le preferenze di rete da un portatile ad un altro senza per forza dover utilizzare il codice vbs.
Per chi deve gestire una rete questo approccio torna comodo perché basta creare il file di input una sola volta per poi distribuirla su tutti i portatili aziendali.

Cosa fa il codice sorgente
Lo script si limita a catalogare le risorse di rete disponibili e raccogliere le preferenze espresse dall’utente inserendole in un file di testo con estensione .conf.
Per enumerare le periferiche di rete viene richiamato il comando netsh:

netsh interface ip show config

E questo è un esempio del risultato:

Configurazione per l’interfaccia “Connessione alla rete locale (LAN)”
DHCP abilitato: Sì
MetricaInterfaccia: 0
Server DNS configurati tramite DHCP: Nessuno
Server WINS configurati tramite DHCP: 10.0.0.20
10.0.0.130
Registratore con suffisso: Solo primario

Configurazione per l’interfaccia “Connessione rete senza fili”
DHCP abilitato: Sì
MetricaInterfaccia: 0
Server DNS configurati tramite DHCP: Nessuno
Server WINS configurati tramite DHCP: Nessuno
Registratore con suffisso: Solo primario

Di seguito riporto per comodità un esempio di file conf creato tempo fa per connettermi ad modem ethernet dotato di bootloader adam2:

#————————————————–
# Change IP 1.1 by vittorio benintende
#
# Questo file è stato generato automaticamente.
# Non modificarlo!!!
#
# Per informazioni scrivere a:
# vittorio.@lucullo.it
#————————————————–

# Configurazione IP interfaccia Connessione alla rete locale (LAN)

pushd interface ip
set address name = “Connessione alla rete locale (LAN)” source = static addr = 10.0.0.1 mask = 255.255.255.0
set dns name = “Connessione alla rete locale (LAN)” source = static
set wins name = “Connessione alla rete locale (LAN)” source = static
popd

# Termine della configurazione IP interfaccia

Change Proxy
Il secondo script si comporta in modo differente. Questa volta viene demandato al programma di salvare le preferenze dell’utente in un file (sempre con estensione .conf) e di modificare le chiavi di registro per rendere effettive le modifiche necessarie.

Le informazioni gestite con questo piccolo tools sono le stesse raggiungibili tramite l’icona Opzioni Internet ovvero Internet Explorer (Strumenti > Opzioni Internet).
All’avvio dello script un apposito menu guida l’utente tra le varie opzioni.
Le impostazioni relative alla connessione con il proxy vengono tenute nel file di registro di windows e sono reperibili tramite il comando regedit al seguente percorso:

HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings

VB script ed antivirus
Mi è capitato di notare che alcuni antivirus (vedi ad esempio Norton AV) inibiscono l’esecuzione degli script.
Qualora ci fossero problemi in tal senso il mio consiglio è quello di impostare l’av in modo da consentirne l’esecuzione piuttosto che disattivare il programma di scansione residente in memoria.

Sorgenti

Network Manager 1.1

Per saperne di più
Il comando netsh
Impostare il proxy in MS Windows