I wrote this years ago but I removed my old web site so it was no longer available. although is it based on ISA 2004 I am sure it can be easily update to the more recent versions.
I use a cmd file to call the vbscript and put all files in the “c:\Program Files\Microsoft Firewall Client 2004\” Directory
Last update 27thOct05
SetISAServer.cmd
cscript //NoLogo “C:\Program Files\Microsoft Firewall Client 2004\SetISAServer.vbs” server1.networking-guru.net server2.networking-guru.net
The following code does
- standard ping test to see if the ISA servers (passed as arguments) is alive and evaluate two response times
- Set the quickest response as the preferred ISA server in the firewall client using the firewall client tool. Available from Microsoft (MS Download)
- Verifies ISA server is operational using firewall client tool.
I haven’t been able to full test the pingserver functionality of the FWCTOOL.
I would think it is only compatible with windows xp and above due to the use of Win32_PingStatus
SetISAServer.vbs
'==========================================================================
'
'
' NAME: SetISAServer
'
' AUTHOR: Guru , Networking-Guru.net
' DATE : 26/10/2005
'
' beta 1 release - initial release
'beta 2 release 27/10:2005 12:01 BST - updated fwctool pingserver should now work
'==========================================================================
Dim FWServer1
Dim FWServer2
Dim FWServer1ResponseTime
Dim FWServer2ResponseTime
Dim PreferedFWServer
Dim objShell
Dim returncode
FWServer1=Wscript.Arguments(0)
FWServer2=Wscript.Arguments(1)
wscript.echo "Info: Server1=" & FWServer1
wscript.echo "Info: Server2=" & FWServer2
FWServer1ResponseTime = 0
FWServer2ResponseTime = 0
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colPings = objWMIService.ExecQuery _
("Select * From Win32_PingStatus where Address = " & "'" & FWServer1 & "'")
' Ping Server 1 and get response time
For Each objStatus in colPings
If IsNull(objStatus.StatusCode) or objStatus.StatusCode<>0 Then
FWServer1ResponseTime = 99999999
Else
FWServer1ResponseTime = objStatus.ResponseTime
End If
Next
' Ping Server 1 again and get response time
Set colPings = objWMIService.ExecQuery _
("Select * From Win32_PingStatus where Address = " & "'" & FWServer1 & "'")
For Each objStatus in colPings
If IsNull(objStatus.StatusCode) or objStatus.StatusCode<>0 Then
FWServer1ResponseTime=FWServer1ResponseTime + 99999999
Else
FWServer1ResponseTime= FWServer1ResponseTime + objStatus.ResponseTime
End If
Next
' Calculate average Response Time
FWServer1ResponseTime= FWServer1ResponseTime /2
' Ping Server 2 and get response time
Set colPings = objWMIService.ExecQuery _
("Select * From Win32_PingStatus where Address = " & "'" & FWServer2 & "'")
For Each objStatus in colPings
If IsNull(objStatus.StatusCode) or objStatus.StatusCode<>0 Then
FWServer2ResponseTime = 99999999
Else
FWServer2ResponseTime = objStatus.ResponseTime
End If
Next
' Ping Server 2 again and get response time
Set colPings = objWMIService.ExecQuery _
("Select * From Win32_PingStatus where Address = " & "'" & FWServer2 & "'")
For Each objStatus in colPings
If IsNull(objStatus.StatusCode) or objStatus.StatusCode<>0 Then
FWServer2ResponseTime = FWServer2ResponseTime + 99999999
Else
FWServer2ResponseTime = FWServer2ResponseTime + objStatus.ResponseTime
End If
Next
' Calculate average Response Time
FWServer2ResponseTime = FWServer2ResponseTime/2
If FWServer1ResponseTime = 99999999 AND FWServer2ResponseTime = 99999999 then
' both ISA servers are unreachable do nothing
Wscript.Echo "Failure: ISA Servers unreachable"
wscript.quit(0)
elseif FWServer1ResponseTime=FWServer2ResponseTime then
' both ISA servers have the same response time, choose one at random
PreferedFWServer=FWServer1
elseif FWServer1ResponseTime<FWServer2ResponseTime then
PreferedFWServer=FWServer1
AlternateFWServer=FWServer2
else
' by elimination FWServer2 must be quicker
PreferedFWServer=FWServer2
AlternateFWServer=FWServer1
end if
wscript.echo "Info:" & FWServer1 & " AvgResponse=" & FWServer1ResponseTime
wscript.echo "Info:" & FWServer2 & " AvgResponse=" & FWServer2ResponseTime
wscript.echo "Info: PreferedServer =" & PreferedFWServer
Set objShell = WScript.CreateObject("WScript.Shell")
returncode=0
' Set the Prefered Server
cmdline = """C:\Program Files\Microsoft Firewall Client 2004\FwcTool.exe""" & " SetManualServer /Server:" & PreferedFWServer
wscript.echo "Info:" & cmdline
returncode = objShell.Run (cmdline,0,true)
wscript.echo "Info: ReturnCode=" & returncode
'Check that ISA Firewall Accessable is running on the desired server
cmdline = """C:\Program Files\Microsoft Firewall Client 2004\FwcTool.exe""" & " PingServer"
wscript.echo "Info:" & cmdline
returncode = objShell.Run (cmdline,0 ,true)
wscript.echo "Info: ReturnCode=" & returncode
if returncode <> 0 then
wscript.echo "Failure:" & PreferedFWServer & " ISA Server is unavailable"
' The Prefered Server has failed so let try the alternate
returncode=0
cmdline = """C:\Program Files\Microsoft Firewall Client 2004\FwcTool.exe""" & " SetManualServer /Server:" & AlternateFWServer
wscript.echo "Info:" & cmdline
returncode = objShell.Run (cmdline,0,true)
wscript.echo "Info: ReturnCode=" & returncode
if returncode <> 0 then
wscript.echo "Failure:" & AlternateFWServer & " ISA Server is unavailable"
wscript.echo "Failure: Both Server are unavailable"
else
wscript.echo "Success:" & AlternateFWServer & " ISA Server is operational"
End if
Else
wscript.echo "Success:" & PreferedFWServer & " ISA Server is operational"
End if