#131312 - 2004-12-17 11:42 PM
Re: MX Record lookup help
|
NTDOC
Administrator
Registered: 2000-07-28
Posts: 11624
Loc: CA
|
Okay, here is a Sample Script for demonstration purposes ONLY! It is not and should not be considered useful for any Production Environment. It is only a concept of how something like this could be used.
I've only posted the code here for those that "might" have been interested in the final script usage.
Currently KiXtart does not natively support a valid method of scripting a TELNET session.
1. Script runs MXRecordLookup to find list of all available SMTP mail servers 2. Script gets the current IP of the workstation during logon. 3. Script gets Antivirus information [in real life would only send mail if some condition like old definitions found were met] 4. Script checks if highest priority server is available, if not it checks for the next one in the list. 5. Once first available server is found it sends the e-mail via BLAT to that server
Code:
Break On Dim $SO $SO=SetOption('Explicit','On') $SO=SetOption('NoVarsInStrings','On') $SO=SetOption('WrapAtEOL','On') $SO=SetConsole('hide') Dim $CurrentIP,$NAVInfo,$MailerID,$MailerSubject,$MailerBody,$MailerAlert,$Record,$counter,$MailServer Global $MailerServer $Record=MXRecordLookup('somesmtpmailserver.com','somednsserver.com') $CurrentIP=GetCurrentIP() $NAVInfo=GetNavAntiVirusInfo() $MailerID='"'+Join(Split(@Fullname,','),'')+'<'+@UserID+'@@somecompany.com>'+'"' $MailerSubject='"KAM: Old Definitions "' $MailerBody='"Please check antivirus definitions ' + @CRLF + 'Definitions dated: ' + $NAVInfo[1] + @CRLF + 'AV Engine: ' + $NAVInfo[0] + @CRLF + 'Computer Name: ' + @WKSTA + @CRLF + 'Current IP: ' + $CurrentIP + @CRLF + 'NIC address: ' + @Address + @CRLF + 'Domain: ' + @DOMAIN + @CRLF + 'User ID: ' + @USERID + @CRLF + 'User Name: ' + @Fullname +'"' While $counter<= UBound($Record) And $MailerServer="" If MailServerUp($Record[$counter]) $MailerServer=$Record[$counter] $MailerAlert=BlatMailerAlert('some.administrator@@somecompany.com',$MailerID,$MailerSubject,$MailerBody) EndIf $counter=$counter+1 Loop If $MailerServer="" ? 'Unable to connect to any server' EndIf Function BlatMailerAlert($Recipient,$Sender,$Subject,$Body,optional $Attachment) Dim $SMTPServer,$MailerLine $SMTPServer=$MailerServer $MailerLine=@LDrive+'\blat.exe -' + ' -to ' + $Recipient + ' -f ' + $Sender + ' -subject ' + $Subject + ' -body ' + $Body + ' -server ' + $SMTPServer + ' -q ' Shell $MailerLine EndFunction Function MXRecordLookup($ComputerToFind,optional $Server) Dim $mxrecords[0],$MX,$Line,$Counter,$record,$c $MX=WshPipe("nslookup -q=mx " + $ComputerToFind + " " + $Server,1) For Each $Line in $MX If InStr($Line,"MX preference") ReDim PreServe $mxrecords[$Counter] $mxrecords[$Counter]="" + Trim(Split(Split($Line,",")[0],"=")[1]) + ":" + Trim(Split(Split($line,",")[1],"=")[1]) $Counter = $Counter + 1 EndIf Next $MXRecords=QS($mxrecords) For each $record in $mxrecords $MXRecords[$c]=split($record,":")[1] $c=$c+1 Next $MXRecordLookup=$MXRecords EndFunction Function QS($a) DIM $b[32],$c[32],$d,$e,$f,$g,$h,$i,$j,$k,$l $b[0]=0 $c[0]=UBOUND($a) $d=0 While $d >=0 $e=$b[$d] $f=$c[$d] While $e < $f $h=$e+($f-$e)/2 $k=$a[$e] $A[$e]=$A[$h] $A[$h]=$k $i=$e+1 $j=$f $l=0 Do While ($i<$j) AND $A[$e] > $A[$i] $i=$i+1 Loop While ($j>=$i) AND $A[$j] > $A[$e] $j=$j-1 Loop IF $i>=$j $l=1 ELSE $k=$A[$i] $A[$i]=$A[$j] $A[$j]=$k $j=$j-1 $i=$i+1 ENDIF Until $l=1 $k=$a[$e] $a[$e]=$a[$j] $a[$j]=$k $g=$j If $g-$e <= $f - $g If $g+1 < $f $b[$d]=$g+1 $c[$d]=$f $d=$d+1 Endif $f=$g-1 Else If $g-1 > $e $b[$d]=$e $c[$d]=$g-1 $d=$d+1 Endif $e=$g+1 Endif Loop $d=$d-1 Loop $qs=$a EndFunction Function WshPipe($ShellCMD, OPTIONAL $NoEcho) Dim $oExec, $Output $oExec = CreateObject("WScript.Shell").Exec($ShellCMD) If Not VarType($oExec)=9 $WshPipe="WScript.Shell Exec Unsupported" Exit 10 EndIf $Output = $oExec.StdOut.ReadAll + $oExec.StdErr.ReadAll If Not $NoEcho $Output Endif $WshPipe=Split(Join(Split($Output,CHR(13)),''),CHR(10)) Exit($oExec.ExitCode) EndFunction Function MailServerUp($mailserver) Dim $output,$,$fh,$line,$path $output='%temp%\output.txt' If Exist($output) Del $output EndIf Run '%comspec% /c telnet -f ' + $output + ' ' + $mailserver + ' 25' Sleep 2 $=EndProc('telnet.exe') Sleep 1 $fh=FreeFileHandle() If Open($fh,$output)=0 $line=ReadLine($fh) While @ERROR=0 If Left($line,3)=220 $MailServerUp=1 EndIf $line=ReadLine($fh) Loop $=Close($fh) EndIf If Exist($output) Del $output EndIf EndFunction Function EndProc($proc, optional $strComputer) DIM $Process If $strComputer='' $strComputer='.' EndIf For Each $Process In GetObject("winmgmts:{impersonationLevel=impersonate}!\\" + $strComputer + "\root\cimv2").ExecQuery("Select * from Win32_Process where Name= " +'"'+$Proc+'"') $Process=$Process.Terminate Next EndFunction Function GetCurrentIP() Dim $TempFile, $Line, $cf $TempFile = '%TEMP%\PING.TXT' If Exist($TempFile) Del $TempFile EndIf Shell '%COMSPEC% /C PING -n 1 ' + @WKSTA + '>'+$TempFile If open(1, $TempFile) = 0 $Line = ReadLine(1) While @ERROR = 0 If InStr($Line,@WKSTA) $Line = SubStr($Line,InStr($Line,"[")+1) $GetCurrentIP = SubStr($Line,1,InStr($Line,"]")-1) EndIf $Line = ReadLine(1) Loop $cf = Close(1) EndIf If Exist($TempFile) Del $TempFile EndIf EndFunction Function GetNavAntiVirusInfo(optional $wksta,optional $DateCheck,optional $WarnOldDef,optional $WarnNoNav) Dim $Defdate,$CurDef,$NAVHome,$NavExecutable,$NavParent,$OldDefs,$AlertOldDef,$NAVPath Dim $ClientType,$ReadClientType,$RegPath,$FilePath,$CurWksta,$NAVInfoArray[9] Dim $AlertNoNAV,$NoNavWarn,$NoNavMsg,$Notify $CurWksta = @WKSTA If $wksta = "" $wksta = @WKSTA EndIf If $wksta = $CurWksta $RegPath = "" Else $RegPath = '\\'+$wksta+'\' EndIf If $wksta = $CurWksta $FilePath = "" Else $FilePath = '\\'+$wksta+'\c$' EndIf If $DateCheck = "" $DateCheck = 14 EndIf $ReadClientType = ReadValue($RegPath+'HKLM\SOFTWARE\INTEL\LANDesk\VirusProtect6\CurrentVersion', 'ClientType') $Defdate = Left(Right(ReadValue($RegPath+'HKLM\SOFTWARE\Symantec\SharedDefs','NAVCORP_70'),12),8) $Defdate = Left($Defdate,4) + '/' + SubStr($Defdate,5,2) + '/' + Right($Defdate,2) $CurDef = DateCalc(@DATE, $Defdate) $NoNavWarn = ExistKey($RegPath+'HKLM\SOFTWARE\INTEL\LANDesk\VirusProtect6\CurrentVersion\Quarantine') $NoNavMsg = 'Unable to locate the Symantec/Norton AntiVirus program on this system. '+'[ '+$wksta+' ]' $NoNavMsg = $NoNavMsg+@CRLF+'Please contact the Helpdesk to have the program installed Or checked For problems ' $NoNavMsg = $NoNavMsg+'with a previous installation.' $NoNavMsg = $NoNavMsg+@CRLF+@CRLF+'Helpdesk x555-1212' If $NoNavWarn <> 0 If $WarnNoNav <> 1 $AlertNoNAV = MessageBox($NoNavMsg,'AntiVirus Program Update', 16,) EndIf EndIf $NAVHome = ReadValue($RegPath+'HKLM\software\INTEL\LANDesk\VirusProtect6\CurrentVersion\', 'Home Directory') $NAVPath = $NAVHome If $wksta <> $CurWksta $NAVPath = SubStr($NAVHome,3,) $NAVPath = $FilePath+$NAVPath EndIf $NavExecutable = GetFileVersion($NAVPath +'\vpc32.exe','ProductVersion') $NavParent = ReadValue($RegPath+'HKLM\SOFTWARE\Intel\LANDesk\VirusProtect6\CurrentVersion','Parent') Select Case $ReadClientType = 1 $ClientType = 'Connected Client' Case $ReadClientType = 2 $ClientType = 'Stand-alone Client' Case $ReadClientType = 4 $ClientType = 'Server' If $NavParent = "" $ClientType = 'Primary Server' EndIf Case $ReadClientType = "" $ClientType = 'Unknown' EndSelect $OldDefs = 'Warning: Your ANTI-VIRUS definition files are dated ' $OldDefs = $OldDefs +$Defdate+' which makes them '+$CurDef +' days old.' $OldDefs = $OldDefs +@CRLF+@CRLF+'Your system '+'[ '+$wksta+' ]'+' is vulnerable to recent worms Or viruses.' $OldDefs = $OldDefs +@CRLF+@CRLF+'Please contact the Helpdesk to help determine why your system ' $OldDefs = $OldDefs +'is Not automatically updating.' $OldDefs = $OldDefs +@CRLF+@CRLF+'Helpdesk x555-1212 ' $OldDefs = $OldDefs +@CRLF+@CRLF+'Antivirus Engine version: '+$NavExecutable $OldDefs = $OldDefs +@CRLF+'Antivirus Definition date: '+$Defdate $OldDefs = $OldDefs +@CRLF+'Age of Definition Files: '+$CurDef $OldDefs = $OldDefs +@CRLF+'Antivirus Parent Server: '+$NavParent $OldDefs = $OldDefs +@CRLF+'Antivirus Client Type: '+$ClientType $OldDefs = $OldDefs +@CRLF+'Antivirus Installation Folder: '+$NAVHome If $CurDef > $DateCheck $Notify = 2 If $WarnOldDef <> 1 $AlertOldDef = MessageBox($OldDefs,'AntiVirus - Old Definitions', 48,) EndIf EndIf $NAVInfoArray[0]=$NavExecutable $NAVInfoArray[1]=$Defdate $NAVInfoArray[2]=$NavParent $NAVInfoArray[3]=$ClientType $NAVInfoArray[4]=$NAVHome $NAVInfoArray[5]=$wksta $NAVInfoArray[6]=$NoNavWarn $NAVInfoArray[7]=$Notify $NAVInfoArray[8]=$CurDef $GetNavAntiVirusInfo=$NAVInfoArray EndFunction Function DateCalc($date1, $DateOrMod) Dim $_intDate1, $_intYear1, $_intMonth1, $_intDay1 Dim $_intDate2, $_intYear2, $_intMonth2, $_intDay2 If InStr ($date1,'/') <> 5 Or InStrRev ($date1,'/') <> 8 Or Len ($date1) <> 10 Exit (1) EndIf $_intYear1 = Val(SubStr($date1,1,4)) $_intMonth1 = Val(SubStr($date1,InStr($date1,'/')+1,2)) $_intDay1 = Val(SubStr($date1,InStrRev($date1,'/')+1,2)) If $_intMonth1 < 3 $_intMonth1 = $_intMonth1 + 12 $_intYear1 = $_intYear1 - 1 EndIf $_intDate1 = $_intDay1 + ( 153 * $_intMonth1 - 457 ) / 5 + 365 * $_intYear1 + $_intYear1 / 4 - $_intYear1 / 100 + $_intYear1 / 400 - 306 Select Case VarType($DateOrMod) = 3 $_intDate2 = $_intDate1 + $DateOrMod If InStr($_intDate2,'-') $_intDate2 = Val(SubStr($_intDate2,2,Len($_intDate2)-1)) EndIf $_intYear2 = ( 100 * ( ( ( 100*($_intDate2+306)-25)/3652425) - ( ((100*($_intDate2+306)-25)/3652425)/4) ) + (100*($_intDate2+306)-25) ) / 36525 $_intMonth2 = ( 5 * ( ( ( 100*($_intDate2+306)-25)/3652425) - ( ((100*($_intDate2+306)-25)/3652425)/4) + ($_intDate2+306) - 365 * $_intYear2 - $_intYear2 / 4 ) + 456 ) / 153 $_intDay2 = ( ( ( 100*($_intDate2+306)-25)/3652425) - ( ((100*($_intDate2+306)-25)/3652425)/4) + ($_intDate2+306) - 365 * $_intYear2 - $_intYear2 / 4 ) - ( 153 * $_intMonth2 - 457 ) / 5 If $_intMonth2 > 12 $_intYear2 = $_intYear2 + 1 $_intMonth2 = $_intMonth2 - 12 EndIf If Len($_intYear2 ) < 4 $_ = Execute("For $i=1 to 4-Len($$_intYear2) $$_intYear2 = '0' + $$_intYear2 Next") EndIf If Len($_intMonth2) < 2 $_intMonth2 = "0$_intMonth2" EndIf If Len($_intDay2 ) < 2 $_intDay2 = "0$_intDay2" EndIf $DateCalc = '$_intYear2/$_intMonth2/$_intDay2' Case VarType($DateOrMod) = 8 If InStr ($DateOrMod,'/') <> 5 Or InStrRev ($DateOrMod,'/') <> 8 Or Len ($DateOrMod) <> 10 Exit (1) EndIf $_intYear2 = Val(SubStr($DateOrMod,1,4)) $_intMonth2 = Val(SubStr($DateOrMod,InStr($DateOrMod,'/')+1,2)) $_intDay2 = Val(SubStr($DateOrMod,InStrRev($DateOrMod,'/')+1,2)) If $_intMonth2 < 3 $_intMonth2 = $_intMonth2 + 12 $_intYear2 = $_intYear2 - 1 EndIf $_intDate2 = $_intDay2 + ( 153 * $_intMonth2 - 457 ) / 5 + 365 * $_intYear2 + $_intYear2 / 4 - $_intYear2 / 100 + $_intYear2 / 400 - 306
$DateCalc = $_intDate1 - $_intDate2 ;comment the Next line If you wish to return negative results also !!! If InStr($DateCalc,'-') $DateCalc = Val(SubStr($DateCalc,2,Len($DateCalc)-1)) EndIf Case 1 Exit (1) EndSelect EndFunction
|
Top
|
|
|
|
#131323 - 2004-12-20 05:42 PM
Re: MX Record lookup help
|
Chris S.
MM club member
Registered: 2002-03-18
Posts: 2368
Loc: Earth
|
Quote:
I think Ruud should come-out with a .net version of Kix (or a version of Kix that can be used with .net (subtle diff)), keep the legacy support ... then all this talk about what should and shouldn't go into Kix will be a mute point ... EVERYTHING will be available from Kix.
Love your idea, Shawn.
Pet peeve time. It's moot not mute. Other than that, I think you're a genius.
|
Top
|
|
|
|
#131325 - 2004-12-20 08:49 PM
Re: MX Record lookup help
|
Co
MM club member
Registered: 2000-11-20
Posts: 1341
Loc: NL
|
|
Top
|
|
|
|
#131326 - 2004-12-20 09:33 PM
Re: MX Record lookup help
|
Co
MM club member
Registered: 2000-11-20
Posts: 1341
Loc: NL
|
|
Top
|
|
|
|
#131329 - 2004-12-21 12:55 AM
Re: MX Record lookup help
|
Co
MM club member
Registered: 2000-11-20
Posts: 1341
Loc: NL
|
|
Top
|
|
|
|
Moderator: Arend_, Allen, Jochen, Radimus, Glenn Barnas, ShaneEP, Ruud van Velsen, Mart
|
0 registered
and 505 anonymous users online.
|
|
|