PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : vbScript: IP-Adresse des DFÜ Adapters auslesen und in Datei speichern


Sephiroth
2004-06-10, 20:42:37
Die IP-Adresse des DFÜ Adapters auslesen, in einer HTML Datei speichern (als Logfile) und auf einen Webspace laden.

Dieses Script entstand aus der Notwendigkeit heraus, die Internet IP kennen zu müßen, für eine VNC Verbindung per SSH Tunnel und dem nicht-nutzen-wollen von DynDSN Domains.
siehe dazu: HowTo: Computer über das Internet sicher fernsteuern (http://www.forum-3dcenter.de/vbulletin/showthread.php?s=&threadid=148035)


Das Script liest die IP derjenigen Netzwerkadapter aus, die auch tatsächlich eine IP zugewiesen bekommen haben und von denen sucht es sich den DFÜ (PPP) Adapter aus. Dessen IP wird in einer W3C konformen HTML 4.01(strict) Seite gespeichert, welche entweder neuerstellt wird oder um eine neue Zeile mit der neuen IP ergänzt wird - quasi als Logdatei. Danach wird diese HTML Seite, deren Name man sich aussuchen kann, auf einen Webspace eigener Wahl geladen.
Alterantiv (oder zusätzlich) wird/kann eine E-Mail mit gleichem Inhalt versendet werden.
Desweiteren wird ein Eintrag im Ereignisprotokoll im Abschnitt "Anwendung" geschrieben, ob das Script erfolgreich war oder nicht.

Betriebssysteme: Microsoft® Windows® 2000 Professional/Server, Windows XP, Windows Server 2003 oder Windows NT® 4.0 SP4
Für den E-Mail Versand sollte mind. Microsoft® Outlook™ 98 oder der Microsoft® Internet Information Server (IIS) installiert sein.


'**Start Encode**
'E-Mail Daten wie SMTP Server, Absender und Ziel E-Mail Adresse, sowie Login und PW für SMTP Authentifikation
'=========================================================================
CONST MAIL_SERVER = "<SMTP_SERVER>" 'SMTP Mail Server Adresse
CONST MAIL_FROM = "<ABSENDER_MAIL>" 'Absender Mail
CONST MAIL_TO = "<ZIEL_MAIL>" 'Ziel E-Mail
CONST MAIL_ID = "<SMTP_AUTH_LOGIN>" 'SMTP Auth Login
CONST MAIL_IDPW = "<PASSWORT>" 'Passwort für SMTP Auth

'FTP Daten wie URL, Login, PW und Verzeichnis
'===========================================
CONST FTP_URL = "<FTP_URL>" 'URL des FTP servers ala ftp.bla.com
CONST FTP_NAME = "<LOGIN>" 'LOGIN Name
CONST FTP_PW = "<PASSWORT>" 'Passwort
CONST FTP_DIR = "<VERZEICHNIS>" 'Verzeichnis, in das die Datei kopiert werden soll. leerlassen, fall es das root verzeichnis sein soll

CONST Computer = "." 'könnte auch ein remote computer sein; der . steht für den rechner, auf dem das script ausgeführt wird. NICHT ÄNDERN!

CONST IPFileName = "ppp-ip.html" 'kurzer, relativer Pfad zur Datei; muß genommen werden, sonst wird die datei nicht übertragen beim ftp transfer

CONST FTPFileName = "sendftp.dat" 'kurzer, relativer Pfad zur Datei; muß genommen werden, sonst gibt es probs beim aufruf von ftp

DIM WSHShell, FSO, objWMIService, colAdapter
SET objWMIService = GetObject("winmgmts:\\" & Computer & "/root/cimv2")
SET colAdapter = objWMIService.ExecQuery("Select * from Win32_NetworkAdapterConfiguration WHERE IPEnabled = True")
'so werden nur die Netzwerkadapter ausgewählt, die auch tatsächlich eine IP haben.
SET WSHShell = WScript.CreateObject("WScript.Shell")
SET FSO = CreateObject("Scripting.FileSystemObject")

SUB GetIP(ByRef ipadresse, IsOnline)
For Each objAdapter In colAdapter
IF InStr(objAdapter.Description, "PPP/SLIP") THEN
IsOnline = TRUE
ipadresse = objAdapter.IPAddress(0)
EXIT SUB
ELSE
IsOnline = FALSE
END IF
Next
END SUB

SUB WriteTXT(ByVal ipadresse)
DIM IPFile
SET IPFile = FSO.CreateTextFile(IPFileName)
IPFile.WriteLine "<!DOCTYPE HTML PUBLIC ""-//W3C//DTD HTML 4.01//EN"">"
IPFile.WriteBlankLines 1
IPFile.WriteLine "<html>"
IPFile.WriteLine "<head>"
IPFile.WriteLine "<title>IP-Adresse des Servers zu Hause</title>"
IPFile.WriteLine "<meta http-equiv=""content-type"" content=""text/html; charset=ISO-8859-1"">"
IPFile.WriteLine "<meta name=""date"" content=""" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "T" & Time & """>"
IPFile.WriteLine "</head>"
IPFile.WriteLine "<body>"
IPFile.WriteBlankLines 1
IPFile.WriteLine "<p>Datum&nbsp;&nbsp;&nbsp; Uhrzeit&nbsp;&nbsp;&nbsp; IP-Adresse</p>"
IPFile.WriteLine "<p>"
IPFile.WriteLine NOW & " " & ipadresse & "<br>"
IPFile.WriteLine "</p>"
IPFile.WriteLine "</body>"
IPFile.Write "</html>"
IPFile.Close
SET IPFile = NOTHING
END SUB

SUB ReWriteTXT(ByVal ipadresse)
DIM IPFile, Zeile()
SET IPFile = FSO.OpenTextFile(IPFileName, 1) 'Datei zum Lesen öffnen
i=0
DO WHILE NOT (IPFile.AtEndOfStream) 'wenn Datei nicht zu ende ist, weiter machen
ReDim Preserve Zeile(i)
Zeile(i) = IPFile.Readline
i = i + 1
Loop
IPFile.Close
SET IPFile = NOTHING

ReDim Preserve Zeile(i+1) 'Array um ein Element vergrössern, welches dann leer ist
Zeile(UBound(Zeile)) = Zeile(i) 'letzten 3 Zeilen des originals nach oben schieben
Zeile(i) = Zeile(i-2) 'dadurch werden sie wieder die letzten Zeilen
Zeile(i-2) = Zeile(i-3)
Zeile(i-3) = NOW & " " & ipadresse & "<br>" 'neue einzufügene Zeile
Zeile(6) = "<meta name=""date"" content=""" & Year(Date) & "-" & Month(Date) & "-" & Day(Date) & "T" & Time & """>"
'die meta-tag Informationen über die letzte Änderung der Datei wird aktualisiert. es ist einfacher die ganze zeile zu ersetzen, als nur das datum und die uhrzeit!

SET IPFile = FSO.OpenTextFile(IPFileName, 2, TRUE) 'Datei zum schreiben öffnen
FOR i = 0 TO UBound(Zeile) - 1
IPFile.WriteLine(Zeile(i))
NEXT
IPFile.Write(Zeile(UBound(Zeile)))
IPFile.Close
SET IPFile = NOTHING
ERASE Zeile
END SUB

SUB compareIPS(ByVal ipadresse, ByRef IPChanged)
DIM IPFile, Zeile()
SET IPFile = FSO.OpenTextFile(IPFileName, 1) 'Datei zum Lesen öffnen
i=0
DO WHILE NOT (IPFile.AtEndOfStream) 'wenn Datei nicht zu ende ist, weiter machen
ReDim Preserve Zeile(i)
Zeile(i) = IPFile.Readline
i = i + 1
Loop
IPFile.Close
SET IPFile = NOTHING

IF InStrRev(Zeile(UBound(Zeile)-3), ipadresse, -1, 1) > 0 THEN 'prüft, ob momentane IP mit letzter IP übereinstimmt
IPChanged = FALSE
ELSE
IPChanged = TRUE
END IF
END SUB

SUB sendFTP()
DIM ftpfile
SET ftpfile = FSO.CreateTextFile(FTPFileName,TRUE)
ftpfile.WriteLine "open " & FTP_URL
ftpfile.WriteLine FTP_NAME
ftpfile.WriteLine FTP_PW
IF FTP_DIR <> "" THEN
ftpfile.WriteLine "cd " & FTP_DIR
END IF
ftpfile.WriteLine "send " & IPFileName
ftpfile.Write "bye"
ftpfile.Close
SET ftpFile = NOTHING
WSHShell.Run "ftp -s:" & FTPFileName, 0, True 'warte bis ftp beendet ist

FSO.DeleteFile(FTPFileName) 'die datei mit den ftp befehlen erst dann löschen, wenn übertragung fertig
END SUB

SUB sendMAIL()
DIM objMessage
SET objMessage = CreateObject("CDO.Message")
objMessage.Subject = "IP-Adresse des Servers zu Hause"
objMessage.Sender = MAIL_FROM
objMessage.To = MAIL_TO
objMessage.CreateMHTMLBody "file://" & Replace(Replace(FSO.GetAbsolutePathName(IPFileName),":","|",1,1),"\","/")
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = MAIL_SERVER
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusername") = MAIL_ID
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = MAIL_IDPW
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 100
objMessage.Configuration.Fields.Update
objMessage.Send
END SUB

SUB Main()
DIM IP, IsOnline, IPChanged
GetIP IP, IsOnline
compareIPS IP, IPChanged
IF IsOnline THEN
REM WSHSHell.LogEvent 0, "Die Bestimmung der IP-Adresse des DFÜ Adapters war erfolgreich."
'REM in obiger Zeile entfernen, falls Ergeigniseintrag erstellt werden soll, wenn die IP bestimmt werden konnte.
IF IPChanged THEN
IF FSO.FileExists(IPFileName) THEN
ReWriteTXT(IP)
ELSE
WriteTXT(IP)
END IF
sendFTP()
REM sendMAIL() 'REM entfernen, wenn eine E-Mail gesendet werden soll. Dazu aber vorher alle Angaben oben machen!
ELSE
REM WSHSHell.LogEvent 4, "Die IP-Adresse des DFÜ Adapters wurde erfolgreich bestimmt und ist unverändert seit der letzten Prüfung."
'REM in obiger Zeile entfernen, falls Ergeigniseintrag erstellt werden soll, wenn IP gleich geblieben ist.
END IF
ELSE
REM WSHSHell.LogEvent 1, "Die IP-Adresse des DFÜ-Adapters konnte nicht gelesen werden! Möglicherweise ist der Computer nicht online."
'REM in obiger Zeile entfernen, falls Ergeigniseintrag erstellt werden soll, wenn die IP nicht bestimmt werden konnte.
END IF
END SUB

Main()

Kopiert alles so wie es ist, ändert dann oben die Konstanten und speichert es als .vbs Datei ab.

EDIT:
Prüft nun, ob sich die IP seit dem letzten mal geändert hat und aktualisiert und überträgt nur dann das Logfile. Dies war nötig, falls das Script mittels Taskplaners mehrmals am Tag gestartet wird.
Ich überlege das Script so zu ändern, sodaß es permanent aktiv ist und nach der Herstellung einer DFÜ Verbindung das ganze dann von selbst macht. Anschließend soll es wieder im HIntergrund innaktiv bleiben und warten.

Xanthomryr
2004-06-11, 11:43:34
Wäre ein DynDNS Account nicht die bessere Lösung? ;)

/edit: Hm, da habe ich wohl nicht genau genug gelesen.

Sephiroth
2004-06-12, 02:02:17
Ich wollte nur anmerken, daß nun der Versand von E-Mails geht. Doch wenn die MSDN Library recht hat, dann muß dafür irgendein Outlook(Express) ab Outlook 98 installiert sein.
Es sollte also bei dem Großteil gehen :)

@Grendel
Sicher, aber ich mag das halt nicht und brauch es auch nicht, da auf dem Server ja nix für die Öffentlichkeit (wie HTTP, FTP Server oder sonstwas) läuft. Und wenn ich denn mal VNC bemphen will/muß (was eigentlich nicht oft ist), dann reicht das imo völlig aus.