Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

VB-Script IP-Adressen über Textdatei einlesen , auf IsOnline prüfen und Ergebnisse wieder in eine Textdatei schreiben

Frage Entwicklung

Mitglied: lirico

lirico (Level 1) - Jetzt verbinden

06.10.2010, aktualisiert 18.10.2012, 6376 Aufrufe, 53 Kommentare

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
53 Antworten
Mitglied: bastla
06.10.2010 um 13:23 Uhr
Hallo lirico und willkommen im Forum!

Um die Computernamen einer Textdatei (mit je einem Namen pro Zeile) zu entnehmen, einfach die Zeilen
01.
computerliste = "SD01012,SD01013,SD02010VH,SD01020,SD01040" 
02.
 
03.
computerfeld = Split(computerliste, ",")
durch
01.
computerliste = "D:\Computerliste.txt" 
02.
 
03.
Set fso = CreateObject("Scripting.FileSystemObject") 
04.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf)
ersetzen.
Für die Ausgabe in eine Textdatei anstelle von "MsgBox list"
01.
logfile = "D:\Online-Log-txt" 
02.
 
03.
fso.OpenTextFile(logfile, 8, True).Write liste
wobei ich allerdings vorweg beim Erstellen der Liste als Zeilenschaltung nicht "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
Eine Wiederholung nach einer Pause von 10 Minuten ließe sich in einer Schleife etwa so realisieren:
01.
set Sh = CreateObject("WScript.Shell") 
02.
 
03.
Do While True 'Endlosschleife; falls Abbruchkriterium verfügbar, hier angeben 
04.
    liste = "" 
05.
    ... 
06.
    ... 
07.
 
08.
 
09.
    Sh.Sleep 600000 'Angabe in ms 
10.
Loop
Hinsichtlich des Mailversands kommt es auf die Umgebung an, in welcher das Script laufen soll ...

Grüße
bastla

P.S.: "Code"-Formatierung ist hier beschrieben ...
Bitte warten ..
Mitglied: lirico
06.10.2010 um 13:57 Uhr
Ersteinmal : Wow & Danke für die schnelle Hilfe!

bis auf die Schleife hab ich das auch erstmal angepasst und eingefügt bekommen , und läuft ganz gut soweit.
Allerdings wird das Ergebniss immer in die erste Zeile geschrieben, was natürlich das ganze äußerst unübersichtlich macht.

*Kann die Ausgabe so eingestellt werden das die Ergebnisse jeweils in eine neue Zeile geschrieben werden statt die Zeile 1 bis ins Unendliche voll zu schreiben?**EDIT* <- Das hatteste mir ja schon gesagt per CrLf , die Frage kann also getrost ignoriert werden

Kann evtl. sogar ein Datum & Zeitangabe mit reingeschrieben werden?

Zu der Umgebung des Scripts -> Auf den PCs läuft WinXP , für die Emails wird Outlook verwendet. Irgendwie beschleicht mich aber das Gefühl das war nicht was gefragt ist.

Die Schleife baue ich über&unter
01.
For x = 0 to UBound(computerfeld) 
02.
   list = list & "\\" & computerfeld(x) & " online? " & isOnline(computerfeld(x)) & vbCrLf 
03.
Next
oder verstehe ich da was falsch?

Immoment siehts jetzt so aus
01.
'SYS: Windows Script Host Runtime Library 
02.
Set wshnet = CreateObject("WScript.Network") 
03.
 
04.
' Liste derComputernamen, die geprüft werden sollen 
05.
computerliste = "C:\Computerliste.txt"  
06.
 
07.
Set fso = CreateObject("Scripting.FileSystemObject")  
08.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf) 
09.
 
10.
For x = 0 to UBound(computerfeld) 
11.
   list = list & "\\" & computerfeld(x) & " online? " & isOnline(computerfeld(x)) & vbCrLf 
12.
Next 
13.
 
14.
logfile = "C:\Online-Log.txt"  
15.
fso.OpenTextFile(logfile, 8, True).Write list 
16.
 
17.
Function isOnline(computername) 
18.
    On Error Resume Next 
19.
    Set computer = GetObject("WinNT://" & ComputerName & ",computer") 
20.
    isOnline = (Err.number = 0) 
21.
    On Error Goto 0 
22.
End Function
Wie man sieht sind schon einpaar scheinbar überflüssige Zeilen verschwunden
Bitte warten ..
Mitglied: bastla
06.10.2010, aktualisiert 18.10.2012
Hallo lirico!
Die Schleife baue ich über&unter ...
Genau.
Kann evtl. sogar ein Datum & Zeitangabe mit reingeschrieben werden?
Du hast In VBS
Date 
Time 
Now
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:
http://www.administrator.de/forum/mit-vbs-e-mail-senden%28ohne-outlook% ...
http://www.administrator.de/wissen/kompletten-dateipfad-von-netzlaufwer ...

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) ...
Bitte warten ..
Mitglied: lirico
06.10.2010 um 14:58 Uhr
Leider war ich nicht schnell genug das mit dem Date & Time hatte ich schon rausgefunden , trotzdem nochmal danke für die Mühen xD

01.
'SYS: Windows Script Host Runtime Library 
02.
Set wshnet = CreateObject("WScript.Network") 
03.
 
04.
' Liste derComputernamen, die geprüft werden sollen 
05.
computerliste = "C:\Computerliste.txt"  
06.
 
07.
Set fso = CreateObject("Scripting.FileSystemObject")  
08.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf) 
09.
 
10.
For x = 0 to UBound(computerfeld) 
11.
   list = list & "\\" & computerfeld(x) & " online? " & "##" & isOnline(computerfeld(x))& "##" &" " & date & " " & time & vbCrLf 
12.
Next 
13.
 
14.
logfile = "C:\Online-Log.txt"  
15.
fso.CreateTextFile(logfile).Write list 
16.
 
17.
Function isOnline(computername) 
18.
    On Error Resume Next 
19.
    Set computer = GetObject("WinNT://" & ComputerName & ",computer") 
20.
    isOnline = (Err.number = 0) 
21.
    On Error Goto 0 
22.
End Function 
23.
 
Das ganze "hübsch" machen kann ich ja später noch

Mein Chef ,erfreut das es vorran geht, hat immer neue Ideen was für funktionalitäten das script bieten soll :o

Jetzt sollen die Mails nur die false Ergebnisse verschicken , da müsste ich jetzt dafür sorgen das das Ergebniss jeweils für true oder false in eine andere Datei schreibt ... "If"? ^^

Auf die Gefahr hin mich zu wiederholen .... Danke , ich weiß die Mühen sehr zu schätzen =)
Bitte warten ..
Mitglied: bastla
06.10.2010 um 15:20 Uhr
Hallo lirico!
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
01.
If isOnline(computerfeld(x)) Then 
02.
    ... 
03.
Else 
04.
    .... 
05.
End If
Ich würde allerdings das Gesamtlog in einer Datei belassen und nur die "Offline"-Rechner zusätzlich ausgeben - ist allerdings Geschmackssache ...

Grüße
bastla
Bitte warten ..
Mitglied: lirico
06.10.2010 um 16:44 Uhr
Ja das war auch meine Idee , alle Rechner in eine Liste und die Offline per Mail melden.

Dass dir das nicht die riesen Mühe macht dacht ich mir fast , aber immerhin opferst du deine Zeit nichwa ^^

Jetzt hat ich leider soviel anderen Kram zutun das ich garnicht weiter machen konnte :S Ich werd mich von Zuhaus nochmal melden oder morgen wieder.

Wünsch dir und allen Mitlesern noch nen schönen Feierabend
Bitte warten ..
Mitglied: lirico
07.10.2010 um 14:06 Uhr
Sooo , endlich Zeit gefunden um weiter zu machen , kommt direkt das erste Problem. ich wollete das
01.
If isOnline(computerfeld(x)) Then 
02.
      .... 
03.
 Else  
04.
    ..... 
05.
End If
Über&Unter
01.
For x = 0 to UBound(computerfeld) 
02.
    list = list & "\\" & computerfeld(x) & " online? " & "##" & isOnline(computerfeld(x))& "##" &" " & date & " " & time & vbCrLf 
03.
Next

einbauen , nur irgendwie wills nicht so wie ich das will , ich glaub ich hab da nen Syntax-Error in meinem Gedanken ^^

Zu den Links zu den Emails , die hatte ich größtenteils alle schonmal offen , dennoch gut die Links nochmal zum Nachschlagen parrat zu haben.

Ich hab mir überlegt das ich mir die Schleife für alle 10 Minuten auch spaaren kann wenn ich den script einfach per geplanten Task alle 10 minuten ausführen lassen kann , ist das ne aktzeptable Lösung oder meinst du es sollte schon vom Script selbst gemacht werden?

01.
logfile = "C:\Online-Log.txt"   
02.
fso.CreateTextFile(logfile).Write list
Ist es egal wo das steht oder muss es nach der "list" deklarierung stehen um noch zu funktionieren?
Bitte warten ..
Mitglied: lirico
07.10.2010 um 14:16 Uhr
OK , die If geschichte scheint jetzt zu funktionieren.

Mein Script sieht jetzt so aus :
01.
'SYS: Windows Script Host Runtime Library 
02.
Set wshnet = CreateObject("WScript.Network") 
03.
 
04.
 
05.
' Liste der Computernamen, die geprüft werden sollen 
06.
computerliste = "C:\Computerliste.txt" 
07.
 
08.
Set fso = CreateObject("Scripting.FileSystemObject") 
09.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf) 
10.
 
11.
 
12.
 
13.
 
14.
For x = 0 to UBound(computerfeld) 
15.
     
16.
If isOnline(computerfeld(x)) Then 
17.
    list = list & "\\" & computerfeld(x) & " online? " & "##" & isOnline(computerfeld(x))& "##" & " " & date & " " & time & vbCrLf 
18.
 
19.
Else 
20.
    liste= liste & "\\" & computerfeld(x) & " " & "ist Offline" & " " & date & " " & time & vbCrLf 
21.
End If 
22.
Next 
23.
 
24.
logfile = "C:\Online-Log.txt" 
25.
fso.CreateTextFile(logfile).Write list 
26.
lofile = "C:\Offline-Log.txt" 
27.
fso.CreateTextFile(lofile).Write liste 
28.
 
29.
Function isOnline(computername) 
30.
     On Error Resume Next 
31.
     Set computer = GetObject("WinNT://" & ComputerName & ",computer") 
32.
     isOnline = (Err.number = 0) 
33.
     On Error Goto 0 
34.
End Function 
Fällt auf den ersten Blick was auf was besser/einfacher gelöst werden kann?

Ich habe mich entschieden nurnoch die IP-Adressen in der Computerliste.txt zu speichern (hostname würde auch gehen) - 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?

Wie würde ich z.b das hier beschriebene Modul funktionstüchtig einbinden?
Bitte warten ..
Mitglied: bastla
07.10.2010 um 17:46 Uhr
Hallo lirico!
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
Bitte warten ..
Mitglied: lirico
07.10.2010 um 18:25 Uhr
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 warten ..
Mitglied: Biber
07.10.2010 um 18:41 Uhr
Moin lirico,

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.

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
Bitte warten ..
Mitglied: bastla
07.10.2010 um 18:54 Uhr
@Biber
... 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:
01.
Set objShell = CreateObject("WScript.Shell") 
02.
Set objExecObject = objShell.Exec _ 
03.
    ("%comspec% /c ping -n 1 -a " & IP & "|findstr ""[""") 
04.
Do While Not objExecObject.StdOut.AtEndOfStream 
05.
    strText = objExecObject.StdOut.ReadAll() 
06.
    CompName = Trim(Replace(Split(strText, "[")(0), "Ping", "")) 
07.
Loop
Die Zeile 3 führt ein
ping -n 1 -a IP|findstr "["
aus (das "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:
dann entsprechend zerpflückt:
  • 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
Bitte warten ..
Mitglied: Biber
07.10.2010 um 19:07 Uhr
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
Bitte warten ..
Mitglied: bastla
07.10.2010 um 19:16 Uhr
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
Bitte warten ..
Mitglied: lirico
08.10.2010 um 08:05 Uhr
Ich bewundere die unerscöpfliche Geduld ebenfalls ^^^
Das Hostnamen auflösen wollte ich eigentlich drin haben weil wir unseren DNS-Server ändern demnächst , ist aber im endeffekt nicht soo wichtig , da gibts ja auchnoch andere Tools wie den Angry Ip Scanner etc. .

Rein Interessehalber , diese
01.
Set objShell = CreateObject("WScript.Shell")  
02.
Set objExecObject = objShell.Exec _  
03.
    ("%comspec% /c ping -n 1 -a " & IP & "|findstr ""[""")  
04.
Do While Not objExecObject.StdOut.AtEndOfStream  
05.
    strText = objExecObject.StdOut.ReadAll()  
06.
    CompName = Trim(Replace(Split(strText, "[")(0), "Ping", ""))  
07.
Loop
Geschichte sieht ja ganz interessant aus , CompName is dann die Variable die ich ausgeben wollen würde?
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?

Wenn ihr natürlich meint das ganze is nur Spielerei und die Zeit nicht wert , ja dann bin ich damit auch zufrieden , kann dann eigentlich den Thread hier gelöst markieren, vielen Dank nochmal ;)

lG lirico

*EDIT*
Noch eine Idee -> 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? (atm hängt er den namen direkt mit an die IP und so kommt immer ein Offline bei raus :S )
Bitte warten ..
Mitglied: bastla
08.10.2010 um 12:19 Uhr
Hallo lirico!
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)
Grüße
bastla
Bitte warten ..
Mitglied: lirico
08.10.2010 um 13:05 Uhr
Ich hatte gedacht ich lasse die ganze
01.
Set objShell = CreateObject("WScript.Shell") 
02.
Set objExecObject = objShell.Exec _  
03.
    ("%comspec% /c ping -n 1 -a " & IP & "|findstr ""[""") 
04.
Do While Not objExecObject.StdOut.AtEndOfStream 
05.
    strText = objExecObject.StdOut.ReadAll() 
06.
    CompName = Trim(Replace(Split(strText, "[")(0), "Ping", ""))  
07.
Loop

Geschichte raus .
Also das ich in die Computerliste.txt hinter die IP den Hostnamen schreibe (würde dann wahrscheinlich so aussehen -> 172.26.254.24; Hostname)
Den isOnline befehl jetzt aber nur die IP adresse "checken" lasse und am ende wenns in die On/Off-Log.txt geschrieben wird den Hostnamen wieder anzeigen lasse?
Geht das?
Bitte warten ..
Mitglied: bastla
08.10.2010 um 13:59 Uhr
Hallo lirico!
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 "computerfeld(x)" schreiben ...

Grüße
bastla
Bitte warten ..
Mitglied: lirico
18.10.2010 um 14:57 Uhr
So , ich meld mich mal zurück , ich war im Urlaub bis gestern

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 und so sind meine ergebnisse dann alle immer False weil mal halt keine IP finden wird die noch nen namen hinten dran hängen hat

Der Hostname ist mir jetzt auch ersteinmal egal.

Ich habe jetzt mein "Hauptscript" soweit bereit.
Mein email-script tuts auch (obwohl ich lieber meinen anhang in den text "embedden" würde)
01.
Set objMessage = CreateObject("CDO.Message")   
02.
objMessage.Subject = ("xxxxx")  
03.
objMessage.From = ("xxxxx")  
04.
objMessage.To = ("xxxxx")  
05.
objMessage.CC = ("xxxx")  
06.
objMessage.BCC = ("xxxx")  
07.
objMessage.TextBody = ("Im Ahnhang befinden sich die Offline-PCs") 
08.
objMessage.AddAttachment "C:\Offline-Log.txt" 
09.
  
10.
objMessage.Configuration.Fields.Item _  
11.
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2   
12.
objMessage.Configuration.Fields.Item _  
13.
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "xxxxx"  
14.
objMessage.Configuration.Fields.Item _  
15.
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1  
16.
objMessage.Configuration.Fields.Item _  
17.
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxxxx"  
18.
objMessage.Configuration.Fields.Item _  
19.
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxxxx"  
20.
objMessage.Configuration.Fields.Item _  
21.
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25   
22.
objMessage.Configuration.Fields.Item _  
23.
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False  
24.
objMessage.Configuration.Fields.Item _  
25.
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60  
26.
objMessage.Configuration.Fields.Update  
27.
  
28.
objMessage.Send 
Jetzt fehlt nurnoch die Kombination , ich bin bei den suchen auf die "FileSystemWatcher"-Class gestoßen. Mein Plan ist es eine Mail zu verschicken sobald die Offline-Log.txt geändert wird, bei den Beispielen die ich gefunden habe scheint es so als wäre diese FileSystemWatcher-Geschichte genau das richtige. Jetzt wäre nurnoch die Frage wie das zu realisieren ist , muss das ganze in ein 3tes script oder wie wäre das am besten gelöst?
Bitte warten ..
Mitglied: bastla
18.10.2010 um 18:33 Uhr
Hallo lirico!

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, sollte
01.
IP = Split(computerfeld(x), vbTab)(0) 
02.
Host = Split(computerfeld(x), vbTab)(1)
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
Bitte warten ..
Mitglied: lirico
19.10.2010 um 15:33 Uhr
Ahoi bastla!

Ich hab leider keine Beispiele gefunden gehabt die wirklich zum Thema gehören , nur Beispiele die den FileSystemWatcher benutzen(für andere Zwecke)

Ich hab einbisschen rumprobiert damit und dabei kam am ende das hier raus:

2 Scripts sind immoment benötigt um das zu tun was ich möchte.

1.
01.
'SYS: Windows Script Host Runtime Library 
02.
Set wshnet = CreateObject("WScript.Network") 
03.
 
04.
 
05.
' Liste der Computernamen, die geprüft werden sollen 
06.
computerliste = "C:\Computerliste.txt" 
07.
 
08.
 
09.
Set fso = CreateObject("Scripting.FileSystemObject") 
10.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf) 
11.
 
12.
 
13.
 
14.
 
15.
For x = 0 to UBound(computerfeld) 
16.
     
17.
If isOnline(computerfeld(x)) Then 
18.
    list = list & "\\" & computerfeld(x) & "  ####" & " Online! " & "####" & " " & date & " " & time & vbCrLf 
19.
 
20.
Else 
21.
    liste= liste & "\\" & computerfeld(x) & " " & "ist Offline" & " " & date & " " & time & vbCrLf 
22.
End If 
23.
Next 
24.
 
25.
logfile = "C:\onscript\Online-Log.txt" 
26.
fso.CreateTextFile(logfile).Write list 
27.
lofile = "C:\onscript\Offline-Log.txt" 
28.
fso.CreateTextFile(lofile).Write liste 
29.
 
30.
Function isOnline(computername) 
31.
     On Error Resume Next 
32.
     Set computer = GetObject("WinNT://" & ComputerName & ",computer") 
33.
     isOnline = (Err.number = 0) 
34.
     On Error Goto 0 
35.
End Function 
Das *alte* Script ebend ^^

2.
01.
strComputer = "." 
02.
 
03.
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") 
04.
 
05.
Set colFiles = objWMIService.ExecQuery _ 
06.
    ("Select * from CIM_Datafile Where Name = 'C:\\onscript\\offline-Log.txt'") 
07.
 
08.
For Each objFile in colFiles 
09.
    strOriginalTimestamp = objFile.LastModified 
10.
Next 
11.
 
12.
 
13.
 
14.
Do While True 
15.
    Wscript.Sleep 800000 
16.
    Set colFiles = objWMIService.ExecQuery _ 
17.
        ("Select * from CIM_Datafile Where Name = 'C:\\onscript\\offline-Log.txt'") 
18.
 
19.
    For Each objFile in colFiles 
20.
        strLatestTimestamp = objFile.LastModified 
21.
    Next  
22.
 
23.
If strLatestTimestamp >= strOriginalTimestamp Then 
24.
 Set objMessage = CreateObject("CDO.Message")   
25.
   objMessage.Subject = ("xxxx")  
26.
   objMessage.From = ("xxxx")  
27.
   objMessage.To = ("xxxx")  
28.
   objMessage.CC = ("xxxx")  
29.
   objMessage.BCC = ("xxxx")  
30.
   objMessage.TextBody = ("Im Ahnhang befinden sich die Offline-PCs") 
31.
   objMessage.AddAttachment "C:\onscript\offline-Log.txt" 
32.
  
33.
   objMessage.Configuration.Fields.Item _  
34.
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2   
35.
   objMessage.Configuration.Fields.Item _  
36.
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "172.26.254.37"  
37.
   objMessage.Configuration.Fields.Item _  
38.
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1  
39.
   objMessage.Configuration.Fields.Item _  
40.
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxxx"  
41.
   objMessage.Configuration.Fields.Item _  
42.
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxxx"  
43.
   objMessage.Configuration.Fields.Item _  
44.
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25   
45.
   objMessage.Configuration.Fields.Item _  
46.
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False  
47.
   objMessage.Configuration.Fields.Item _  
48.
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60  
49.
   objMessage.Configuration.Fields.Update  
50.
  
51.
objMessage.Send  
52.
 
53.
    Else 
54.
        
55.
        strOriginalTimestamp = strLatestTimeStamp 
56.
    End If 
57.
Loop
Das Mail-Script kombiniert mit der Daten-veränderungs-Überwachung.

Im allgemeinen tun die beiden ihre Arbeit, habe das ganze mal getestet anhand einer Liste von knapp 100 IP's.
Das Problem ist , ich muss beide Scripts eigenhändig starten und ,wenn ich z.b. auch so eine Do-Loop Schleife+ Sleeptimer ins erste Script einbaue kann ich nicht wirklich abschätzen wann das erste Script fertig ist - Da macht dann auch der Sleeptimer im 2ten Script keinen echten Sinn mehr. Im worst case wird das erste Script erst nach dem 2ten fertig werden und evtl. dafür sorgen das das 2te Script die Datenänderung garnicht mitbekommt.

Wär sehr dankbar für nen Vorschlag wie ich das eleganter lösen könnte!

liebe Grüße
lirico
Bitte warten ..
Mitglied: bastla
19.10.2010 um 15:59 Uhr
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:
01.
'SYS: Windows Script Host Runtime Library 
02.
Set wshnet = CreateObject("WScript.Network") 
03.
 
04.
' Liste der Computernamen, die geprüft werden sollen 
05.
computerliste = "C:\Computerliste.txt" 
06.
 
07.
Set fso = CreateObject("Scripting.FileSystemObject") 
08.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf) 
09.
 
10.
SendMail = False 
11.
 
12.
For x = 0 to UBound(computerfeld) 
13.
   
14.
    If isOnline(computerfeld(x)) Then 
15.
        list = list & "\\" & computerfeld(x) & "  ####" & " Online! " & "####" & " " & date & " " & time & vbCrLf 
16.
 
17.
    Else 
18.
        liste= liste & "\\" & computerfeld(x) & " " & "ist Offline" & " " & date & " " & time & vbCrLf 
19.
        SendMail = True 
20.
    End If 
21.
Next 
22.
 
23.
logfile = "C:\onscript\Online-Log.txt" 
24.
fso.CreateTextFile(logfile).Write list 
25.
lofile = "C:\onscript\Offline-Log.txt" 
26.
fso.CreateTextFile(lofile).Write liste 
27.
 
28.
If SendMail Then 
29.
    'hier der Mailversand der "Offline-Log.txt" 
30.
End If 
31.
 
32.
Function isOnline(computername) 
33.
     On Error Resume Next 
34.
     Set computer = GetObject("WinNT://" & ComputerName & ",computer") 
35.
     isOnline = (Err.number = 0) 
36.
     On Error Goto 0 
37.
End Function 
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
Bitte warten ..
Mitglied: lirico
19.10.2010 um 18:02 Uhr
Aloha bastla

Ich hab mir die Frage einbisschen durch den Kopf gehen lassen und denke "Ja" .
Mein Gedanke war einfach dieser , dass jedes mal wenn die Offline txt beschrieben wird (folglich min. 1 Pc off ist) die mail verschickt wird, ideal wäre wenn es einen weg geben würde dass nur auf eine echte Änderung des status eingegangen wird.

Immoment wär es ja so -> pc x ist offline -> wird in die datei geschrieben ggf. email verschickt -> nächste abfrage -> pc x ist offline -> wird in die datei geschrieben & email verschickt. <- dabei kanns natürlich sein das ein pc nen tag lang aus is und ich dann alle 10 minuten ne mail bekomme das er off ist- is natürlich mist *g*
Und im idealfall würde er nicht auf einen Pc reagieren der bereits beim lezten check off war. ... mir fällt auf das der Filewatcher da nicht der richtige ist (was natürlich meinen ersten satz widerlegt ) ... ahh schlimm ich hab mir schon x andere funktionalitäten im kopf zurechtgesponnen aber damit werd ich euch nicht weiter belasten *g*

Kann "liste" denn überhaupt was anderes als die Offline-log beeinhalten? das eine wird doch aus dem anderen erstellt?

Immoment ists so das wenn ein Pc off ist der jedes mal aufs neue Auslöser für eine mail ist , der schalter würde mich da nicht weiter bringen wenn ich das richtig verstehe,
Würde es bei deiner Schreibweise nicht sogar für jeden Pc der Offline ist 1x die Offline txt verschicken? (so liest sich das für mich) wär natürlich auch mist wenn 20 off sind und ich 20 mal ne mail bekomm wo schon in der ersten die datei mit allen ankommt , die nächsten 19 also überflüssig sind.

Entschuldigung für die unsortierte Schreibweise grade, bin grad echt gebeutelt

liebe Grüße
lirico

PS: Wo kann ich dir nen "+" geben? sowas wie nen bedankomaten gibts hier auch nicht in jedemfall 20 "+" von mir ^^
Bitte warten ..
Mitglied: bastla
19.10.2010 um 18:12 Uhr
Hallo lirico!
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:
01.
'SYS: Windows Script Host Runtime Library 
02.
Set wshnet = CreateObject("WScript.Network") 
03.
 
04.
' Liste der Computernamen, die geprüft werden sollen 
05.
computerliste = "C:\Computerliste.txt" 
06.
 
07.
Set fso = CreateObject("Scripting.FileSystemObject") 
08.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf) 
09.
 
10.
For x = 0 to UBound(computerfeld) 
11.
   
12.
    If isOnline(computerfeld(x)) Then 
13.
        list = list & "\\" & computerfeld(x) & "  ####" & " Online! " & "####" & " " & date & " " & time & vbCrLf 
14.
 
15.
    Else 
16.
        liste= liste & "\\" & computerfeld(x) & " " & "ist Offline" & " " & date & " " & time & vbCrLf 
17.
    End If 
18.
Next 
19.
 
20.
logfile = "C:\onscript\Online-Log.txt" 
21.
fso.CreateTextFile(logfile).Write list 
22.
lofile = "C:\onscript\Offline-Log.txt" 
23.
ListeAlt = fso.OpenTextFile(lofile).ReadAll 
24.
If ListeAlt <> liste Then 
25.
    fso.CreateTextFile(lofile).Write liste 
26.
    'Mailversand hier durchführen 
27.
End If 
28.
 
29.
Function isOnline(computername) 
30.
     On Error Resume Next 
31.
     Set computer = GetObject("WinNT://" & ComputerName & ",computer") 
32.
     isOnline = (Err.number = 0) 
33.
     On Error Goto 0 
34.
End Function
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
Bitte warten ..
Mitglied: lirico
21.10.2010 um 08:24 Uhr
Hi bastla

Ich hab dein Script mal ausprobiert & die email geschichte mit eingefügt. Hat sehr gut geklappt soweit ich das bisjetzt beurteilen kann.
Das einzige was mir jetzt noch fehlt ist dass das Script alle X minuten ausgeführt wird, hab das probiert mit nem Do - Loop und nem Wscript.Sleep -> sobald das Script dann das 2te Mal durchläuft wird mir ein "Zugriff verweigert"- Runtime error angezeigt, syntax is ok nur aus irgend nem Grund gibts im 2ten Durchlauf dieses Problem. Meine Idee ist das das Script die txt öffnet nicht wieder schließt (?) und dadurch beim 2ten Durchgang dieser Fehler auftaucht.

Lässt sich das irgendwie umgehen? Würde es theoretisch Abhilfe schaffen wenn ich die Loop nicht ins script selber setze sondern sowas wie ein "ausführen.vbs" script mache mit dem ich dann ebend alle x minuten das eigentliche script ansteuere? habe dazu einbisschen rumgesucht und nur
01.
Dim oShell, a  
02.
oShell = CreateObject("Wscript.Shell")  
03.
a = "U:\PrüfenOnlineF2.vbs"  
04.
oShell.run (a, 3, True)
Da sagts mir ich darf keine Klammern in Zeile 4 haben, wenn ich die aber ersetze bekomm ich nen Fehler in Zeile 2 das er den Befehl nich kennt (vorher kommt das nicht mit den Klammern ? )
Bitte warten ..
Mitglied: bastla
21.10.2010 um 09:38 Uhr
Hallo lirico!
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 auf
01.
logfile = "C:\onscript\Online-Log.txt"  
02.
Set objLogFile = fso.CreateTextFile(logfile) 
03.
objLogFile.Write list 
04.
objLogFile.Close 
05.
 
06.
lofile = "C:\onscript\Offline-Log.txt"  
07.
Set objLoFile = fso.OpenTextFile(lofile) 
08.
ListeAlt = objLoFile.ReadAll  
09.
objLoFile.Close 
10.
If ListeAlt <> liste Then 
11.
    Set objLoFile = fso.CreateTextFile(lofile) 
12.
    objLoFile.Write liste 
13.
    objLoFile.Close
Grüße
bastla
Bitte warten ..
Mitglied: lirico
21.10.2010 um 09:41 Uhr
Ah! habs selbst gelöst bekommen per
01.
Option Explicit 
02.
 
03.
Do While True 
04.
 
05.
dim eingabe, pfad 
06.
dim sh: set sh=CreateObject("Wscript.Shell") 
07.
pfad = "U:\" 
08.
eingabe = "PrüfenOnlineF2.vbs" 
09.
 
10.
 
11.
 
12.
sh.run(pfad & eingabe) 
13.
set sh = nothing 
14.
 
15.
Wscript.Sleep 400000 
16.
 
17.
Loop
Damit is mein Problem jetzt endgültig gegessen denk ich xD

Danke nochmal für alles!

lG
lirico
Bitte warten ..
Mitglied: lirico
21.10.2010 um 09:49 Uhr
:S Kommando zurück , aufeinmal soll ich alles über subroutinen laufen lassen ... herrlich wenn sich die aufgabe alle paar tage ändert :S naja ich wollt grade solved klicken *g*

Ich probier das nu erstmal selbst mit subroutinen zu lösen, ansonsten meld ich mich ganz sicher nochmal *g*

Grüße

lirico

*edita* ah hab deine antwort garnicht gesehen , aber danke auf für den tipp mit dem close!
Bitte warten ..
Mitglied: lirico
21.10.2010 um 10:46 Uhr
01.
'SYS: Windows Script Host Runtime Library 
02.
Set wshnet = CreateObject("WScript.Network") 
03.
 
04.
' Liste der Computernamen, die geprüft werden sollen  
05.
computerliste = "C:\Computerliste.txt"  
06.
 
07.
Set fso = CreateObject("Scripting.FileSystemObject")  
08.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf)  
09.
 
10.
Do While True 
11.
     
12.
For x = 0 to UBound(computerfeld)  
13.
  
14.
    If isOnline(computerfeld(x)) Then  
15.
        list = list & "\\" & computerfeld(x) & "  ####" & " Online! " & "####" & " " & date & " " & time & vbCrLf  
16.
 
17.
       Else 
18.
        liste= liste & "\\" & computerfeld(x) & " " & "ist Offline" & " " & date & " " & time & vbCrLf  
19.
    End If 
20.
Next 
21.
  
22.
   logfile = "C:\onscript\Online-Log.txt"   
23.
   Set objLogFile = fso.CreateTextFile(logfile)  
24.
   objLogFile.Write list  
25.
   objLogFile.Close  
26.
   
27.
   lofile = "C:\onscript\Offline-Log.txt"   
28.
   Set objLoFile = fso.OpenTextFile(lofile)  
29.
   ListeAlt = objLoFile.ReadAll   
30.
   objLoFile.Close  
31.
   If ListeAlt <> liste Then  
32.
   Set objLoFile = fso.CreateTextFile(lofile)  
33.
   objLoFile.Write liste  
34.
   objLoFile.Close 
35.
 
36.
     
37.
   Set objMessage = CreateObject("CDO.Message")   
38.
   objMessage.Subject = ("xxx")  
39.
   objMessage.From = ("xxx")  
40.
   objMessage.To = ("xxx")  
41.
   objMessage.CC = ("xxx")  
42.
   objMessage.BCC = ("xxx")  
43.
   objMessage.TextBody = ("Im Ahnhang befinden sich die Offline-PCs") 
44.
   objMessage.AddAttachment "C:\onscript\offline-Log.txt" 
45.
  
46.
   objMessage.Configuration.Fields.Item _  
47.
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2   
48.
   objMessage.Configuration.Fields.Item _  
49.
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "172.26.254.37"  
50.
   objMessage.Configuration.Fields.Item _  
51.
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1  
52.
   objMessage.Configuration.Fields.Item _  
53.
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxx"  
54.
   objMessage.Configuration.Fields.Item _  
55.
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxx"  
56.
   objMessage.Configuration.Fields.Item _  
57.
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25   
58.
   objMessage.Configuration.Fields.Item _  
59.
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False  
60.
   objMessage.Configuration.Fields.Item _  
61.
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60  
62.
   objMessage.Configuration.Fields.Update  
63.
  
64.
objMessage.Send 
65.
 
66.
End If 
67.
 
68.
Wscript.Sleep 600000 
69.
 
70.
Loop 
71.
  
72.
Function isOnline(computername)  
73.
    On Error Resume Next  
74.
     Set computer = GetObject("WinNT://" & ComputerName & ",computer")  
75.
     isOnline = (Err.number = 0)  
76.
     On Error Goto 0  
77.
End Function
Dachte mir ich probiers mal aus mit dem objLofile.close -> leider kommt bei mir "Line: 32 Char: 4 Error: Erlaubnis verweigert"
scheint ihn nicht zu interessieren das close :S
Bitte warten ..
Mitglied: bastla
21.10.2010 um 17:54 Uhr
Hallo lirico!
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
01.
list = "" 
02.
liste = ""
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
01.
   If fso.FileExists(lofile) Then 
02.
      Set objLoFile = fso.OpenTextFile(lofile) 
03.
      ListeAlt = objLoFile.ReadAll 
04.
      objLoFile.Close 
05.
   Else 
06.
      ListeAlt = "" 
07.
   End If
ersetzt werden, damit auch der Fall "Offline-Log.txt existiert (noch) nicht" berücksichtigt ist.

Grüße
bastla
Bitte warten ..
Mitglied: lirico
22.10.2010 um 08:51 Uhr
Hallo Bastla!

Seltsam das es bei dir einfach funktioniert , auch im 2ten Durchgang? beim Ersten Durchgang hab ich nämlich auch kein Problem , aber sobald die Loop eingesezt hat und wieder alles von vorn los geht -> da fängt das Problem dann an.

Wofür genau ist
01.
list =  " " 
02.
liste = " "
da?
Bitte warten ..
Mitglied: bastla
22.10.2010 um 10:48 Uhr
Hallo lirico!
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
Bitte warten ..
Mitglied: lirico
22.10.2010 um 11:49 Uhr
Hallo Bastla!

Ich dachte hinzugefügt wird nur wenn ich
01.
fso.OpenTextFile(logfile).Write liste
(z.b.) benutze. Und das war doch schon durch das
01.
fso.CreateTextFile(logfile).Write liste
umgangen oder nicht? (Also statt open create)

Es ist mir auch ein völlig neuer Fehler aufgetreten , der hat denk ich was damit zutun das ich die Do-Loop Schleife falsch gesezt habe... "Eingabe hinter Dateiende " Line 35 Char 9
01.
'SYS: Windows Script Host Runtime Library 
02.
Set wshnet = CreateObject("WScript.Network") 
03.
 
04.
 
05.
' Liste der Computernamen, die geprüft werden sollen  
06.
computerliste = "C:\Computerliste.txt"  
07.
 
08.
Do While True 
09.
 
10.
 
11.
Set fso = CreateObject("Scripting.FileSystemObject")  
12.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf) 
13.
 
14.
list = "" 
15.
liste = "" 
16.
 
17.
For x = 0 to UBound(computerfeld)  
18.
  
19.
    If isOnline(computerfeld(x)) Then  
20.
        list = list & "\\" & computerfeld(x) & "  ####" & " Online! " & "####" & " " & date & " " & time & vbCrLf  
21.
 
22.
       Else 
23.
        liste= liste & "\\" & computerfeld(x) & " " & "ist Offline" & vbCrLf 
24.
    End If 
25.
Next 
26.
  
27.
   logfile = "C:\onscript\Online-Log.txt"   
28.
   Set objLogFile = fso.CreateTextFile(logfile)  
29.
   objLogFile.Write list  
30.
   objLogFile.Close 
31.
   
32.
   lofile = "C:\onscript\Offline-Log.txt" 
33.
     If fso.FileExists(lofile) Then  
34.
        Set objLoFile = fso.OpenTextFile(lofile) 
35.
        ListeAlt = objLoFile.ReadAll  
36.
        objLoFile.Close  
37.
     Else  
38.
        ListeAlt = "" 
39.
     End If 
40.
   If ListeAlt <> liste Then  
41.
   Set objLoFile = fso.CreateTextFile(lofile) 
42.
   objLoFile.Write liste  
43.
   objLoFile.Close 
44.
 
45.
     
46.
   Set objMessage = CreateObject("CDO.Message")   
47.
   objMessage.Subject = ("xxx")  
48.
   objMessage.From = ("xxx")  
49.
   objMessage.To = ("xxx")  
50.
   objMessage.CC = ("xxx")  
51.
   objMessage.BCC = ("xxx")  
52.
   objMessage.TextBody = ("Im Ahnhang befinden sich die Offline-PCs" & " " & date & " " & time) 
53.
   objMessage.AddAttachment "C:\onscript\offline-Log.txt" 
54.
  
55.
   objMessage.Configuration.Fields.Item _  
56.
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2   
57.
   objMessage.Configuration.Fields.Item _  
58.
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "172.26.254.37" 
59.
   objMessage.Configuration.Fields.Item _ 
60.
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1  
61.
   objMessage.Configuration.Fields.Item _  
62.
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxx"  
63.
   objMessage.Configuration.Fields.Item _  
64.
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxx"  
65.
   objMessage.Configuration.Fields.Item _  
66.
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25   
67.
   objMessage.Configuration.Fields.Item _  
68.
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False 
69.
   objMessage.Configuration.Fields.Item _  
70.
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60  
71.
   objMessage.Configuration.Fields.Update  
72.
 
73.
objMessage.Send 
74.
 
75.
End If 
76.
 
77.
Wscript.Sleep 300000 
78.
 
79.
Loop 
80.
  
81.
Function isOnline(computername)  
82.
    On Error Resume Next  
83.
     Set computer = GetObject("WinNT://" & ComputerName & ",computer")  
84.
     isOnline = (Err.number = 0)  
85.
     On Error Goto 0  
86.
End Function
*edit* hab die schleife einfach mal raus genommen ,der fehler bleibt bestehen, scheint also nix mit der schleife zutun zu haben
Bitte warten ..
Mitglied: bastla
22.10.2010 um 12:04 Uhr
Hallo lirico!
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
01.
If Not objLoFile.AtEndOfStream Then 
02.
    ListeAlt = objLoFile.ReadAll 
03.
Else 
04.
    ListeAlt = "" 
05.
End If
Grüße
bastla
Bitte warten ..
Mitglied: lirico
22.10.2010 um 12:42 Uhr
die Zeile "objLoFile.Close" wird weggelassen?

Ansonsten : "You made my day" ^^ weiß nicht was ich ohne dich tun würde *g*

lG
lirico

*edit*
01.
lofile = "C:\onscript\Offline-Log.txt" 
02.
     If fso.FileExists(lofile) Then  
03.
        Set objLoFile = fso.OpenTextFile(lofile) 
04.
        If Not objLoFile.AtEndOfStream Then  
05.
            ListeAlt = objLoFile.ReadAll  
06.
            Else  
07.
        ListeAlt = ""  
08.
        End If 
09.
   If ListeAlt <> liste Then 
10.
   Set objLoFile = fso.CreateTextFile(lofile) 
11.
   objLoFile.Write liste  
12.
   objLoFile.Close
Da muss noch ein extra End If rein wenn ich nich irre
Bitte warten ..
Mitglied: bastla
22.10.2010 um 14:47 Uhr
Hallo lirico!
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 ...
Am Stück sähe der gesamte Teil dann so aus:
01.
    lofile = "C:\onscript\Offline-Log.txt" 
02.
    If fso.FileExists(lofile) Then  
03.
        Set objLoFile = fso.OpenTextFile(lofile) 
04.
        If Not objLoFile.AtEndOfStream Then 
05.
            ListeAlt = objLoFile.ReadAll 
06.
        Else 
07.
            ListeAlt = "" 
08.
        End If 
09.
        objLoFile.Close  
10.
    Else  
11.
        ListeAlt = "" 
12.
    End If
Grüße
bastla
Bitte warten ..
Mitglied: lirico
22.10.2010 um 15:39 Uhr
Hallo Bastla!

Ja ich bastel da die ganze Zeit dran rum , evtl. hab ich deine Zeilen nicht 100% akkurat übertragen *g*

Nur um den jetztigen Stand der Dinge nochmal fest zu halten ->
01.
'SYS: Windows Script Host Runtime Library 
02.
Set wshnet = CreateObject("WScript.Network") 
03.
 
04.
 
05.
' Liste der Computernamen, die geprüft werden sollen  
06.
computerliste = "C:\Computerliste.txt"  
07.
 
08.
Do While True 
09.
 
10.
Set fso = CreateObject("Scripting.FileSystemObject") 
11.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf) 
12.
 
13.
list = "" 
14.
liste = "" 
15.
 
16.
For x = 0 to UBound(computerfeld)  
17.
  
18.
    If isOnline(computerfeld(x)) Then  
19.
        list = list & "\\" & computerfeld(x) & "  ####" & " Online! " & "####" & " " & date & " " & time & vbCrLf  
20.
 
21.
       Else 
22.
        liste= liste & "\\" & computerfeld(x) & " " & "ist Offline" & vbCrLf 
23.
    End If 
24.
Next 
25.
 
26.
   logfile = "C:\onscript\Online-Log.txt" 
27.
   Set objLogFile = fso.CreateTextFile(logfile)  
28.
   objLogFile.Write list  
29.
   objLogFile.Close 
30.
   
31.
 lofile = "C:\onscript\Offline-Log.txt" 
32.
    If fso.FileExists(lofile) Then   
33.
        Set objLoFile = fso.OpenTextFile(lofile)  
34.
        If Not objLoFile.AtEndOfStream Then  
35.
           ListeAlt = objLoFile.ReadAll  
36.
        Else  
37.
           ListeAlt = ""  
38.
       End If  
39.
      objLoFile.Close   
40.
    Else   
41.
        ListeAlt = ""  
42.
   End If 
43.
 
44.
   If ListeAlt <> liste Then 
45.
   Set objLoFile = fso.CreateTextFile(lofile) 
46.
   objLoFile.Write liste  
47.
   objLoFile.Close 
48.
 
49.
 
50.
   Set objMessage = CreateObject("CDO.Message")   
51.
   objMessage.Subject = ("xxx")  
52.
   objMessage.From = ("xxx")  
53.
   objMessage.To = ("xxx") 
54.
   objMessage.CC = ("xxx")  
55.
   objMessage.BCC = ("xxx")  
56.
   objMessage.TextBody = ("Im Ahnhang befinden sich die Offline-PCs" & " " & date & " " & time) 
57.
   objMessage.AddAttachment "C:\onscript\offline-Log.txt" 
58.
  
59.
   objMessage.Configuration.Fields.Item _  
60.
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2   
61.
   objMessage.Configuration.Fields.Item _  
62.
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "xxx" 
63.
   objMessage.Configuration.Fields.Item _ 
64.
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1  
65.
   objMessage.Configuration.Fields.Item _  
66.
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxx" 
67.
   objMessage.Configuration.Fields.Item _  
68.
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxx" 
69.
   objMessage.Configuration.Fields.Item _  
70.
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25   
71.
   objMessage.Configuration.Fields.Item _  
72.
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False 
73.
   objMessage.Configuration.Fields.Item _ 
74.
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60  
75.
   objMessage.Configuration.Fields.Update  
76.
 
77.
objMessage.Send 
78.
 
79.
End If 
80.
 
81.
wscript.Sleep 300000 
82.
 
83.
Loop 
84.
 
85.
Function isOnline(computername) 
86.
    On Error Resume Next  
87.
     Set computer = GetObject("WinNT://" & ComputerName & ",computer")  
88.
     isOnline = (Err.number = 0)  
89.
     On Error Goto 0  
90.
End Function
Ich bekomme den Fehler "Erlaubnis verweigert" jetzt in Zeile 45 Char 4 .... irgendwie komm ich mir langsam blöd vor , du haust hier immer allerfeinste Lösungen raus und ich scheins nichtmal ordentlich anzuwenden :S
Bitte warten ..
Mitglied: bastla
22.10.2010 um 15:46 Uhr
Hallo lirico!
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)
abändern ...

Grüße
bastla
Bitte warten ..
Mitglied: lirico
26.10.2010 um 09:42 Uhr
Hi Bastla!

Ich habs mal probiert und ", True" in der Zeile 45 angefügt , leider hat sich dadurch nichts geändert , immernoch Zugriff verweigert , das wurmt mich richtig , ich habe Adminrechte an diesem PC und aufeinmal wird mir der Zugriff auf ne txt verweigert *g*

Ich glaube nicht das es mit dem Email versand zusammenhängt da der immer tadellos funktioniert und dort ja auch nicht gemeckert wird,

Rein Testweise hab ich mal die zeile auf
01.
Set objLoFile = fso.OpenTextFile(lofile)
(also Open statt Create) , leider bringt das keine besserung , im gegenteil "Ungültiger Dateimodus" sagts mir.

Ists überhaupt noch möglich mit dem
01.
fso.OpenTextFile(logfile).Write list
statt des Set objLoFile = fso. ... zu arbeiten? Ich verstehe den Unterschied der beiden Zeilen nicht zu 100%
Bitte warten ..
Mitglied: bastla
26.10.2010 um 10:48 Uhr
Hallo lirico!
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):
01.
lofilecopy = lofile & ".copy" 
02.
fso.CopyFile lofile lofilecopy
und dann als Ersatz der Zeile 57 (dort gehört ohnehin eine Variable rein):
objMessage.AddAttachment lofilecopy
Wenn danach der Fehler erst beim Kopieren auftritt, würde das meinen Verdacht erhärten ...

Grüße
bastla
Bitte warten ..
Mitglied: lirico
26.10.2010 um 12:34 Uhr
So , ich hab das mal alles angepasst , der Code sieht jetzt so aus
01.
\'SYS: Windows Script Host Runtime Library 
02.
Set wshnet = CreateObject(\"WScript.Network\") 
03.
 
04.
 
05.
\' Liste der Computernamen, die geprüft werden sollen  
06.
computerliste = \"C:\\Computerliste.txt\"  
07.
 
08.
Do While True 
09.
 
10.
Set fso = CreateObject(\"Scripting.FileSystemObject\") 
11.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf) 
12.
lofile = \"\" 
13.
logfile = \"\" 
14.
list = \"\" 
15.
liste = \"\" 
16.
 
17.
For x = 0 to UBound(computerfeld)  
18.
  
19.
    If isOnline(computerfeld(x)) Then  
20.
        list = list & \"\\\\\" & computerfeld(x) & \"  ####\" & \" Online! \" & \"####\" & \" \" & date & \" \" & time & vbCrLf  
21.
 
22.
       Else 
23.
        liste= liste & \"\\\\\" & computerfeld(x) & \" \" & \"ist Offline\" & vbCrLf 
24.
    End If 
25.
Next 
26.
 
27.
   logfile = \"C:\\onscript\\Online-Log.txt\" 
28.
   Set objLogFile = fso.CreateTextFile(logfile)  
29.
   objLogFile.Write list  
30.
   objLogFile.Close 
31.
   
32.
 lofile = \"C:\\onscript\\Offline-Log.txt\" 
33.
    If fso.FileExists(lofile) Then 
34.
        Set objLoFile = fso.OpenTextFile(lofile)  
35.
        If Not objLoFile.AtEndOfStream Then  
36.
           ListeAlt = objLoFile.ReadAll  
37.
        Else  
38.
           ListeAlt = \"\"  
39.
       End If  
40.
      objLoFile.Close 
41.
    Else   
42.
        ListeAlt = \"\" 
43.
   End If 
44.
 
45.
   If ListeAlt <> liste Then 
46.
   Set objLoFile = fso.OpenTextFile(lofile, 2, True) 
47.
   objLoFile.Write liste  
48.
   objLoFile.Close 
49.
 
50.
   lofilecopy = lofile & \".copy\"  
51.
   fso.CopyFile lofile, lofilecopy 
52.
 
53.
   Set objMessage = CreateObject(\"CDO.Message\") 
54.
   objMessage.Subject = (\"xxx\")  
55.
   objMessage.From = (\"xxx\")  
56.
   objMessage.To = (\"xxx\") 
57.
   objMessage.CC = (\"xxx\")  
58.
   objMessage.BCC = (\"xxx\")  
59.
   objMessage.TextBody = (\"Im Ahnhang befinden sich die Offline-PCs\" & \" \" & date & \" \" & time) 
60.
   objMessage.AddAttachment lofilecopy 
61.
  
62.
   objMessage.Configuration.Fields.Item _  
63.
(\"http://schemas.microsoft.com/cdo/configuration/sendusing\") = 2   
64.
   objMessage.Configuration.Fields.Item _  
65.
(\"http://schemas.microsoft.com/cdo/configuration/smtpserver\") = \"xxx\" 
66.
   objMessage.Configuration.Fields.Item _ 
67.
(\"http://schemas.microsoft.com/cdo/configuration/smtpauthenticate\") = 1  
68.
   objMessage.Configuration.Fields.Item _  
69.
(\"http://schemas.microsoft.com/cdo/configuration/sendusername\") = \"xxx\" 
70.
   objMessage.Configuration.Fields.Item _  
71.
(\"http://schemas.microsoft.com/cdo/configuration/sendpassword\") = \"xxx\" 
72.
   objMessage.Configuration.Fields.Item _  
73.
(\"http://schemas.microsoft.com/cdo/configuration/smtpserverport\") = 25   
74.
   objMessage.Configuration.Fields.Item _  
75.
(\"http://schemas.microsoft.com/cdo/configuration/smtpusessl\") = False 
76.
   objMessage.Configuration.Fields.Item _ 
77.
(\"http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout\") = 60  
78.
   objMessage.Configuration.Fields.Update  
79.
 
80.
objMessage.Send 
81.
 
82.
End If 
83.
 
84.
wscript.Sleep 300000 
85.
 
86.
Loop 
87.
 
88.
Function isOnline(computername) 
89.
    On Error Resume Next  
90.
     Set computer = GetObject(\"WinNT://\" & ComputerName & \",computer\")  
91.
     isOnline = (Err.number = 0)  
92.
     On Error Goto 0  
93.
End Function
Evtl. erhärtet das nun deinen Verdacht , jetzt kommt der Fehler in Zeile 51 , sprich
01.
fso.CopyFile lofile, lofilecopy
(das "," hab ich selbst eingefügt , ohne ging es nicht ;) )

(Aus irgend nem Grund kommt immer ein \ wenn ich " mache , wird das bei euch auch so angezeigt?)
Bitte warten ..
Mitglied: bastla
26.10.2010 um 12:49 Uhr
Hallo lirico!
(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
Bitte warten ..
Mitglied: lirico
26.10.2010 um 14:03 Uhr
die \ sind ja für mich in sofern kein Problem da es ja nicht bei mir inner Textdatei geschrieben wird sondern nur hier im Forum , war nur damit nicht der eventuelle Einwand kommt "hier geht garnicht , haste nen \ mit drin " ;)

Immerhin weiß ich jetzt woran es liegt , interessanter Weise gibt es garkeine Probleme wenn ich ein extra Script schreibe in dem ich nur das eigentliche Script ausführe und per Do-Loop und sleeptimer das ganze immerwieder mache.

Kann ich irgendwie dafür sorgen das er einfach den Dateninhalt in den Textbody zu schreiben ? hatte das selbst schonmal ausprobiert bevor ich den AddAttachement Befehl gefunden hatte , lief leider nicht wie ich mir das vorgestellt habe. Wäre das eine Möglichkeit den Fehler zu umgehen oder bleibt der Fall des Zugriffs der gleiche , auch wenn diesmal nicht die Datei sondern nur der Inhalt verschickt wird? bzw. ich würde dann ja nur die lofilecopy Variable in den Textbody einlesen (keine Ahnung ob das nen Unterschied macht)

Und son vergessenes " , " ist eigentlich ganz gut , da is man direkt aufgerufen sich das alles nochmal gaaaanz genau anzugucken xD

Grüße
lirico

*edita*
01.
  lofilecopy = lofile & ".copy"
ist das ".copy" nötig? atm störts mehr als es hilft (rein subjektiv)
Bitte warten ..
Mitglied: bastla
26.10.2010 um 14:17 Uhr
Hallo lirico!
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)
Grüße
bastla
Bitte warten ..
Mitglied: lirico
26.10.2010 um 15:59 Uhr
Hallo bastla! xD

Die Zeile spuckt mir nen Syntaxerror aus , ich hab mal ein & weggenommen (bei den 2 & in Folge) , kein Error mehr.
Leider kommt nu auch garkeine Mail mehr an *g* ich werd mich morgen wieder dran setzen , werd für heute erstmal den Platz räumen ;)

Ich danke dir "wie immer" sehr ;) ist einfach klasse das es Foren wie diese und User wie dich gibt =)

Grüße
lirico
Bitte warten ..
Mitglied: bastla
26.10.2010 um 16:06 Uhr
Hallo lirico!

Das mit den beiden "&" war natürlich als Ausgleich für das Komma von oben gemeint ...

Abgesehen von einer Vereinfachung auf
objMessage.TextBody = "Offline-PC " & Now & vbCrLf & vbCrLf & liste
habe ich nun aber leider wirklich nix mehr zu bieten.

Grüße
bastla
Bitte warten ..
Mitglied: lirico
27.10.2010 um 10:35 Uhr
Hallo Bastla!

Ich war einbisschen vorschnell zu behaupten es würden keine Mails mehr ankommen , sie tun es noch nur dauerts aus mir unbekannten Gründen gut ne Minute länger als zuvor .
01.
objMessage.TextBody = "Offline-PC " & Now & vbCrLf & vbCrLf & liste
<- ich kann auch lofile benutzten statt der liste oder? hat ja eigentlich keinen Unterschied?

Ich test das Script jetzt mit variierender Computerliste und überleg mir was ich noch verbessern könnte , ansonsten ists glaub ich endlich vollbracht xD

Grüße
lirico
Bitte warten ..
Mitglied: lirico
27.10.2010 um 11:50 Uhr
01.
'SYS: Windows Script Host Runtime Library 
02.
Set wshnet = CreateObject("WScript.Network") 
03.
 
04.
 
05.
' Liste der Computernamen, die geprüft werden sollen  
06.
computerliste = "C:\onscript\liste\Computerliste.txt"  
07.
 
08.
Do While True 
09.
 
10.
Set fso = CreateObject("Scripting.FileSystemObject") 
11.
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf) 
12.
 
13.
list = "" 
14.
liste = "" 
15.
 
16.
For x = 0 to UBound(computerfeld)  
17.
 
18.
    If isOnline(computerfeld(x)) Then  
19.
        list = list & "\\" & computerfeld(x) & "  ####" & " Online! " & "####" & " " & date & " " & time & vbCrLf  
20.
 
21.
       Else 
22.
        liste= liste & "\\" & computerfeld(x) & " " & "ist Offline"  &  vbCrLf 
23.
    End If 
24.
Next 
25.
 
26.
   logfile = "C:\onscript\Online-Log.txt" 
27.
   Set objLogFile = fso.CreateTextFile(logfile)  
28.
   objLogFile.Write list  
29.
   objLogFile.Close 
30.
   
31.
 lofile = "C:\onscript\Offline-Log.txt" 
32.
    If fso.FileExists(lofile) Then 
33.
        Set objLoFile = fso.OpenTextFile(lofile)  
34.
        If Not objLoFile.AtEndOfStream Then  
35.
           ListeAlt = objLoFile.ReadAll  
36.
        Else  
37.
           ListeAlt = ""  
38.
       End If  
39.
      objLoFile.Close 
40.
    Else   
41.
        ListeAlt = "" 
42.
   End If 
43.
 
44.
   If ListeAlt <> liste Then 
45.
   Set objLoFile = fso.OpenTextFile(lofile, 2, True) 
46.
   objLoFile.Write liste  
47.
   objLoFile.Close 
48.
 
49.
   Set objMessage = CreateObject("CDO.Message") 
50.
   objMessage.Subject = ("Offline PCs") 
51.
   objMessage.From = ("xxx")  
52.
   objMessage.To = ("xxx") 
53.
   objMessage.CC = ("xxx")  
54.
   objMessage.BCC = ("xxx") 
55.
   objMessage.TextBody = ("Offline-PC " & date & " " & time & ":" & vbCrLf &  vbCrLf & liste) 
56.
 
57.
   objMessage.Configuration.Fields.Item _ 
58.
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2   
59.
   objMessage.Configuration.Fields.Item _  
60.
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "xxx" 
61.
   objMessage.Configuration.Fields.Item _ 
62.
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1  
63.
   objMessage.Configuration.Fields.Item _  
64.
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxx" 
65.
   objMessage.Configuration.Fields.Item _  
66.
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxx" 
67.
   objMessage.Configuration.Fields.Item _  
68.
("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25   
69.
   objMessage.Configuration.Fields.Item _  
70.
("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False 
71.
   objMessage.Configuration.Fields.Item _ 
72.
("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60  
73.
   objMessage.Configuration.Fields.Update  
74.
 
75.
objMessage.Send 
76.
 
77.
Else 
78.
 
79.
End If 
80.
 
81.
wscript.Sleep 300000 
82.
 
83.
Loop 
84.
 
85.
Function isOnline(computername) 
86.
    On Error Resume Next  
87.
     Set computer = GetObject("WinNT://" & ComputerName & ",computer")  
88.
     isOnline = (Err.number = 0)  
89.
     On Error Goto 0  
90.
End Function
Ich wollts einfach nochmal reinstellen so wie ichs jetzt habe und benutzte. Läuft jetzt alles Fehlerfrei (so far). Ich werd nochmal gucken ob ich irgendwie den Hostnamen mit in die Mails geschrieben bekomme , ansonsten ist denk ich alles abgegessen.

"Eternal thanks" von mir an den Bastla xD selten das man soviel geballtes Wissen&Hilfsbereitschaft findet. Ich werd den Beitrag hier als gelöst markieren sobald ich das mit dem Hostnamen geschafft oder aufgegeben habe *g*

Grüße
lirico
Bitte warten ..
Mitglied: lirico
27.10.2010 um 12:36 Uhr
Hallo Bastla!

Ich hab mich mal einbisschen umgeguckt in sachen Hostnamen auflösen etc.
Ich hab nen ganz netten Code gefunden den ich denk ich mal nur einbisschen abändern muss für meine Zwecke. Da fangen die Probleme an *g*

01.
Set IPConfigSet = GetObject("winmgmts://.").ExecQuery("select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")  
02.
    For Each IPConfig In IPConfigSet  
03.
            If Not IsNull(IPConfig.IPAddress) Then  
04.
                    For i=LBound(IPConfig.IPAddress) To UBound(IPConfig.IPAddress)  
05.
		    Set WshNetwork = WScript.CreateObject("WScript.Network")  
06.
		    WScript.Echo "Computer Name = " & WshNetwork.ComputerName & VBCrLf _  
07.
		    & "IP = " & IPConfig.IPAddress(i) & VBCrLf _  
08.
		    & "Subnet: " & IPConfig.IPSubnet(i) & VBCrLf _ 
09.
		    & "MAC Address " & IPConfig.MACAddress  
10.
                    Next 
11.
		    if (WshNetwork.ComputerName = "DEINCOMPUTERNAME") Then 
12.
			WScript.Echo "RICHTIG"  
13.
		    End If  
14.
            End If 
15.
    Next
Ich versteh schonmal garnicht wofür das "WScript.Echo "Richtig"" sein soll , scheint garkeine Funktion zu haben ? Ich müsste theoretisch einfach die
01.
Set IPConfigSet = GetObject("winmgmts://.").ExecQuery("select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE") 
Zeile ändern um auf meine Computerliste zuzugreifen oder? Und dann ebend die Echoes ersetzen gegen ebend Aufträge zu schreiben.

Bevor ich jetzt ewig dran rum bastel , meine Frage : Kann ich diesen Code überhaupt nutzen oder ist der evtl. "nicht kompatibel" mit meinem Script?

Grüße
lirico
Bitte warten ..
Mitglied: bastla
27.10.2010 um 16:14 Uhr
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:
01.
' Liste der Computernamen, die geprüft werden sollen  
02.
computerliste = "C:\onscript\liste\Computerliste.txt"  
03.
' Logfiles 
04.
logfile = "C:\onscript\Online-Log.txt" 
05.
lofile = "C:\onscript\Offline-Log.txt" 
06.
 
07.
Set wshnet = CreateObject("WScript.Network") 
08.
Set fso = CreateObject("Scripting.FileSystemObject") 
09.
 
10.
Do While True 
11.
    computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf) 
12.
    list = "" 
13.
    liste = "" 
14.
 
15.
    For x = 0 to UBound(computerfeld)  
16.
        If isOnline(computerfeld(x)) Then  
17.
            list = list & "\\" & computerfeld(x) & "  ####" & " Online! " & "####" & " " & date & " " & time & vbCrLf  
18.
       Else 
19.
            liste= liste & "\\" & computerfeld(x) & " " & "ist Offline"  &  vbCrLf 
20.
        End If 
21.
    Next 
22.
 
23.
    Set objLogFile = fso.CreateTextFile(logfile)  
24.
    objLogFile.Write list  
25.
    objLogFile.Close 
26.
   
27.
    If fso.FileExists(lofile) Then 
28.
        Set objLoFile = fso.OpenTextFile(lofile)  
29.
        If Not objLoFile.AtEndOfStream Then  
30.
            ListeAlt = objLoFile.ReadAll  
31.
        Else  
32.
            ListeAlt = ""  
33.
        End If  
34.
        objLoFile.Close 
35.
    Else   
36.
        ListeAlt = "" 
37.
    End If 
38.
 
39.
    If ListeAlt <> liste Then 
40.
        Set objLoFile = fso.OpenTextFile(lofile, 2, True) 
41.
        objLoFile.Write liste  
42.
        objLoFile.Close 
43.
 
44.
        SendMail 
45.
    End If 
46.
 
47.
    WScript.Sleep 300000 
48.
Loop 
49.
 
50.
Function isOnline(computername) 
51.
On Error Resume Next  
52.
Set computer = GetObject("WinNT://" & ComputerName & ",computer")  
53.
isOnline = (Err.number = 0)  
54.
On Error Goto 0  
55.
End Function 
56.
 
57.
Sub SendMail() 
58.
Set objMessage = CreateObject("CDO.Message") 
59.
objMessage.Subject = ("Offline PCs") 
60.
objMessage.From = ("xxx")  
61.
objMessage.To = ("xxx") 
62.
objMessage.CC = ("xxx")  
63.
objMessage.BCC = ("xxx") 
64.
objMessage.TextBody = ("Offline-PC, Stand: " & Now) 
65.
objMessage.AddAttachment lofile 
66.
 
67.
objMessage.Configuration.Fields.Item _ 
68.
    ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2   
69.
objMessage.Configuration.Fields.Item _  
70.
    ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "xxx" 
71.
objMessage.Configuration.Fields.Item _ 
72.
    ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1  
73.
objMessage.Configuration.Fields.Item _  
74.
    ("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxx" 
75.
objMessage.Configuration.Fields.Item _  
76.
    ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxx" 
77.
objMessage.Configuration.Fields.Item _  
78.
    ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25   
79.
objMessage.Configuration.Fields.Item _  
80.
    ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False 
81.
objMessage.Configuration.Fields.Item _ 
82.
    ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60  
83.
objMessage.Configuration.Fields.Update  
84.
 
85.
objMessage.Send 
86.
Set objMessage = Nothing 
87.
End Sub
Grüße
bastla
Bitte warten ..
Mitglied: bastla
27.10.2010 um 22:13 Uhr
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:
01.
Set objWMIService = GetObject("winmgmts:{impersonationLevel=Impersonate}!\\" & computerfeld(x) & "\root\cimv2") 
02.
Set CompSys = objMWIService.ExecQuery("Select * from Win32_ComputerSystem") 
03.
For Each Comp In CompSys 
04.
    ComputerName = Comp.Name 
05.
Next
In Summe gesehen kann ich Dir also nicht wirklich Mut machen ...

Grüße
bastla
Bitte warten ..
Mitglied: lirico
29.10.2010 um 08:54 Uhr
Hallo Bastla!

Dann hör ich einfach mal auf das ganze hier adabsurdum zu führen mit scheinbar unmöglichen Funktionen *g* Auch muss ich denk ich die ausgezeichnete Hilfe hier nicht weiter in Beschlag nehmen.

Nochmal ein ganz dickes Danke an dich, falls ich nochmal in die Verlegenheit komme so ein Script zu *bauen* meld ich mich sicher wieder
*Beitrag gelöst*

Grüße
lirico
Bitte warten ..
Mitglied: bastla
29.10.2010 um 10:12 Uhr
Hallo lirico!

Na dann bis zum nächsten Mal ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch um mehrere IP-Adressen via Ping auf Erreichbarkeit zu prüfen (5)

Frage von Galindiesel zum Thema Batch & Shell ...

SAN, NAS, DAS
gelöst QNAP TS-453U - drei IP-Adressen für iSCSI , SMB , Management (2)

Frage von caspi-pirna zum Thema SAN, NAS, DAS ...

Outlook & Mail
gelöst Email Anhänge speichern VB Script aber nur bestimmte Dateitypen (Outlook) (4)

Frage von LindeUnimog zum Thema Outlook & Mail ...

SAN, NAS, DAS
QNAP Installationsproblem wenn der Client mehre statische IP-Adressen hat (6)

Erfahrungsbericht von StefanKittel zum Thema SAN, NAS, DAS ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (14)

Frage von liquidbase zum Thema Windows Update ...

DSL, VDSL
Problem mit variernder Internetgeschwindigkeit (12)

Frage von schaurian zum Thema DSL, VDSL ...