Pinger Class

JScript (non WMI based) "class" to be used from within *.wsf file

3 methods :
- pingHost(sHost) - Returns 'true' if host responds to ping using IP or NetBIOS name.
- getHostName(sIP) - Resolves IP address to computer's NetBIOS name
- getIP([sHostName]) - Will return IP address if host responds to ping by NetBIOS name.

File Name : PingerCLS.js
Requirement : WSH 5.6
Author : Branimir Petrovic
Submitted : 28/04/2002
Updated : 07/05/2002
Category : Class

To use a class, follow this syntax :
var MyObjClass = new MyClass;
WScript.Echo(MyObjClass.MyMethod());
//  FileName:   PingerCLS.js
//////////////////////////////////////////////////////////////////////
if (WScript.ScriptName == "PingerCLS.js") demo_PingerCLS();

// ======================== CLASS ====================================
function PingerCLS() {
//  Author:     Branimir Petrovic
//  Date:       6 May 2002
//  Version:    1.1.1   
//
//  Revision History:
//      12 Mar 2002     V 1.0.0
//      15 Mar 2002     V 1.0.1     Enhancement in getHostName(sIP ) method;
//                                  (added filter for names starting with 'IS~')
//      12 Apr 2002     V 1.1.0     Added getIP([sHostName]) method
//       6 May 2002     V 1.1.1     Changed implementation of pingHost(sHost) method
//                                  to work properly even when WINS database contains 
//                                  incorrect records (IP to HostName mappings).
//
//  Dependancies:
//      - WSH 5.6
//
//  Methods:
//      - getClassName()    //  Returns string: PingerCLS
//      - getVersion()      //  Returns version string "1.1.1".
//
//      - pingHost(sHost)   //  Returns 'true' if host responds to ping using IP 
//                              or NetBIOS name.
//
//      - getHostName(sIP)  //  Resolves IP address to computer's NetBIOS name
//
//      - getIP([sHostName])//  Will return IP address if host responds to ping 
//                              by NetBIOS name.

    //  --- Private Data Members ---
    var SELF = "PingerCLS";
    var VERSION = "1.1.1";
    var sIP;

    //  --- Public Methods ---
    this.getClassName = function () { return SELF; }
    this.getVersion = function () { return VERSION; }
    this.pingHost = pingHost;
    this.getHostName = getHostName;
    this.getIP = getIP;


    //  --- Constructor ---
    //  Will throw an exception if not run by CScript.exe:
    if (!isCScript()) {
        throw "Error in \"" + SELF + "\" constructor -> Must be run by CScript.exe!";
    }
    var oShell = new ActiveXObject("Wscript.Shell");
    //  >>> --- End of Consturctor --- >>>


    //  ---------------- Functions Implementing Public Methods -------
    function pingHost(sHost) {
        //  Returns 'true' if host responds to ping using IP or NetBIOS name.
        //
        //  If sHost is NetBIOS name (and not IP), and host responds to ping,
        //  IP address of responding host is converted to NetBIOS name, and
        //  both names - one we started with and one that actually responded - 
        //  are compared. If different, than we have hit WINS bug. when WINS 
        //  database has wrong IP->HostName mapping, therefore, return 'false'.
        //  (as if sHost did not respond at all).

        sIP = undefined;
        var sStdOut = "";
        var oRE = /Reply from/gi;
        var oRegXIP = /Pinging .+ \[?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\]? with .*/gi;

        var sCmdLn = "ping -n 1 " + sHost;
        var oExec = oShell.Exec(sCmdLn);
        var oExecOut = oExec.StdOut;
        var oObj = new Object();

        while (oExec.Status==0) {
            while (!oExecOut.AtEndOfStream) {
                sStdOut += oExecOut.ReadAll();
                WScript.Sleep(25);
            }
        }

        var fHostResponded = oRE.test(sStdOut);
        if ( fHostResponded ) {

            if (isHostName(sHost)) {
                // Make sure proper host responded (compensate for incorrect WINS records)
                var sMatchAry = oRegXIP.exec(sStdOut);

                if ("1" in sMatchAry) sIP = sMatchAry[1];
                else sIP = sHost;

                if (sHost.toUpperCase()==WScript.CreateObject("WScript.Network").ComputerName.toUpperCase()) {
                // getHostName would fail when sHost==LocalComputerName, therefore cut checking short:
                    return fHostResponded;               //  >>>
                }

                //  --- Start of 6 May 2002  change  ---
                //  Works around incorrect WINS database IP->NetBIOS mappings:
                if (isValidIP(sIP)) {
                    // Verifies that sIP belongs to the host name we expect:
                    if ( getHostName(sIP).toUpperCase()!=sHost.toUpperCase() ) fHostResponded = false;
                }
                //  --- End of 6 May 2002  change  ---
            } else sIP = sHost;

        }   //  --- end if (fHostResponded)

        return fHostResponded;                          //  >>>
    }

    //  --- Start of 11 Apr 2002  addition  ---
    function getIP(sHostName) {

        if (sHostName==undefined) {
            if (sIP) {
                //  sHostName was not supplied, but last pingHost() 
                //  captured IP address:
                return sIP;                             //  >>>
            } else return "";                           //  >>>
        }
        if ( isValidIP(sHostName) ) return sHostName;   //  >>>
        if (!pingHost(sHostName)) return "";            //  >>>

        //  We'll get here if sHostName is host name and not IP address,
        //  and host responded to pingHost(sHostName). sIP will as a
        //  consequence of ping will be populated with IP address string.
        return sIP;                                     //  >>>
    }
    //  --- End of 11 Apr 2002 addition     --- 

    function getHostName(sIP) {
        //  Resolves IP address to computer's NetBIOS name

        //  See if anybody's "home" (if host exists and responds)
        if (!pingHost(sIP)) return "";                  //  >>>

        //  Beware of the next twist: if sIP is not valid IP and host
        //  responded (wouldn't be at this point otherwise) then sIP
        //  parameter must be computer name and not the IP address:
        if (!isValidIP(sIP)) return sIP;                //  >>>

        //  At this point we know that host is on the network (it responds)
        //  and that sIP is valid IP adress (one with "alive" host), so 
        //  attempt in finding out its name is appropriate:

        var oRE_1 = /<00>\s+UNIQUE/;   
        //  picks up all lines of this type:
        //     JADE           <00>  UNIQUE      Registered

        //  --- Start of 15 Mar 2002  addition  ---
        //  Added '~' to regex to be able to "catch" names like:
        //     IS~JADE    <00>  UNIQUE      Registered
        //  extracts only computer name from the above line:
        var oRE_2 = /([-~\w]+)/;
        //  --- End of 15 Mar 2002 addition     --- 

        var sStdOut;
        var sCmdLn = "nbtstat -n -A " + sIP;
        var oExec = oShell.Exec(sCmdLn);

        while (oExec.Status==0) {
            while (!oExec.StdOut.AtEndOfStream) {
                WScript.Sleep(25);
                sStdOut = oExec.StdOut.ReadLine();
                if (oRE_1.test(sStdOut)) {
                    sStdOut = sStdOut.match(oRE_2)[0];
                    break;
                } else { sStdOut = ""; }
            }
        }

        //  --- Start of 15 Mar 2002  addition  ---
        // On some Win2K system very frst <00> entry is bound to IIS service:
        //      IS~JADE    <00>  UNIQUE      Registered
        //
        //  Only subsequent entry is the "real one":
        //      JADE    <00>  UNIQUE      Registered
        //
        //  To extract proper NetBIOS name look for '~' and if found use
        //  whatever is after it, if '~' is not part of string, then you 
        //  already got your name!

        nTildePos = sStdOut.indexOf("~");
        if (nTildePos!=-1) sStdOut = sStdOut.slice(nTildePos + 1);
        //  --- End of 15 Mar 2002 addition     ---

        return sStdOut;                                 //  >>>
    }

    //  ---------------- Helper Functions ----------------------------

    function isCScript() { return (/cscript.exe$/i).test(WScript.FullName); }

        //  --- Start of 6 May 2002  addition  ---
    function isHostName(sStr) {
        if ( (!isString(sStr))||(sStr.length>255) ) return false;
        return (!isValidIP(sStr));                      //  >>>
    }
    function isString(sStr) { try { return sStr.constructor==String; } catch(e) { return false; } }
        //  --- End of 6 May 2002  addition  ---

    function isValidIP(sIP) {
    //  Will return true if passed string is IP is OK and 

        if (typeof(sIP)!="string") return false;        //  >>>

        var sTmpIP;
        var oRegX = /(\d+)/g;
        if (!oRegX.test(sIP)) return false;             //  >>>
        var sAry = sIP.match(oRegX);
        if (sAry.length==4) {
            if (    (sAry[0]>0)&&(sAry[0]<255)
                &&  (sAry[1]<=255) 
                &&  (sAry[2]<=255)  
                &&  (sAry[3]<=255)  ) {
                sTmpIP = sAry[0] + "." + sAry[1] + "." + sAry[2] + "." + sAry[3];
                if (sTmpIP==sIP) {
                    return true;                        //  >>>
                }
            }
            return false;                               //  >>>
        } else {
                return false;                           //  >>>
        }
    }

}   // ======================== END OF CLASS =========================


//  ==================================================================
function demo_PingerCLS() {

    if (!isCScript()) {
        var oShell_PingerCLS = new ActiveXObject("WScript.Shell");
        var sCMD = "CScript //nologo \"" + WScript.ScriptFullName + "\"";
        //  Re-launches itself, this time using CScript:
        oShell_PingerCLS.Run(sCMD, 1, false);
        WScript.Quit();                                 //  >>>
    }

    var oP = new PingerCLS();
    var oWshNet =  WScript.CreateObject("WScript.Network");
    var sComputerName = oWshNet.ComputerName;

    WScript.Echo( "demo_PingerCLS():" );
    WScript.Echo();
    WScript.Echo("Pinging using your own computer name:\n");
    WScript.Echo( "\toP.pingHost(\"" + sComputerName + "\")   -> \t" + oP.pingHost(sComputerName) );
    WScript.Echo( "\toP.getIP(\"" + sComputerName + "\")      -> \t" + oP.getIP(sComputerName) );
    WScript.Echo( "\toP.getHostName(\"" + sComputerName + "\")-> \t" + oP.getHostName(sComputerName) );


    //  To see getHostName(sIP) 'in action' do use IP literal:
    var sIP = "192.168.200.42";
    WScript.Echo();
    WScript.Echo("Pinging using this IP address: " + sIP + "\n");
    WScript.Echo( "\toP.pingHost(\"" + sIP + "\")   -> \t" + oP.pingHost(sIP) );
    WScript.Echo( "\toP.getIP(\"" + sIP + "\")      -> \t" + oP.getIP(sIP) );
    WScript.Echo( "\toP.getHostName(\"" + sIP + "\")-> \t" + oP.getHostName(sIP) );

    WScript.Echo();
    WScript.Echo( "\t" + oP.getClassName() + "\t" + "Version " + oP.getVersion() );

    WScript.Sleep(10000);                               //  >>>

    function isCScript() { return (/cscript.exe$/i).test(WScript.FullName); }
}
Server Info
Remote Info
Compress

Batchs
BootSector
Droit
Accessoire GFA
On Now
Ecran plasma
Système d'exploitation
Son
Unités
Scripting
Multilingue
Site Web
Bruit et son
Architecture Google


4K
Color picker
TaskList
Backup files
Mini Port Scanner
Website To CHM
PixyDemo
Web password recovery
4KWebServer
Kill Popup
VBE decoder
Script Optimizer
Database Password Recovery
Class
Ini
EMail validator
Graphical Class
MP3 Info
Pinger Class
IP ranger class
SoftwareMetering
Path Validator
Time Stamper Class
LoggerCLS
HTA
Keyword Ranking
DOM Explorer
HTA-Notepad
PixyPortManager
Other
flashMessage
Kill Popup
VBE decoder (fixed)
Error Codes
Maze generator
Char counter
HTML To Word
ICQ Choose User
ScreenSaver Password decoder
Mp3Playlister - singleList
Long Filename To Short
Trace Math
Dump Hexa File
Self modifying script
Mp3Playlister - multiList
HTANoid
PixyWebServer
Python
Progress indication

©2002 Jean-Luc Antoine. All Rights Reserved. Scripts or any other material on this website may not be redistributed or put as part of ANY collection (script archives, CDs etc) without prior written permission. Permission granted to use and modify any of the scripts found on InterClasse.com