Toivo Talikka

Total Data Pty Ltd

Computer system installation, support and IT management consultancy

Forestville NSW Australia        tel 0410 532 923       email toivo@totaldata.biz

Toivo's TechTips Corner

KiXtart Script Example

Overview

The script has been written in KiXtart 2010. It is used in Windows XP workstations at a remote location, which is normally connected to a domain server, a Windows Server 2003 located at the Head Office. The script determines if the workstation has established a connection to the domain server. If the the domain server is unavailable, the script joins the workstation to a workgroup, consisting of the local PCs, and restarts. If the user logs in after the WAN connection to the domain server has been restored, the script automatically joins the workstation into the domain and restarts the PC.

Licensing

The source code is licensed under the GNU General Public Licence (GPL). The documentation is licensed under GNU Free Documentation License (GFDL).

Design Principles

The design objective was to make the source code easy to understand and simple to modify. Hard coding was limited to a few constants in a separate include file.

Test Environment

The script was tested in a single location with two Windows XP workstations and a Windows Server 2003 connected through a network switch. The WAN off-line situation was simulated by disconnecting the server from the network switch.

Installation Instructions

The following instruction describe step by step how to install the necessary utilities and which directories to create on the PC. The rest of the configuration is done by the script checkconfig.kix which only needs to be run once. The module checkdomain.kix can be run as soon as the configuration files have been set up on the hard drive. The variables in the beginning of the include file include.kix define the names for the domain, the in-store server and a domain name on the internet which can be pinged as part of the connectivity test.

Download Modules

Right click the link and select 'Save Link As...' to save the folder to your local hard drive.

Expand the archive.

Configuration

Login as the local administrator and go to the C: drive. Create the directory ServerCheck. Give full access rights to all the users of the local workstation.

Create the directory KiXtart and give the users of the local workstation read access. Download and install the KiXtart 2010 application there.

Create the directory Script and copy the KiXtart scripts from the archive checkdomain.zip there.

Create the directory Netdom. Download and install the program netdom.exe version 1.8 from the Windows NT Resource Kit in the Netdom directory.

Install the later version of netdom.exe, version 2.0, from the netdom.exe v2.0 - Windows XP SP Support Tools into the default location C:\Program Files\Support Tools.

The short .cmd file calling the actual login script can be installed either to the startup folder C:\Documents and Settings\All Users\Start Menu\Programs\Startup, or you can use gpedit.msc to set up a local policy and run the .cmd script file for all users in C:\Windows\System32\Group Policy\User\Scripts\Logon. The checkdomain.cmd file contains just two lines:

@echo off
START /W /B /I C:\KiXtart\wkix32 C:\script\checkdomain

Set up a script checkconfig.cmd to run the configuration script:

@echo off
START /W /B /I C:\KiXtart\wkix32 C:\script\checkconfig

Check the names of the domain, the local server and the internet domain in the include file C:\Script\Include.kix and modify them to suit your system. Modify the domain administrator password in the script checkconfig.kix and checkdomain.kix - see Part VIII b below.

Run the configuration script checkconfig.cmd. It runs the KiXtart script which sets up the configuration, test and status folders inside the folder C:\ServerCheck.

Tools and Utilities

The following free tools and utilities were used in the development of the scripts.

Windows Tools

The following tools and utilities were used to achieve the required functionality under Windows.

Appendix

Main Module

The main module of the installation script checkconfig.kix is explained and listed below section by section. The normal day-to-day script checkdomain.kix is a cut-down version of checkconfig.kix. It does not create the configuration, test and status folders.

Initial Directory Listing

The module gets its constant definitions and text variables from an include file. A directory listing of the folder containing the configuration files is produced. If the directory does not exist or is empty, the folder structure is set up.

;
; CHECKCONFIG.KIX
;
; Script to create config directory and config files
;   Copyright (C) 2006 Toivo Talikka
;   All rights reserved.
;
; 6/11/2006 TJT
;
; Pre-requisites:  workstation connected to LAN, WAN and one Domain Controller
;
BREAK ON
INCLUDE "C:\script\include.kix"

; directory listing
$files = 0
$config_dir_list = DIR($config_dir+"*.*")
IF $config_dir_list <> "" AND @ERROR = 0
;	directory not empty: keep existing settings if files exist (count > 2)
	WHILE $config_dir_list <> "" AND @ERROR = 0
		$files = $files + 1
		$config_dir_list = DIR() ; retrieve next file
	LOOP
ENDIF
IF $files < 3
;	dir empty or it does not exist: set up configuration directory
	MD $config_dir
; check status
	MD $test_dir
	MD $status_dir
ENDIF

Part I Configuration Files

The first part of the setup checks the existence of the configuration files containing the name of the domain, a domain name for the ping command and the name of the local server. If the configuration files do not exist, the contents of the corresponding variable from the include file is written to the file. Also the name of the local workstation and the domain login server name from the registry are written to their respective files.

;----------------------
; Part I config files
;----------------------
; check or set config files: domain, internet, instore_server
; 
$domain = ""
$error_message = ""
IF EXIST($domain_config_path)
	$domain = GetValueFromFile($domain_config_path)
ENDIF

IF $domain = "" 
	$domain = $default_domain
	$file_status = PutValueToFile($domain_config_path, $domain)
	IF @ERROR OR $file_status
		MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to create $domain_config_path", $icon_exclamation)
      	exit 9
	ENDIF
	
ENDIF

$internet = ""
$error_message = ""
IF EXIST($internet_config_path)
	$internet = GetValueFromFile($internet_config_path)
ENDIF

IF $internet = "" 
	$internet = $default_internet_domain
	$file_status = PutValueToFile($internet_config_path, $internet)
	IF @ERROR OR $file_status
		MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to create $internet_config_path", $icon_exclamation)
      	exit 9
	ENDIF
ENDIF

$instore_server = ""
$error_message = ""
IF EXIST($instore_config_path)
	$instore_server = GetValueFromFile($instore_config_path)
ENDIF

IF $instore_server = ""
	$instore_server = $default_instore_server
	$file_status = PutValueToFile($instore_config_path, $instore_server)
	IF @ERROR OR $file_status
		MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to create $instore_config_path", $icon_exclamation)
      	exit 9
	ENDIF
ENDIF

; set config files: pc, pdc
$pc = GetValueFromFile($pc_config_path)
IF $pc = "" OR @ERROR <> 0
	$file_status = PutValueToFile($pc_config_path, @WKSTA)
	IF @ERROR OR $file_status
		MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to create $pc_config_path", $icon_exclamation)
      	exit 9
	ENDIF
ENDIF

; login server name from registry
$pdc = GetValueFromFile($pdc_config_path)
IF $pdc = "" OR @ERROR <> 0
	$pdc = SUBSTR(@LSERVER, 3)  ; drop \\
	$file_status = PutValueToFile($pdc_config_path, $pdc)
	IF @ERROR OR $file_status
		MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to create $pdc_config_path", $icon_exclamation)
      	exit 9
	ENDIF
ENDIF

Part II Default Gateway

The second part uses the inbuilt function ENUMIPINFO to get the settings of the the network interface from the registry, including the IP address, subnet mask, adapter description and default gateway. The program then pings the default gateway using a shell command and redirecting the output to a text file. The function GetPingResult extracts the line containing the percentage of lost packets, and if the loss is zero percent, the PC is deemed to be connected to the default gateway device. The status ONLINE is written to the gateway status file.

;--------------------------
; Part II  default gateway
;--------------------------
;
$ip_address = ENUMIPINFO(0,0)
; check if error
if @error 
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to access IP Address information", $icon_exclamation)
      exit 9
endif

$subnet_mask = ENUMIPINFO(0,1)
if @error 
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to access Subnet Mask information", $icon_exclamation)
      exit 9
endif

$adapter_description = ENUMIPINFO(0,2)
if @error
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to access Adapter Description", $icon_exclamation)
      exit 9
endif

$default_gateway = ENUMIPINFO(0,3)
if @error 
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to access Default Gateway information", $icon_exclamation)
      exit 9
endif

$ip_info = "IP address: " + $ip_address + chr(13) + "Subnet mask: " + $subnet_mask + chr(13) + "Adapter:" 
+ $adapter_description + chr(13) + "Default Gateway: " + $default_gateway

; ping default gateway
$gateway_connected = ""
$gateway_status = $offline
$shell_command = $ping_command + $default_gateway + " > " + $ping_test_path

shell '%COMSPEC% /C $shell_command'
; save result in test directory
COPY $ping_test_path $gateway_test_path /C
$gateway_ping_result = GetPingResult($ping_test_path)
;look for string  (0% loss)
IF INSTR($gateway_ping_result, $good_ping_result)
	$gateway_connected = "Yes"
	$gateway_status = $online
ENDIF

; write status indicator
$file_status = WriteStatusFile($gateway_status_path, $gateway_status)
IF @ERROR OR $file_status
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to create $gateway_status_path", $icon_exclamation)
     	exit 9
ENDIF

Part III Instore Server

This part of the module pings the instore server to find out its status. The result is written to a status file.

;--------------------------
; Part III  instore server
;--------------------------
;
; ping instore server using name; if dc is offline, ping by name only works in workgroup
$instore_server_connected = ""
$instore_server_status = $offline
$shell_command = $ping_command + $instore_server + " > " + $ping_test_path

shell '%COMSPEC% /C $shell_command'
COPY $ping_test_path $instore_server_test_path /C
; save result in test directory
$instore_server_ping_result = GetPingResult($ping_test_path)
;look for string  (0% loss)
IF INSTR($instore_server_ping_result, $good_ping_result)
	$instore_server_connected = "Yes"
	$instore_server_status = $online
ENDIF

; write status indicator
$file_status = WriteStatusFile($instore_server_status_path, $instore_server_status)
IF @ERROR OR $file_status
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to create $instore_server_status_path", $icon_exclamation)
   	exit 9
ENDIF

Part IV Primary Domain Controller

The module pings the domain controller using its name to find out its status. The result is written to a status file.

;--------------------------
; Part IV  pdc
;--------------------------
;
; ping domain controller using computer name
$pdc_connected = ""
$pdc_status = $offline
$shell_command = $ping_command + $pdc + " > " + $ping_test_path

shell '%COMSPEC% /C $shell_command'
; save result in test directory
COPY $ping_test_path $pdc_test_path /C
$pdc_ping_result = GetPingResult($ping_test_path)
;look for string  (0% loss)
IF INSTR($pdc_ping_result, $good_ping_result)
	$pdc_connected = "Yes"
	$pdc_status = $online
ENDIF

; write status indicator
$file_status = WriteStatusFile($pdc_status_path, $pdc_status)
IF @ERROR OR $file_status
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to create $pdc_status_path", $icon_exclamation)
     	exit 9
ENDIF

Part V Internet

The module pings a domain name in the internet to find out if the LAN is connected to the internet. The result is written to a status file.

;--------------------------
; Part V  internet
;--------------------------
;
; ping domain in internet
$internet_connected = ""
$internet_status = $offline
$shell_command = $ping_command + $internet + " > " + $ping_test_path

shell '%COMSPEC% /C $shell_command'
COPY $ping_test_path $internet_test_path /C
$internet_ping_result = GetPingResult($ping_test_path)
;look for string  (0% loss)
IF INSTR($internet_ping_result, $good_ping_result)
	$internet_connected = "Yes"
	$status = $online
ENDIF

; write status indicator
$file_status = WriteStatusFile($internet_status_path, $internet_status)
IF @ERROR OR $file_status
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to create $internet_status_path", $icon_exclamation)
     	exit 9
ENDIF

Part VI Domain or Workgroup

The module checks if the workstation is in the server domain or in a workgroup by making a query using the netdom command in a shell command.

;--------------------------
; Part VI  domain or workgroup
;--------------------------

; check current status from netdom v1.8 query
$shell_command = $netdom18_query + " > " + $query_test_path

$in_workgroup = ""
$in_domain = ""
shell '%COMSPEC% /C $shell_command'
$wg_query_result = GetValueFromFile($query_test_path)
;look for string  workgroup
IF INSTR($wg_query_result, $str_workgroup)
	$in_workgroup = "Yes"
   ELSE
	$in_domain = "Yes"
ENDIF

Part VII Summary

The module writes into a status file the connectivity status of the workstation when trying to connect to the domain controller, the internet, the instore server and the default gateway, and if the workstation is a member of the domain or a workgroup.

;--------------------------
; Part VII  summary
;--------------------------

IF EXIST($status_summary_path)
	DEL $status_summary_path /C
ENDIF
IF OPEN(5, $status_summary_path, 5) <> 0
; open for write access, create if it does not exist
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to open to $status_summary_file", $icon_exclamation)
	exit 9
ENDIF

$status_line = "Domain Controller "+$pdc+" is "+$pdc_status
$result = AppendToFile(5, $status_line)
IF @ERROR
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to write to $status_summary_file", $icon_exclamation)
	exit 9
ENDIF

$status_line = "Internet connection is "+$internet_status
$result = AppendToFile(5, $status_line)
IF @ERROR
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to write to $status_summary_file", $icon_exclamation)
	exit 9
ENDIF

$status_line = "Instore Server "+UCASE($instore_server)+" is "+$instore_server_status
$result = AppendToFile(5, $status_line)
IF @ERROR
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to write to $status_summary_file", $icon_exclamation)
	exit 9
ENDIF

$status_line = "Default Gateway "+$default_gateway+" is "+$gateway_status
$result = AppendToFile(5, $status_line)
IF @ERROR
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to write to $status_summary_file", $icon_exclamation)
	exit 9
ENDIF

; domain or workgroup status
$result = AppendToFile(5, $wg_query_result)
IF @ERROR
	MESSAGEBOX(@ERROR+' '+@SERROR, "Unable to write to $status_summary_file", $icon_exclamation)
	exit 9
ENDIF
CLOSE(5)

Part VIII Go to Workgroup or Domain

The module has now enough information to decide what to do. If the workstation cannot connect to the domain server but the workstation is already in a workgroup, nothing needs to be done. If the workstation can connect to the domain server but the workstation is already a member of the domain, nothings needs to be done.

If the workstation cannot connect to the domain server and the workstation is a member of the domain, the workstation needs to join the workgroup because the site is off-line. The joining is done by calling the netdom version 1.8 command. After the operation is finished, the workstation will show a warning message and restart automatically in 10 seconds.

If the workstation has been able to connect to the domain server but the workstation is a member of a workgroup because of an earlier off-line situation, the workstation needs to join the domain. The joining is done by calling the netdom version 2.0 command. After the operation is finished, the workstation will show a warning message and restart automatically in 10 seconds.

Note that the domain administrator password is hard coded in this section of the code. It is possible to tokenize a KiXtart script so that the password - and the code - are stored in a scrambled form.

;-------------------------------------
; Part VIII  go to workgroup or domain
;-------------------------------------

; current status from netdom query; do nothing if no change 
IF NOT $pdc_connected AND $in_workgroup
; domain controller offline but we are already in workgroup
;	? "PDC is NOT connected and PC is in workgroup"
;	? "Press Enter to continue..."
;	GET $char
	EXIT 0
ENDIF

IF $pdc_connected AND $in_domain
; domain controller online but we are already in domain
;	? "PDC is connected and PC is domain"
;	? "Press Enter to continue..."
;	GET $char
	EXIT 0
ENDIF

IF NOT $pdc_connected AND $in_domain
; join workgroup and restart
;	? "PDC is NOT connected and PC is in domain - need to join workgroup"
;	? "Press Enter to continue..."
;	GET $char

	$shell_command = $netdom18_join + @WKSTA + " /joinworkgroup " + $domain

	shell '%COMSPEC% /C $shell_command'
; we can get error 8478 'Could not find controller for this domain'
; but restart fixes it; issue restart but do not force it
	$restart_msg = "Joined workgroup $domain - restarting now"
	$wait_sec = 10
	$force = 0	; do not force
	$restart_now = 1 ; reboot
	SHUTDOWN("", $restart_msg, $wait_sec, $force, $restart_now)
	exit 0
ENDIF

IF $pdc_connected AND $in_workgroup
; join domain
;	? "PDC is NOT connected and PC is in domain - need to join domain"
;	? "Press Enter to continue..."
;	GET $char
	CD $tools_dir
	$shell_command = $netdom20_join + @WKSTA + " /domain:" + $domain + " /userd:administrator /passwordd:myadminpass#2 " +$reboot_in_10
	shell '%COMSPEC% /C $shell_command'
; we can get errors but restart fixes them
	EXIT 0
ENDIF
Exit 0
;----------------------
; functions
;----------------------

Include File

The constants and text variables are defined in a separate file include.kix which is loaded in the main module using the INCLUDE statement. The first three variables need to be modified to suit the domain and server names.

$default_domain = "testdomain"
$default_internet_domain = "www.telstra.com.au"
$default_instore_server = "store2srv"
;------------------
$reboot_in_10 = "/reboot:10"
; wait for 10 seconds before reboot
$ping_command = "ping -n 2 -w 500 "
; ping twice, timeout 500ms
$good_ping_result = "(0% loss)"
$str_packets = "Packets:"
;------------------
$netdom18_join = "C:\Netdom\netdom member \\"
$netdom18_query = "C:\Netdom\netdom /noverbose query"
$str_workgroup = "workgroup"

$netdom20_join = "netdom join "

;------------------
$tools_dir = "C:\Program Files\Support Tools\"

;------------------
$config_dir = "C:\ServerCheck\config\"
$test_dir = "C:\ServerCheck\test\"
$status_dir = "C:\ServerCheck\status\"
;
;------------------
$icon_stop = 16
$icon_question = 32
$icon_exclamation = 48
$icon_info = 64
;------------------
$online = "online"
$offline = "offline"
;------------------
; filenames
$domain_file = "domain.txt"
$internet_file = "internet.txt"
$instore_server_file = "instore_server.txt"
$pc_file = "pc.txt"
$pdc_file = "pdc.txt"
$gateway_file = "gateway.txt"
$ping_file = "pingfile.txt"
$query_file = "queryfile.txt"
;------------------
; config directory
$config_config_path = $config_dir+$config_file
$domain_config_path = $config_dir+$domain_file
$internet_config_path = $config_dir+$internet_file
$instore_config_path = $config_dir+$instore_server_file
$pc_config_path = $config_dir+$pc_file
$pdc_config_path = $config_dir+$pdc_file
;------------------
; test directory
$ping_test_path = $test_dir+$ping_file
$query_test_path = $test_dir+$query_file
$domain_test_path = $test_dir+$domain_file
$pc_test_path = $test_dir+$pc_file
$pdc_test_path = $test_dir+$pdc_file
$gateway_test_path = $test_dir+$gateway_file
$internet_test_path = $test_dir+$internet_file
$instore_server_test_path = $test_dir+$instore_server_file
;------------------
; status directory

; connection status files: value = online/offline on line 1, date and time on line 2
; $pdc_file, $internet_file defined above
$status_summary_file = "status.txt"
; logon and startup status files:  date, time, user (if applicable)
$logon_status_file = "logon.txt"
$logoff_status_file = "logoff.txt"
$startup_status_file = "startup.txt"
$shutdown_status_file = "shutdown.txt"
;
$pdc_status_path = $status_dir+$pdc_file
$internet_status_path = $status_dir+$internet_file
$gateway_status_path = $status_dir+$gateway_file
$instore_server_status_path = $status_dir+$instore_server_file
$status_summary_path = $status_dir+$status_summary_file
$logon_status_path = $status_dir+$logon_status_file
$logoff_status_path = $status_dir+$logoff_status_file
$startup_status_path = $status_dir+$startup_status_file
$shutdown_status_path = $status_dir+$shutdown_status_file
;-----------------

KiXtart Functions

A number of KiXtart functions were developed for the project. They are stored at the end of each module. These functions includes reading a line from a text file, writing to a text file and retrieving values from status files

GetValueFromFile($textfile)

Retrieves the first line from a text file and closes the file. If the file cannot be opened or read, the function returns an error status.

Function GetValueFromFile($textfile)
; return contents of the first line of a text file
   $GetValueFromFile = ""
   IF OPEN(3, $textfile) = 0
     	$read_line = READLINE(3)
	IF @ERROR = 0
            $GetValueFromFile = LTRIM(RTRIM($read_line))
	ENDIF
	CLOSE(3)
    ELSE
	$GetValueFromFile = "Unable to open " + $textfile + " " + @ERROR + " " + @SERROR
      EXIT 9
  ENDIF	
EndFunction

PutValueToFile($textfile, $textvalue)

Deletes the file if it exists and then opens the file for write access, writes the contents of the second input parameter to the file and closes the file. If the file cannot be opened or if the write operation fails, the function returns an error status.

Function PutValueToFile($textfile, $textvalue)
; write one line of text to file, close file
   $PutValueToFile = ""
; delete old file
   IF EXIST($textfile)
	   DEL $textfile /C
   ENDIF
   IF OPEN(4, $textfile, 5) = 0
; open for write access, create if it does not exist
     	WRITELINE(4, $textvalue)
	IF @ERROR = 0
		CLOSE(4)
	  ELSE
      	$PutValueToFile = "Unable to write to " + $textfile + " " + @ERROR + " " + @SERROR
		EXIT 9
	ENDIF
    ELSE
	$PutValueToFile = "Unable to open or create " + $textfile + " " + @ERROR + " " + @SERROR
      EXIT 9
  ENDIF	
EndFunction

AppendToFile($filehandle, $textvalue)

Writes the contents of the second input parameter to the text file. If the write operation produces an error, the function returns an error status.

Function AppendToFile($filehandle, $textvalue)
; append a line of text to file
   $AppendToFile = ""
   $line = $textvalue + @CRLF
   WRITELINE($filehandle, $line)
   IF @ERROR <%gt; 0
   	$AppendToFile = "Unable to write to " + $status_summary_path + " " + @ERROR + " " + @SERROR
	EXIT 9
   ENDIF
EndFunction

WriteStatusFile($textfile, $line)

Deletes the file if it exists and then opens the file for write access, writes the contents of the first input parameter to the file and the date and time to the second line and closes the file. If the file cannot be opened or if the write operation fails, the function returns an error status.

Function WriteStatusFile($textfile, $line)
; write line of text to line 1 and date and time to line 2
   $WriteStatusFile = ""
   $time_stamp = @DATE+" "+@TIME

; delete old file
   IF EXIST($textfile)
	   DEL $textfile /C
   ENDIF
   IF OPEN(4, $textfile, 5) = 0
; open for write access, create if it does not exist
     	WRITELINE(4, $line+@CRLF)
	IF @ERROR <> 0
		$WriteStatusFile = "Unable to write to " + $textfile + " " + @ERROR + " " + @SERROR
		EXIT 9
	ENDIF
     	WRITELINE(4, $time_stamp)
	IF @ERROR <> 0
		$WriteStatusFile = "Unable to write to " + $textfile + " " + @ERROR + " " + @SERROR
		EXIT 9
	ENDIF
	CLOSE(4)
    ELSE
	$WriteStatusFile = "Unable to open or create " + $textfile + " " + @ERROR + " " + @SERROR
      EXIT 9
  ENDIF	
EndFunction

GetPingResult($textfile)

Opens the textfile and reads the first line from it. Reads the file until it finds a line starting with "Packets:" and returns the contents of the line. If the line is not found, the function returns an error status.

Function GetPingResult($textfile)
; extract number of packets from file containing ping output
   IF OPEN(3, $textfile) = 0
	$result_string = ""
     	$read_line = READLINE(3)
	WHILE @ERROR = 0
; look for lines starting with:  Packets:
            $offset = INSTR($read_line, $str_packets)
		IF $offset	 
			$result_string = $read_line
		ENDIF
		$read_line = READLINE(3)
      LOOP
      CLOSE(3)
	$GetPingResult = $result_string
    ELSE
	BEEP
	$GetPingResult = "Unable to open " + $textfile + " " + @ERROR + " " + @SERROR
      EXIT 9
  ENDIF	
EndFunction

This is the end of the source code and explanations for checkconfig.kix.


Made With Cascading Style Sheets Valid CSS! Valid XHTML 1.1!