VB-Script IP-Adressen über Textdatei einlesen , auf IsOnline prüfen und Ergebnisse wieder in eine Textdatei schreiben
Hallo ersteinmal und vielen Dank im Vorraus für die Mühe die ihr euch macht. Ich hoffe das ich keine bereits gestellte Frage stelle (hab nachgeguckt aber nur "ähnliche" Probleme gefunden)
Also , ich habe relativ wenig Ahnung von VBS - das erstmal vorweg.
Ich möchte ein Script schreiben das einen ganzen Stapel IP-Adressen aus einer vorher angelegten txt Datei ausließt , diese meinetwegen per "IsOnline" auf Verfügbarkeit überprüft , anschließend
die Ergebnisse in eine txt Datei schreibt und das ganze möglichst dauerhaft tut (10 Minuten interval wäre klasse)
Aufgrund meiner recht bescheidenen Kentnisse (die ich versuche zu erweitern, hab mir erstmal das Buch "Scripting für Administatoren" zur Hand genommen) weiß ich nicht genau wie ich das ganze angehen soll.
Ich habe erstmal einen Teil geschrieben der zumindest die von mir angegebenen PC's auf Verfügbarkeit überprüft.
'SYS: Windows Script Host Runtime Library
Set wshnet = CreateObject("WScript.Network")
Localcomputer = wshnet.ComputerName
' Liste derComputernamen, die geprüft werden sollen
computerliste = "SD01012,SD01013,SD02010VH,SD01020,SD01040"
computerfeld = Split(computerliste, ",")
MsgBox "Prüfe, ob bestimmte Computer online sind, sobald sie auf ok klicken!"
For x = 0 to UBound(computerfeld)
list = list & "\\" & computerfeld(x) & " online? " & isOnline(computerfeld(x)) & vbCr
Next
MsgBox list
Function isOnline(computername)
On Error Resume Next
Set computer = GetObject("WinNT://" & ComputerName & ",computer")
isOnline = (Err.number = 0)
On Error Goto 0
End Function
Einige von euch werden sich wahrscheinlich über die Art & Weise wie ich das geschrieben habe amüsieren- wie gesagt , wenig Ahnung von meiner Seite. Wie man sieht habe ich hier die zu überprüfenden PC's direkt mit Hostnamen ins Script geschrieben. Ich hätte es aber lieber wenn eine txt Datei mit den IPs oder Hostnamen eingelesen werden würde. Wäre es möglich dass das Script bei einer Änderung eines Wertes direkt eine E-mail verschickt? Und das dass Script alle 10 Minuten diese Abfrage durchführt?
Sorry für den vlt. verworrenen Text, irgendwie hab ich etwas den Faden verloren , ich hoffe man kann mir trotzdem weiterhelfen.
Nochmals vielen Dank im Vorraus
MfG lirico
Also , ich habe relativ wenig Ahnung von VBS - das erstmal vorweg.
Ich möchte ein Script schreiben das einen ganzen Stapel IP-Adressen aus einer vorher angelegten txt Datei ausließt , diese meinetwegen per "IsOnline" auf Verfügbarkeit überprüft , anschließend
die Ergebnisse in eine txt Datei schreibt und das ganze möglichst dauerhaft tut (10 Minuten interval wäre klasse)
Aufgrund meiner recht bescheidenen Kentnisse (die ich versuche zu erweitern, hab mir erstmal das Buch "Scripting für Administatoren" zur Hand genommen) weiß ich nicht genau wie ich das ganze angehen soll.
Ich habe erstmal einen Teil geschrieben der zumindest die von mir angegebenen PC's auf Verfügbarkeit überprüft.
'SYS: Windows Script Host Runtime Library
Set wshnet = CreateObject("WScript.Network")
Localcomputer = wshnet.ComputerName
' Liste derComputernamen, die geprüft werden sollen
computerliste = "SD01012,SD01013,SD02010VH,SD01020,SD01040"
computerfeld = Split(computerliste, ",")
MsgBox "Prüfe, ob bestimmte Computer online sind, sobald sie auf ok klicken!"
For x = 0 to UBound(computerfeld)
list = list & "\\" & computerfeld(x) & " online? " & isOnline(computerfeld(x)) & vbCr
Next
MsgBox list
Function isOnline(computername)
On Error Resume Next
Set computer = GetObject("WinNT://" & ComputerName & ",computer")
isOnline = (Err.number = 0)
On Error Goto 0
End Function
Einige von euch werden sich wahrscheinlich über die Art & Weise wie ich das geschrieben habe amüsieren- wie gesagt , wenig Ahnung von meiner Seite. Wie man sieht habe ich hier die zu überprüfenden PC's direkt mit Hostnamen ins Script geschrieben. Ich hätte es aber lieber wenn eine txt Datei mit den IPs oder Hostnamen eingelesen werden würde. Wäre es möglich dass das Script bei einer Änderung eines Wertes direkt eine E-mail verschickt? Und das dass Script alle 10 Minuten diese Abfrage durchführt?
Sorry für den vlt. verworrenen Text, irgendwie hab ich etwas den Faden verloren , ich hoffe man kann mir trotzdem weiterhelfen.
Nochmals vielen Dank im Vorraus
MfG lirico
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 152463
Url: https://administrator.de/forum/vb-script-ip-adressen-ueber-textdatei-einlesen-auf-isonline-pruefen-und-ergebnisse-wieder-in-eine-textdatei-152463.html
Ausgedruckt am: 22.04.2025 um 08:04 Uhr
53 Kommentare
Neuester Kommentar
Hallo lirico und willkommen im Forum!
Um die Computernamen einer Textdatei (mit je einem Namen pro Zeile) zu entnehmen, einfach die Zeilen
durch
ersetzen.
Für die Ausgabe in eine Textdatei anstelle von "
wobei ich allerdings vorweg beim Erstellen der Liste als Zeilenschaltung nicht "
Die Ausgabe ist als Log gedacht, es wird daher an die bestehende Datei angefügt. Wenn nur das jeweils letzte Ergebnis gespeichert werden soll:
Eine Wiederholung nach einer Pause von 10 Minuten ließe sich in einer Schleife etwa so realisieren:
Hinsichtlich des Mailversands kommt es auf die Umgebung an, in welcher das Script laufen soll ...
Grüße
bastla
P.S.: "Code"-Formatierung ist beschrieben ...
Um die Computernamen einer Textdatei (mit je einem Namen pro Zeile) zu entnehmen, einfach die Zeilen
computerliste = "SD01012,SD01013,SD02010VH,SD01020,SD01040"
computerfeld = Split(computerliste, ",")
computerliste = "D:\Computerliste.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf)
Für die Ausgabe in eine Textdatei anstelle von "
MsgBox list
"logfile = "D:\Online-Log-txt"
fso.OpenTextFile(logfile, 8, True).Write liste
vbCr
", sondern "vbCrLf
" verwenden würde.Die Ausgabe ist als Log gedacht, es wird daher an die bestehende Datei angefügt. Wenn nur das jeweils letzte Ergebnis gespeichert werden soll:
fso.CreateTextFile(logfile).Write liste
set Sh = CreateObject("WScript.Shell")
Do While True 'Endlosschleife; falls Abbruchkriterium verfügbar, hier angeben
liste = ""
...
...
Sh.Sleep 600000 'Angabe in ms
Loop
Grüße
bastla
P.S.: "Code"-Formatierung ist beschrieben ...
Hallo lirico!

zur Verfügung ...
Zum Versenden von Mails zB
http://www.petri.co.il/send_mail_from_script.htm
http://www.tek-tips.com/viewthread.cfm?qid=1374311&page=1
und natürlich http://www.msxfaq.de/code/mapicdo.htm
Beiträge dazu:
Mit VBS E-Mail senden(ohne Outlook)
kompletten Dateipfad von Netzlaufwerk an Outlook übergeben
Grüße
bastla
P.S.:
Die Schleife baue ich über&unter ...
Genau. Kann evtl. sogar ein Datum & Zeitangabe mit reingeschrieben werden?
Du hast In VBSDate
Time
Now
Zum Versenden von Mails zB
http://www.petri.co.il/send_mail_from_script.htm
http://www.tek-tips.com/viewthread.cfm?qid=1374311&page=1
und natürlich http://www.msxfaq.de/code/mapicdo.htm
Beiträge dazu:
Mit VBS E-Mail senden(ohne Outlook)
kompletten Dateipfad von Netzlaufwerk an Outlook übergeben
Grüße
bastla
P.S.:
Wie man sieht sind schon einpaar scheinbar überflüssige Zeilen verschwunden ^^
Wenn Du dann später aufräumst, könntest Du noch zusammenfassen (zB die Zeile 14 nach oben ziehen, wo sie leichter zu finden ist, oder das Erzeugen der Objekte wie "WScript.Shell" etc in einem Block vornehmen) ...
Hallo lirico!

Da die Function "isOnline()" ja ohnehin "True" oder "False" liefert, genügt als Unterscheidung ein
Ich würde allerdings das Gesamtlog in einer Datei belassen und nur die "Offline"-Rechner zusätzlich ausgeben - ist allerdings Geschmackssache ...
Grüße
bastla
Danke , ich weiß die Mühen sehr zu schätzen =)
Gerne, aber bis jetzt war's noch keine Mühe ... Da die Function "isOnline()" ja ohnehin "True" oder "False" liefert, genügt als Unterscheidung ein
If isOnline(computerfeld(x)) Then
...
Else
....
End If
Grüße
bastla
Hallo lirico!
Grüße
bastla
gibts da noch nen *Trick* um in der Ausgabe auch direkt den Hostnamen mit aufzulösen & zuvermerken? Sprich dass dann in meiner ausgabe (offline- & online-log.txt) neben der IP auch der Hostname gespeichert wird?
Außer einem Ausweichen auf CMD (Stichwort "ping
") würde mir auf Anhieb nix einfallen, wobei ich mich allerdings frage, warum Du nicht vorrangig die Hostnames verwendest: Wenn ohnehin manuell eine Liste erstellt wird, sollte es keinen großen Unterschied im Arbeitsaufwand bedeuten, und der Name ist doch wohl aussagekräftiger als die IP?Wie würde ich z.b das hier beschriebene Modul funktionstüchtig einbinden?
Wenn es weiter ein VBScript bleiben soll, gar nicht, da der direkte Zugriff auf Windows-APIs von VBS aus nicht möglich ist ...Grüße
bastla
Moin lirico,
Ja, eines der beiden Statements, die bastla abgegeben hat, war in der Tat das "Ist physikalisch eigentlich unmöglich..".
Das hast du offensichtlich gelesen und verstanden.
Das zweite Statement ist vielleicht ein bisschen moderater formuliert.
Würde aber, wenn wir mal die Schnörkel und die Zuckerwatte weglassen, lauten "Hey, auch wenn es ginge - wozu soll jemand diesen Weg gehen wollen??"
Denn
a) du kennst doch die "lesbaren" Servernamen, dann sag sie doch dem Schnipsel und
b) wie soll denn der Name einer nicht antwortenden IP aufgelöst werden?
Rein handwerlich könnten wir auch die Anzahl der Ping-Versuche auf 50000 setzen und dann noch einen kleinen Bildschirmschoner einbauen, damit es keinem langweilig wird...
Aber bastla muss dieses handwerkliche Können nun wirklich nicht bei so abgedrehten Ideen unter Beweis stellen.
Grüße
Biber
Zitat von @lirico:
Ah ist nicht möglich , schade, hat sich das wild drauf losgoogeln nicht bewährt ^^
können CMD commands einfach im vbs benuzt werden? und würde ich dann einfach ping -a verwenden?
Hmm... kann doch nicht so einfach sein?
Bitte schau noch mal bastlas letzten Kommentar an.Ah ist nicht möglich , schade, hat sich das wild drauf losgoogeln nicht bewährt ^^
können CMD commands einfach im vbs benuzt werden? und würde ich dann einfach ping -a verwenden?
Hmm... kann doch nicht so einfach sein?
Ja, eines der beiden Statements, die bastla abgegeben hat, war in der Tat das "Ist physikalisch eigentlich unmöglich..".
Das hast du offensichtlich gelesen und verstanden.
Das zweite Statement ist vielleicht ein bisschen moderater formuliert.
Würde aber, wenn wir mal die Schnörkel und die Zuckerwatte weglassen, lauten "Hey, auch wenn es ginge - wozu soll jemand diesen Weg gehen wollen??"
Denn
a) du kennst doch die "lesbaren" Servernamen, dann sag sie doch dem Schnipsel und
b) wie soll denn der Name einer nicht antwortenden IP aufgelöst werden?
Rein handwerlich könnten wir auch die Anzahl der Ping-Versuche auf 50000 setzen und dann noch einen kleinen Bildschirmschoner einbauen, damit es keinem langweilig wird...
Aber bastla muss dieses handwerkliche Können nun wirklich nicht bei so abgedrehten Ideen unter Beweis stellen.
Grüße
Biber
@Biber
... aber als "Abfallprodukt" der Antwort zu
Die Zeile 3 führt ein
aus (das "
In Zeile 6 wird das Ergebnis
dann entsprechend zerpflückt:
Das Ganze ließe sich zwar auch etwas knapper formulieren, was ich aber zugunsten der Wiedererkennbarkeit der "Scripting Guy"-Vorlage unterlassen habe.
Grüße
bastla
... aber als "Abfallprodukt" der Antwort zu
können CMD commands einfach im vbs benuzt werden?
könnte ich ja doch (unter Abwandlung eines auch ansonsten gut zur Thematik passenden Beispiels der "Scripting Guys") folgendes anbieten:Set objShell = CreateObject("WScript.Shell")
Set objExecObject = objShell.Exec _
("%comspec% /c ping -n 1 -a " & IP & "|findstr ""[""")
Do While Not objExecObject.StdOut.AtEndOfStream
strText = objExecObject.StdOut.ReadAll()
CompName = Trim(Replace(Split(strText, "[")(0), "Ping", ""))
Loop
ping -n 1 -a IP|findstr "["
findstr
", um das Ergebnis auf die eine relevante Zeile zu reduzieren und gleichzeitig sicher zu stellen, dass ein Aufsplitten anhand des "[" ein sinnvolles Ergebnis liefert).In Zeile 6 wird das Ergebnis
Ping Computername [IP] mit 32 Bytes Daten:
- Trennung bei "[" und Verwendung des ersten Teiles (mit dem Index 0),
- Eliminieren des Wortes "Ping" sowie der umgebenden Leerzeichen
Das Ganze ließe sich zwar auch etwas knapper formulieren, was ich aber zugunsten der Wiedererkennbarkeit der "Scripting Guy"-Vorlage unterlassen habe.
Grüße
bastla
Ja nee, bastla,
natürlich ist es ein Zeichen von Höflichkeit und schier unerschöpflicher Geduld, jede gestellte Frage exakt, verständlich und gelassen zu beantworten.
Aber zu den Kompetenzen, die Experten und Erfahrene weitergeben können und sollten, gehört eben auch dieses IT-konfuzianische "Wenn du keine Antwort findest, dann überlege, ob die Frage sinnvoll ist.".
Wenn der Guteste einen IP-Bereich von 10.100.15.001 bis 10.100.27.255 durch eine Zählschleife duchnudeln wollte.... dann mag es ganz witzig sein, zu jeder nichtssagenden IP einen Namen mitzuliefern.
Aber wirklich nicht, wenn ich handgesammelte Server in einer 10-Zeilen-Datei abklappere.
Wenn wir jeden Unsinn mitmachen, dann will bestimmt bald Dieter Bohlen hier mitmoderieren.
Grüße
Biber
natürlich ist es ein Zeichen von Höflichkeit und schier unerschöpflicher Geduld, jede gestellte Frage exakt, verständlich und gelassen zu beantworten.
Aber zu den Kompetenzen, die Experten und Erfahrene weitergeben können und sollten, gehört eben auch dieses IT-konfuzianische "Wenn du keine Antwort findest, dann überlege, ob die Frage sinnvoll ist.".
Wenn der Guteste einen IP-Bereich von 10.100.15.001 bis 10.100.27.255 durch eine Zählschleife duchnudeln wollte.... dann mag es ganz witzig sein, zu jeder nichtssagenden IP einen Namen mitzuliefern.
Aber wirklich nicht, wenn ich handgesammelte Server in einer 10-Zeilen-Datei abklappere.
Wenn wir jeden Unsinn mitmachen, dann will bestimmt bald Dieter Bohlen hier mitmoderieren.
Grüße
Biber
dann will bestimmt bald Dieter Bohlen hier mitmoderieren.
Ok, das war überzeugend daher nochmals der Hinweis @lirico: Das oben Gezeigte kannst Du machen, wenn Du gerade dabei bist, VBS (besser) zu erlernen; die bereits vorher (auch von mir) gestellte Sinnfrage bleibt aber weiterhin offen ...
Grüße
bastla
Hallo lirico!
Grüße
bastla
Wie lasse ich ihn in der Zeile 4 (ich geh mal davon aus das "IP" Platzhalter für ne echte IP is? ) auf meine Liste zugreifen?
Wäre ja, wenn Du tatsächlich IP-Adressen einliest, "computerfeld(x)
" ...Kann ich nicht evtl. einfach den mir bekannten Hostnamen hinter die Ip in meiner Computerliste schreiben , aber dafür sorgen das nur die Ip ausgelesen wurd bei dem isOnline check?
Kannst Du natürlich machen, dann aber mit einem Trennzeichen (zB ";") und mit einer Zerlegung (zB als Zeile 15):IP = Split(computerfeld(x), ";")(0)
bastla
Hallo lirico!
Grüße
bastla
wenns in die On/Off-Log.txt geschrieben wird den Hostnamen wieder anzeigen lasse?
Geht das?
Weshalb nicht? Wenn Du als Trennzeichen anstelle von ";" etwa TAB oder Leerzeichen verwendest, brauchst Du ev gar nix an der Formatierung zu ändern, sondern kannst die gesamte eingelesene Zeile "Geht das?
computerfeld(x)
" schreiben ...Grüße
bastla
Hallo lirico!
Da Du ja schon die entsprechenden Beispiele gefunden hast, könntest Du diese ja posten ...
aber doch eigentlich die Aufteilung ermöglichen.
Die Idee war, dass Du ins Log dann einfach "computerfeld(x)" (und damit sowohl IP als auch Hostname und das noch einigermaßen sauber formatiert) schreiben könntest ...
Grüße
bastla
Da Du ja schon die entsprechenden Beispiele gefunden hast, könntest Du diese ja posten ...
Tab oder Leerzeichen hat leider nicht den gewünschten effekt gebracht, das script denkt dann das ganze gehöre mit zum Part den er einlesen soll
Wenn Du als Trennzeichen TAB verwendest, sollteIP = Split(computerfeld(x), vbTab)(0)
Host = Split(computerfeld(x), vbTab)(1)
Die Idee war, dass Du ins Log dann einfach "computerfeld(x)" (und damit sowohl IP als auch Hostname und das noch einigermaßen sauber formatiert) schreiben könntest ...
Grüße
bastla
Hallo lirico!
Nach nochmaliger Überlegung frage ich mich (und jetzt Dich
), ob es sinnvoll ist, per "Filewatcher" auf die Änderung einer Datei zu reagieren, wenn ich diese Änderung selbst herbeigeführt habe ...
... wobei noch dazu die Prüfung anhand des Änderungsdatums ohnehin nicht sinnvoll ist, weil die "Offline-Log.txt" ja nach jedem Durchlauf der Schleife in Script 1 neu geschrieben wird.
Falls Du generell eine Mail verschicken wolltest, wenn auch nur ein einziger Computer offline ist, würde ich das einfach mit einer "Schalter"-Variable lösen, also etwa:
Wenn nur auf Veränderungen reagiert werden soll, müsstest Du den aktuellen Inhalt der "Offline-Log.txt" als String einlesen, mit dem Inhalt der Variablen "liste" vergleichen und, bei unterschiedlichem Ergebnis, die "Offline-Log.txt" neu schreiben sowie den Mailversand durchführen ...
Grüße
bastla
Nach nochmaliger Überlegung frage ich mich (und jetzt Dich
... wobei noch dazu die Prüfung anhand des Änderungsdatums ohnehin nicht sinnvoll ist, weil die "Offline-Log.txt" ja nach jedem Durchlauf der Schleife in Script 1 neu geschrieben wird.
Falls Du generell eine Mail verschicken wolltest, wenn auch nur ein einziger Computer offline ist, würde ich das einfach mit einer "Schalter"-Variable lösen, also etwa:
'SYS: Windows Script Host Runtime Library
Set wshnet = CreateObject("WScript.Network")
' Liste der Computernamen, die geprüft werden sollen
computerliste = "C:\Computerliste.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf)
SendMail = False
For x = 0 to UBound(computerfeld)
If isOnline(computerfeld(x)) Then
list = list & "\\" & computerfeld(x) & " ####" & " Online! " & "####" & " " & date & " " & time & vbCrLf
Else
liste= liste & "\\" & computerfeld(x) & " " & "ist Offline" & " " & date & " " & time & vbCrLf
SendMail = True
End If
Next
logfile = "C:\onscript\Online-Log.txt"
fso.CreateTextFile(logfile).Write list
lofile = "C:\onscript\Offline-Log.txt"
fso.CreateTextFile(lofile).Write liste
If SendMail Then
'hier der Mailversand der "Offline-Log.txt"
End If
Function isOnline(computername)
On Error Resume Next
Set computer = GetObject("WinNT://" & ComputerName & ",computer")
isOnline = (Err.number = 0)
On Error Goto 0
End Function
Grüße
bastla
Hallo lirico!
Die vermutlich sinnvollere Vorgangsweise ist aber tatsächlich der Vergleich der Ergebnisse jedes vollen Durchganges - das könnte dann etwa so aussehen:
Es würde in diesem Fall jedes Mal eine Mail verschickt, wenn sich die "Offline"-Liste ändert (also auch, wenn ein PC, der offline war, jetzt wieder online ist) ...
Grüße
bastla
P.S.: Danke für das "+"-Angebot
Würde es bei deiner Schreibweise nicht sogar für jeden Pc der Offline ist 1x die Offline txt verschicken?
Nein - es wird ja zunächst nur der Schalter gesetzt, um anzuzeigen, dass mindestens ein PC offline ist; der Mailversand würde erst nach der Schleife (nach Prüfung aller Computer) erfolgen.Die vermutlich sinnvollere Vorgangsweise ist aber tatsächlich der Vergleich der Ergebnisse jedes vollen Durchganges - das könnte dann etwa so aussehen:
'SYS: Windows Script Host Runtime Library
Set wshnet = CreateObject("WScript.Network")
' Liste der Computernamen, die geprüft werden sollen
computerliste = "C:\Computerliste.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf)
For x = 0 to UBound(computerfeld)
If isOnline(computerfeld(x)) Then
list = list & "\\" & computerfeld(x) & " ####" & " Online! " & "####" & " " & date & " " & time & vbCrLf
Else
liste= liste & "\\" & computerfeld(x) & " " & "ist Offline" & " " & date & " " & time & vbCrLf
End If
Next
logfile = "C:\onscript\Online-Log.txt"
fso.CreateTextFile(logfile).Write list
lofile = "C:\onscript\Offline-Log.txt"
ListeAlt = fso.OpenTextFile(lofile).ReadAll
If ListeAlt <> liste Then
fso.CreateTextFile(lofile).Write liste
'Mailversand hier durchführen
End If
Function isOnline(computername)
On Error Resume Next
Set computer = GetObject("WinNT://" & ComputerName & ",computer")
isOnline = (Err.number = 0)
On Error Goto 0
End Function
Grüße
bastla
P.S.: Danke für das "+"-Angebot
Hallo lirico!
Grüße
bastla
Meine Idee ist das das Script die txt öffnet nicht wieder schließt
Um das auszuschließen, ändere die für das Schreiben zuständigen Zeilen 20 - 25 auflogfile = "C:\onscript\Online-Log.txt"
Set objLogFile = fso.CreateTextFile(logfile)
objLogFile.Write list
objLogFile.Close
lofile = "C:\onscript\Offline-Log.txt"
Set objLoFile = fso.OpenTextFile(lofile)
ListeAlt = objLoFile.ReadAll
objLoFile.Close
If ListeAlt <> liste Then
Set objLoFile = fso.CreateTextFile(lofile)
objLoFile.Write liste
objLoFile.Close
bastla
Hallo lirico!
Abgesehen davon hatte ich nicht berücksichtigt, dass ja auch Datum und Uhrzeit in der "Offline-Log.txt" vermerkt sind - damit wäre eine Übereinstimmung mit der letzten Datei sogar dann unmöglich, wenn Du die zwischen Zeile 10 und 12 fehlenden Zeilen
ergänzt - es würde sich daher anbieten, in der "Offline-Log.txt" nur die Computernamen aufzulisten und Datum und Uhrzeit nur in der Mail anzuführen.
Der Ordnung halber sollten noch die Zeilen 28 bis 30 durch
ersetzt werden, damit auch der Fall "Offline-Log.txt existiert (noch) nicht" berücksichtigt ist.
Grüße
bastla
Line: 32 Char: 4 Error: Erlaubnis verweigert
könnte natürlich auch auf fehlende Schreibrechte hinweisen (funktioniert bei meinem Test nämlich wie gewünscht) ...Abgesehen davon hatte ich nicht berücksichtigt, dass ja auch Datum und Uhrzeit in der "Offline-Log.txt" vermerkt sind - damit wäre eine Übereinstimmung mit der letzten Datei sogar dann unmöglich, wenn Du die zwischen Zeile 10 und 12 fehlenden Zeilen
list = ""
liste = ""
Der Ordnung halber sollten noch die Zeilen 28 bis 30 durch
If fso.FileExists(lofile) Then
Set objLoFile = fso.OpenTextFile(lofile)
ListeAlt = objLoFile.ReadAll
objLoFile.Close
Else
ListeAlt = ""
End If
Grüße
bastla
Hallo lirico!
Grüße
bastla
Seltsam das es bei dir einfach funktioniert , auch im 2ten Durchgang?
Ich habe Vollzugriff auf den Zielordner und es greift kein anderes Script/Programm auf die Dateien zu ...Wofür genau ist
Damit wird (zumindest, wenn kein Leerzeichen zwischen den Anführungszeichen steht) der Variableninhalt komplett entfernt - ohne diesen Schritt werden bei jedem Durchlauf die Ergebnisse dem bisherigen Variableninhalt hinzugefügt, sodass das Log immer länger wird - kontraproduktiv besonders hinsichtlich des Vergleichs mit der zuletzt gespeicherten Version der "Offline-Log.txt" ...Grüße
bastla
Hallo lirico!
Um den neuen Fehler abzufangen, ändere die Zeile 35 auf
Grüße
bastla
Ich dachte hinzugefügt wird nur wenn ich
Es wird auch nicht der bestehenden Datei hinzugefügt, sondern der Variablen "liste", die dann in die Datei geschrieben wird - daher muss diese Variable immer vorweg "geleert" werden.Um den neuen Fehler abzufangen, ändere die Zeile 35 auf
If Not objLoFile.AtEndOfStream Then
ListeAlt = objLoFile.ReadAll
Else
ListeAlt = ""
End If
bastla
Hallo lirico!

Am Stück sähe der gesamte Teil dann so aus:
Grüße
bastla
die Zeile "objLoFile.Close" wird weggelassen?
Da muss noch ein extra End If rein wenn ich nich irre
Wenn Du anstelle Deiner Zeile 35 meine 5 Zeilen verwendet hast, sollten sich die beiden Fragen eigentlich nicht stellen ... Da muss noch ein extra End If rein wenn ich nich irre
Am Stück sähe der gesamte Teil dann so aus:
lofile = "C:\onscript\Offline-Log.txt"
If fso.FileExists(lofile) Then
Set objLoFile = fso.OpenTextFile(lofile)
If Not objLoFile.AtEndOfStream Then
ListeAlt = objLoFile.ReadAll
Else
ListeAlt = ""
End If
objLoFile.Close
Else
ListeAlt = ""
End If
bastla
Hallo lirico!

Da ich bei meinen Tests den Mailversand nur durch eine "
Nur zur Sicherheit könntest Du die Zeile 45 noch auf
abändern ...
Grüße
bastla
Ich bekomme den Fehler "Erlaubnis verweigert" jetzt in Zeile 45 Char 4
Ist wenigstens kein neuer Fehler, sondern der gleiche wie vorher ... Da ich bei meinen Tests den Mailversand nur durch eine "
MsgBox
" simuliert hatte (könntest Du auch mal versuchen), wäre die Ursache ev dort zu suchen ...Nur zur Sicherheit könntest Du die Zeile 45 noch auf
Set objLoFile = fso.CreateTextFile(lofile, True)
Grüße
bastla
Hallo lirico!
Der Unterschied zwischen der Zuweisung zu einer Objektvariablen (mit "
Mein Verdacht hinsichtlich des Mailversandes beruhte darauf, dass ja, außer dem Anfügen als Attachment, eigentlich mit der Datei nix anderes mehr passiert - ließe sich ev noch noch durch das Erstellen einer Kopie für den Versand überprüfen, also etwa (vor Zeile 50):
und dann als Ersatz der Zeile 57 (dort gehört ohnehin eine Variable rein):
Wenn danach der Fehler erst beim Kopieren auftritt, würde das meinen Verdacht erhärten ...
Grüße
bastla
Open statt Create
kann nur klappen, wenn Du explizit den Parameter für "Schreiben" (= 2) oder "Anfügen" (= 8) mit angibst - ansonsten wird die Datei zum "Lesen" geöffnet.Der Unterschied zwischen der Zuweisung zu einer Objektvariablen (mit "
Set
") und dem direkten Erzeugen und verwenden (wie in der zweiten Zeile) besteht vor allem darin, dass Du mit der Variablen etwas "in der Hand" hast, was danach auch das explizite Schließen der Datei ermöglicht ...Mein Verdacht hinsichtlich des Mailversandes beruhte darauf, dass ja, außer dem Anfügen als Attachment, eigentlich mit der Datei nix anderes mehr passiert - ließe sich ev noch noch durch das Erstellen einer Kopie für den Versand überprüfen, also etwa (vor Zeile 50):
lofilecopy = lofile & ".copy"
fso.CopyFile lofile lofilecopy
objMessage.AddAttachment lofilecopy
Grüße
bastla
Hallo lirico!


Grüße
bastla
(das "," hab ich selbst eingefügt , ohne ging es nicht ;) )
Sorry, das liegt bei mir wohl noch irgendwo unter dem Tisch herum ... Evtl. erhärtet das nun deinen Verdacht
Wie es aussieht wird tatsächlich die Datei durch den Versand als Attachment blockiert - allerdings habe ich gerade keine Lösung bei der Hand ... (Aus irgend nem Grund kommt immer ein \ wenn ich " mache , wird das bei euch auch so angezeigt?)
Das passiert sonst eigentlich nur, wenn Du den Code als Zitat einfügst (mit dem "\" werden von der Forumssoftware Sonderzeichen "maskiert") - mehr kann ich Dir allerdings dazu auch nicht sagen ...Grüße
bastla
Hallo lirico!
Das Hinzufügen zum Body sollte sich so machen lassen:
Grüße
bastla
ist das ".copy" nötig? atm störts mehr als es hilft (rein subjektiv)
Abgesehen davon, dass es nur eine einfache Art der Unterscheidung der beiden Dateien war ("lofile" enthält ja einen vollständigen Pfad, und daher habe ich nur ein - beliebiges - Suffix angefügt), ging es bei dieser Kopie ja eigentlich nur darum, zu klären, wodurch das Logfile beim zweiten Durchlauf kopiert ist - was nun ja klar zu sein scheint.Das Hinzufügen zum Body sollte sich so machen lassen:
objMessage.TextBody = ("Offline-PC " & date & " " & time & ":" & vbCrLf & & vbCrLf & liste)
bastla
Hallo lirico!
Den neuen Ansatz sehe ich mit etwas später an - vorerst nur kurz zum "Mail"-Problem (so es noch eines sein sollte): Nach Konsultation von didi1954 (ist in dieser Hinsicht wesentlich fitter als ich) sollte sich auch der Versand als Attachment machen lassen, wenn der "Mail"-Teil in eine eigene "Sub" ausgelagert wird - das könnte also etwa so aussehen:
Grüße
bastla
Den neuen Ansatz sehe ich mit etwas später an - vorerst nur kurz zum "Mail"-Problem (so es noch eines sein sollte): Nach Konsultation von didi1954 (ist in dieser Hinsicht wesentlich fitter als ich) sollte sich auch der Versand als Attachment machen lassen, wenn der "Mail"-Teil in eine eigene "Sub" ausgelagert wird - das könnte also etwa so aussehen:
' Liste der Computernamen, die geprüft werden sollen
computerliste = "C:\onscript\liste\Computerliste.txt"
' Logfiles
logfile = "C:\onscript\Online-Log.txt"
lofile = "C:\onscript\Offline-Log.txt"
Set wshnet = CreateObject("WScript.Network")
Set fso = CreateObject("Scripting.FileSystemObject")
Do While True
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf)
list = ""
liste = ""
For x = 0 to UBound(computerfeld)
If isOnline(computerfeld(x)) Then
list = list & "\\" & computerfeld(x) & " ####" & " Online! " & "####" & " " & date & " " & time & vbCrLf
Else
liste= liste & "\\" & computerfeld(x) & " " & "ist Offline" & vbCrLf
End If
Next
Set objLogFile = fso.CreateTextFile(logfile)
objLogFile.Write list
objLogFile.Close
If fso.FileExists(lofile) Then
Set objLoFile = fso.OpenTextFile(lofile)
If Not objLoFile.AtEndOfStream Then
ListeAlt = objLoFile.ReadAll
Else
ListeAlt = ""
End If
objLoFile.Close
Else
ListeAlt = ""
End If
If ListeAlt <> liste Then
Set objLoFile = fso.OpenTextFile(lofile, 2, True)
objLoFile.Write liste
objLoFile.Close
SendMail
End If
WScript.Sleep 300000
Loop
Function isOnline(computername)
On Error Resume Next
Set computer = GetObject("WinNT://" & ComputerName & ",computer")
isOnline = (Err.number = 0)
On Error Goto 0
End Function
Sub SendMail()
Set objMessage = CreateObject("CDO.Message")
objMessage.Subject = ("Offline PCs")
objMessage.From = ("xxx")
objMessage.To = ("xxx")
objMessage.CC = ("xxx")
objMessage.BCC = ("xxx")
objMessage.TextBody = ("Offline-PC, Stand: " & Now)
objMessage.AddAttachment lofile
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "xxx"
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxx"
objMessage.Configuration.Fields.Item _
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxx"
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") = 60
objMessage.Configuration.Fields.Update
objMessage.Send
Set objMessage = Nothing
End Sub
bastla
Hallo lirico!
Jetzt zum Auflösen des Hostnamens: Da Du mit dem zuletzt geposteten Schnipsel (BTW: die Zeilen 11 bis 13 ergeben auch für mich keinen Sinn und sind sicher entbehrlich) per WMI auf den Zielrechner zugreifen müsstest (siehe dazu: http://msdn.microsoft.com/en-us/library/aa389290%28VS.85%29.aspx), stehst Du ja ohnehin wieder vor dem von Biber schon angesprochenen Problem: Wenn der Zielrechner nicht erreichbar ist, kann er auch Deine Abfrage nicht ausführen und daher kein Ergebnis liefern ...
... abgesehen davon würdest Du mit dem angeführten Code zwar jede Menge Netzwerkeinstellungen auslesen, aber nicht den Computernamen - der wäre eher so zu ermitteln:
In Summe gesehen kann ich Dir also nicht wirklich Mut machen ... 
Grüße
bastla
Jetzt zum Auflösen des Hostnamens: Da Du mit dem zuletzt geposteten Schnipsel (BTW: die Zeilen 11 bis 13 ergeben auch für mich keinen Sinn und sind sicher entbehrlich) per WMI auf den Zielrechner zugreifen müsstest (siehe dazu: http://msdn.microsoft.com/en-us/library/aa389290%28VS.85%29.aspx), stehst Du ja ohnehin wieder vor dem von Biber schon angesprochenen Problem: Wenn der Zielrechner nicht erreichbar ist, kann er auch Deine Abfrage nicht ausführen und daher kein Ergebnis liefern ...
... abgesehen davon würdest Du mit dem angeführten Code zwar jede Menge Netzwerkeinstellungen auslesen, aber nicht den Computernamen - der wäre eher so zu ermitteln:
Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & computerfeld(x) & "\root\cimv2")
Set CompSys = objMWIService.ExecQuery("Select * from Win32_ComputerSystem")
For Each Comp In CompSys
ComputerName = Comp.Name
Next
Grüße
bastla