lirico
Goto Top

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

Content-Key: 152463

Url: https://administrator.de/contentid/152463

Printed on: April 26, 2024 at 18:04 o'clock

Member: bastla
bastla Oct 06, 2010 at 11:23:05 (UTC)
Goto Top
Hallo lirico und willkommen im Forum!

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, ",")  
durch
computerliste = "D:\Computerliste.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf)
ersetzen.
Für die Ausgabe in eine Textdatei anstelle von "MsgBox list"
logfile = "D:\Online-Log-txt"  

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:
set Sh = CreateObject("WScript.Shell")  

Do While True 'Endlosschleife; falls Abbruchkriterium verfügbar, hier angeben  
    liste = ""  
    ...
    ...


    Sh.Sleep 600000 'Angabe in ms  
Loop
Hinsichtlich des Mailversands kommt es auf die Umgebung an, in welcher das Script laufen soll ...

Grüße
bastla

P.S.: "Code"-Formatierung ist beschrieben ...
Member: lirico
lirico Oct 06, 2010 at 11:57:45 (UTC)
Goto Top
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
For x = 0 to UBound(computerfeld)
   list = list & "\\" & computerfeld(x) & " online? " & isOnline(computerfeld(x)) & vbCrLf  
Next
oder verstehe ich da was falsch?

Immoment siehts jetzt so aus
'SYS: Windows Script Host Runtime Library  
Set wshnet = CreateObject("WScript.Network")  

' Liste derComputernamen, 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)
   list = list & "\\" & computerfeld(x) & " online? " & isOnline(computerfeld(x)) & vbCrLf  
Next

logfile = "C:\Online-Log.txt"   
fso.OpenTextFile(logfile, 8, True).Write list

Function isOnline(computername)
    On Error Resume Next
    Set computer = GetObject("WinNT://" & ComputerName & ",computer")  
    isOnline = (Err.number = 0)
    On Error Goto 0
End Function

Wie man sieht sind schon einpaar scheinbar überflüssige Zeilen verschwunden
Member: bastla
bastla Oct 06, 2010, updated at Oct 18, 2012 at 16:43:43 (UTC)
Goto Top
Hallo lirico!
Die Schleife baue ich über&unter ...
Genau. face-smile
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 face-wink

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) ...
Member: lirico
lirico Oct 06, 2010 at 12:58:32 (UTC)
Goto Top
Leider war ich nicht schnell genug das mit dem Date & Time hatte ich schon rausgefunden , trotzdem nochmal danke für die Mühen xD

'SYS: Windows Script Host Runtime Library  
Set wshnet = CreateObject("WScript.Network")  

' Liste derComputernamen, 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)
   list = list & "\\" & computerfeld(x) & " online? " & "##" & isOnline(computerfeld(x))& "##" &" " & date & " " & time & vbCrLf  
Next

logfile = "C:\Online-Log.txt"   
fso.CreateTextFile(logfile).Write list

Function isOnline(computername)
    On Error Resume Next
    Set computer = GetObject("WinNT://" & ComputerName & ",computer")  
    isOnline = (Err.number = 0)
    On Error Goto 0
End Function

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 =)
Member: bastla
bastla Oct 06, 2010 at 13:20:34 (UTC)
Goto Top
Hallo lirico!
Danke , ich weiß die Mühen sehr zu schätzen =)
Gerne, aber bis jetzt war's noch keine Mühe ... face-wink

Da die Function "isOnline()" ja ohnehin "True" oder "False" liefert, genügt als Unterscheidung ein
If isOnline(computerfeld(x)) Then
    ...
Else
    ....
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
Member: lirico
lirico Oct 06, 2010 at 14:44:50 (UTC)
Goto Top
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
Member: lirico
lirico Oct 07, 2010 at 12:06:28 (UTC)
Goto Top
Sooo , endlich Zeit gefunden um weiter zu machen , kommt direkt das erste Problem. ich wollete das
If isOnline(computerfeld(x)) Then
      ....
 Else 
    .....
End If

Über&Unter
For x = 0 to UBound(computerfeld)
    list = list & "\\" & computerfeld(x) & " online? " & "##" & isOnline(computerfeld(x))& "##" &" " & date & " " & time & vbCrLf  
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?

logfile = "C:\Online-Log.txt"    
fso.CreateTextFile(logfile).Write list
Ist es egal wo das steht oder muss es nach der "list" deklarierung stehen um noch zu funktionieren?
Member: lirico
lirico Oct 07, 2010 at 12:16:06 (UTC)
Goto Top
OK , die If geschichte scheint jetzt zu funktionieren.

Mein Script sieht jetzt so aus :
'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? " & "##" & isOnline(computerfeld(x))& "##" & " " & date & " " & time & vbCrLf  

Else
    liste= liste & "\\" & computerfeld(x) & " " & "ist Offline" & " " & date & " " & time & vbCrLf  
End If
Next

logfile = "C:\Online-Log.txt"  
fso.CreateTextFile(logfile).Write list
lofile = "C:\Offline-Log.txt"  
fso.CreateTextFile(lofile).Write liste

Function isOnline(computername)
     On Error Resume Next
     Set computer = GetObject("WinNT://" & ComputerName & ",computer")  
     isOnline = (Err.number = 0)
     On Error Goto 0
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?
Member: bastla
bastla Oct 07, 2010 at 15:46:32 (UTC)
Goto Top
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
Member: lirico
lirico Oct 07, 2010 at 16:25:01 (UTC)
Goto Top
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?
Member: Biber
Biber Oct 07, 2010 at 16:41:03 (UTC)
Goto Top
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
Member: bastla
bastla Oct 07, 2010 at 16:54:21 (UTC)
Goto Top
@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:
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
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. face-wink

Grüße
bastla
Member: Biber
Biber Oct 07, 2010 at 17:07:32 (UTC)
Goto Top
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
Member: bastla
bastla Oct 07, 2010 at 17:16:05 (UTC)
Goto Top
dann will bestimmt bald Dieter Bohlen hier mitmoderieren.
Ok, das war überzeugend face-wink -

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
Member: lirico
lirico Oct 08, 2010 at 06:05:26 (UTC)
Goto Top
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
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
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 )
Member: bastla
bastla Oct 08, 2010 at 10:19:10 (UTC)
Goto Top
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
Member: lirico
lirico Oct 08, 2010 at 11:05:39 (UTC)
Goto Top
Ich hatte gedacht ich lasse die ganze
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

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?
Member: bastla
bastla Oct 08, 2010 at 11:59:35 (UTC)
Goto Top
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
Member: lirico
lirico Oct 18, 2010 at 12:57:40 (UTC)
Goto Top
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)
Set objMessage = CreateObject("CDO.Message")    
objMessage.Subject = ("xxxxx")   
objMessage.From = ("xxxxx")   
objMessage.To = ("xxxxx")   
objMessage.CC = ("xxxx")   
objMessage.BCC = ("xxxx")   
objMessage.TextBody = ("Im Ahnhang befinden sich die Offline-PCs")  
objMessage.AddAttachment "C:\Offline-Log.txt"  
 
objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2    
objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "xxxxx"   
objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1   
objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxxxx"   
objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxxxx"   
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 

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?
Member: bastla
bastla Oct 18, 2010 at 16:33:26 (UTC)
Goto Top
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
IP = Split(computerfeld(x), vbTab)(0)
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
Member: lirico
lirico Oct 19, 2010 at 13:33:55 (UTC)
Goto Top
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.
'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"  
fso.CreateTextFile(lofile).Write liste

Function isOnline(computername)
     On Error Resume Next
     Set computer = GetObject("WinNT://" & ComputerName & ",computer")  
     isOnline = (Err.number = 0)
     On Error Goto 0
End Function 
Das *alte* Script ebend ^^

2.
strComputer = "."  

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")  

Set colFiles = objWMIService.ExecQuery _
    ("Select * from CIM_Datafile Where Name = 'C:\\onscript\\offline-Log.txt'")  

For Each objFile in colFiles
    strOriginalTimestamp = objFile.LastModified
Next



Do While True
    Wscript.Sleep 800000
    Set colFiles = objWMIService.ExecQuery _
        ("Select * from CIM_Datafile Where Name = 'C:\\onscript\\offline-Log.txt'")  

    For Each objFile in colFiles
        strLatestTimestamp = objFile.LastModified
    Next 

If strLatestTimestamp >= strOriginalTimestamp Then
 Set objMessage = CreateObject("CDO.Message")    
   objMessage.Subject = ("xxxx")   
   objMessage.From = ("xxxx")   
   objMessage.To = ("xxxx")   
   objMessage.CC = ("xxxx")   
   objMessage.BCC = ("xxxx")   
   objMessage.TextBody = ("Im Ahnhang befinden sich die Offline-PCs")  
   objMessage.AddAttachment "C:\onscript\offline-Log.txt"  
 
   objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2    
   objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "172.26.254.37"   
   objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1   
   objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxxx"   
   objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxxx"   
   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 

    Else
       
        strOriginalTimestamp = strLatestTimeStamp
    End If
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
Member: bastla
bastla Oct 19, 2010 at 13:59:57 (UTC)
Goto Top
Hallo lirico!

Nach nochmaliger Überlegung frage ich mich (und jetzt Dich face-wink), 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:
'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 
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
Member: lirico
lirico Oct 19, 2010 at 16:02:13 (UTC)
Goto Top
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 ^^
Member: bastla
bastla Oct 19, 2010 at 16:12:56 (UTC)
Goto Top
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:
'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
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 face-smile
Member: lirico
lirico Oct 21, 2010 at 06:24:35 (UTC)
Goto Top
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
Dim oShell, a 
oShell = CreateObject("Wscript.Shell")   
a = "U:\PrüfenOnlineF2.vbs"   
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 ? )
Member: bastla
bastla Oct 21, 2010 at 07:38:30 (UTC)
Goto Top
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
logfile = "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
Grüße
bastla
Member: lirico
lirico Oct 21, 2010 at 07:41:14 (UTC)
Goto Top
Ah! habs selbst gelöst bekommen per
Option Explicit

Do While True

dim eingabe, pfad
dim sh: set sh=CreateObject("Wscript.Shell")  
pfad = "U:\"  
eingabe = "PrüfenOnlineF2.vbs"  



sh.run(pfad & eingabe)
set sh = nothing

Wscript.Sleep 400000

Loop

Damit is mein Problem jetzt endgültig gegessen denk ich xD

Danke nochmal für alles!

lG
lirico
Member: lirico
lirico Oct 21, 2010 at 07:49:18 (UTC)
Goto Top
: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!
Member: lirico
lirico Oct 21, 2010 at 08:46:40 (UTC)
Goto Top
'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) 

Do While True
    
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"    
   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

    
   Set objMessage = CreateObject("CDO.Message")    
   objMessage.Subject = ("xxx")   
   objMessage.From = ("xxx")   
   objMessage.To = ("xxx")   
   objMessage.CC = ("xxx")   
   objMessage.BCC = ("xxx")   
   objMessage.TextBody = ("Im Ahnhang befinden sich die Offline-PCs")  
   objMessage.AddAttachment "C:\onscript\offline-Log.txt"  
 
   objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2    
   objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "172.26.254.37"   
   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

End If

Wscript.Sleep 600000

Loop
 
Function isOnline(computername) 
    On Error Resume Next 
     Set computer = GetObject("WinNT://" & ComputerName & ",computer")   
     isOnline = (Err.number = 0) 
     On Error Goto 0 
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
Member: bastla
bastla Oct 21, 2010 at 15:54:45 (UTC)
Goto Top
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
list = ""  
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
   If fso.FileExists(lofile) Then
      Set objLoFile = fso.OpenTextFile(lofile)
      ListeAlt = objLoFile.ReadAll
      objLoFile.Close
   Else
      ListeAlt = ""  
   End If
ersetzt werden, damit auch der Fall "Offline-Log.txt existiert (noch) nicht" berücksichtigt ist.

Grüße
bastla
Member: lirico
lirico Oct 22, 2010 at 06:51:45 (UTC)
Goto Top
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
list =  " "  
liste = " "  
da?
Member: bastla
bastla Oct 22, 2010 at 08:48:52 (UTC)
Goto Top
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
Member: lirico
lirico Oct 22, 2010 at 09:49:10 (UTC)
Goto Top
Hallo Bastla!

Ich dachte hinzugefügt wird nur wenn ich
fso.OpenTextFile(logfile).Write liste
(z.b.) benutze. Und das war doch schon durch das
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
'SYS: Windows Script Host Runtime Library  
Set wshnet = CreateObject("WScript.Network")  


' Liste der Computernamen, die geprüft werden sollen   
computerliste = "C:\Computerliste.txt"   

Do While True


Set fso = CreateObject("Scripting.FileSystemObject")   
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
 
   logfile = "C:\onscript\Online-Log.txt"    
   Set objLogFile = fso.CreateTextFile(logfile) 
   objLogFile.Write list 
   objLogFile.Close
  
   lofile = "C:\onscript\Offline-Log.txt"  
     If fso.FileExists(lofile) Then 
        Set objLoFile = fso.OpenTextFile(lofile)
        ListeAlt = objLoFile.ReadAll 
        objLoFile.Close 
     Else 
        ListeAlt = ""  
     End If
   If ListeAlt <> liste Then 
   Set objLoFile = fso.CreateTextFile(lofile)
   objLoFile.Write liste 
   objLoFile.Close

    
   Set objMessage = CreateObject("CDO.Message")    
   objMessage.Subject = ("xxx")   
   objMessage.From = ("xxx")   
   objMessage.To = ("xxx")   
   objMessage.CC = ("xxx")   
   objMessage.BCC = ("xxx")   
   objMessage.TextBody = ("Im Ahnhang befinden sich die Offline-PCs" & " " & date & " " & time)  
   objMessage.AddAttachment "C:\onscript\offline-Log.txt"  
 
   objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2    
   objMessage.Configuration.Fields.Item _ 
("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "172.26.254.37"  
   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

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

*edit* hab die schleife einfach mal raus genommen ,der fehler bleibt bestehen, scheint also nix mit der schleife zutun zu haben
Member: bastla
bastla Oct 22, 2010 at 10:04:22 (UTC)
Goto Top
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
If Not objLoFile.AtEndOfStream Then
    ListeAlt = objLoFile.ReadAll
Else
    ListeAlt = ""  
End If
Grüße
bastla
Member: lirico
lirico Oct 22, 2010 at 10:42:12 (UTC)
Goto Top
die Zeile "objLoFile.Close" wird weggelassen?

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

lG
lirico

*edit*
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
   If ListeAlt <> liste Then
   Set objLoFile = fso.CreateTextFile(lofile)
   objLoFile.Write liste 
   objLoFile.Close
Da muss noch ein extra End If rein wenn ich nich irre
Member: bastla
bastla Oct 22, 2010 at 12:47:22 (UTC)
Goto Top
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 ... face-wink
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
Grüße
bastla
Member: lirico
lirico Oct 22, 2010 at 13:39:32 (UTC)
Goto Top
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 ->
'SYS: Windows Script Host Runtime Library  
Set wshnet = CreateObject("WScript.Network")  


' Liste der Computernamen, die geprüft werden sollen   
computerliste = "C:\Computerliste.txt"   

Do While True

Set fso = CreateObject("Scripting.FileSystemObject")  
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

   logfile = "C:\onscript\Online-Log.txt"  
   Set objLogFile = fso.CreateTextFile(logfile) 
   objLogFile.Write list 
   objLogFile.Close
  
 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

   If ListeAlt <> liste Then
   Set objLoFile = fso.CreateTextFile(lofile)
   objLoFile.Write liste 
   objLoFile.Close


   Set objMessage = CreateObject("CDO.Message")    
   objMessage.Subject = ("xxx")   
   objMessage.From = ("xxx")   
   objMessage.To = ("xxx")  
   objMessage.CC = ("xxx")   
   objMessage.BCC = ("xxx")   
   objMessage.TextBody = ("Im Ahnhang befinden sich die Offline-PCs" & " " & date & " " & time)  
   objMessage.AddAttachment "C:\onscript\offline-Log.txt"  
 
   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

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

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
Member: bastla
bastla Oct 22, 2010 at 13:46:26 (UTC)
Goto Top
Hallo lirico!
Ich bekomme den Fehler "Erlaubnis verweigert" jetzt in Zeile 45 Char 4
Ist wenigstens kein neuer Fehler, sondern der gleiche wie vorher ... face-wink

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
Member: lirico
lirico Oct 26, 2010 at 07:42:33 (UTC)
Goto Top
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
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
fso.OpenTextFile(logfile).Write list
statt des Set objLoFile = fso. ... zu arbeiten? Ich verstehe den Unterschied der beiden Zeilen nicht zu 100%
Member: bastla
bastla Oct 26, 2010 at 08:48:10 (UTC)
Goto Top
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):
lofilecopy = lofile & ".copy"  
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
Member: lirico
lirico Oct 26, 2010 at 10:34:24 (UTC)
Goto Top
So , ich hab das mal alles angepasst , der Code sieht jetzt so aus
\'SYS: Windows Script Host Runtime Library  
Set wshnet = CreateObject(\"WScript.Network\")  


\' Liste der Computernamen, die geprüft werden sollen   
computerliste = \"C:\\Computerliste.txt\"   

Do While True

Set fso = CreateObject(\"Scripting.FileSystemObject\")  
computerfeld = Split(fso.OpenTextFile(computerliste).ReadAll, vbCrLf)
lofile = \"\"  
logfile = \"\"  
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

   logfile = \"C:\\onscript\\Online-Log.txt\"  
   Set objLogFile = fso.CreateTextFile(logfile) 
   objLogFile.Write list 
   objLogFile.Close
  
 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

   If ListeAlt <> liste Then
   Set objLoFile = fso.OpenTextFile(lofile, 2, True)
   objLoFile.Write liste 
   objLoFile.Close

   lofilecopy = lofile & \".copy\"   
   fso.CopyFile lofile, lofilecopy

   Set objMessage = CreateObject(\"CDO.Message\")  
   objMessage.Subject = (\"xxx\")   
   objMessage.From = (\"xxx\")   
   objMessage.To = (\"xxx\")  
   objMessage.CC = (\"xxx\")   
   objMessage.BCC = (\"xxx\")   
   objMessage.TextBody = (\"Im Ahnhang befinden sich die Offline-PCs\" & \" \" & date & \" \" & time)  
   objMessage.AddAttachment lofilecopy
 
   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

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

Evtl. erhärtet das nun deinen Verdacht , jetzt kommt der Fehler in Zeile 51 , sprich
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?)
Member: bastla
bastla Oct 26, 2010 at 10:49:22 (UTC)
Goto Top
Hallo lirico!
(das "," hab ich selbst eingefügt , ohne ging es nicht ;) )
Sorry, das liegt bei mir wohl noch irgendwo unter dem Tisch herum ... face-wink
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 ... face-sad
(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
Member: lirico
lirico Oct 26, 2010 at 12:03:03 (UTC)
Goto Top
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*
  lofilecopy = lofile & ".copy"  
ist das ".copy" nötig? atm störts mehr als es hilft (rein subjektiv)
Member: bastla
bastla Oct 26, 2010 at 12:17:41 (UTC)
Goto Top
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
Member: lirico
lirico Oct 26, 2010 at 13:59:17 (UTC)
Goto Top
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
Member: bastla
bastla Oct 26, 2010 at 14:06:37 (UTC)
Goto Top
Hallo lirico!

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

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

Grüße
bastla
Member: lirico
lirico Oct 27, 2010 at 08:35:13 (UTC)
Goto Top
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 .
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
Member: lirico
lirico Oct 27, 2010 at 09:50:18 (UTC)
Goto Top
'SYS: Windows Script Host Runtime Library  
Set wshnet = CreateObject("WScript.Network")  


' Liste der Computernamen, die geprüft werden sollen   
computerliste = "C:\onscript\liste\Computerliste.txt"   

Do While True

Set fso = CreateObject("Scripting.FileSystemObject")  
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

   logfile = "C:\onscript\Online-Log.txt"  
   Set objLogFile = fso.CreateTextFile(logfile) 
   objLogFile.Write list 
   objLogFile.Close
  
 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

   If ListeAlt <> liste Then
   Set objLoFile = fso.OpenTextFile(lofile, 2, True)
   objLoFile.Write liste 
   objLoFile.Close

   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 " & date & " " & time & ":" & vbCrLf &  vbCrLf & liste)  

   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

Else

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

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
Member: lirico
lirico Oct 27, 2010 at 10:36:42 (UTC)
Goto Top
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*

Set IPConfigSet = GetObject("winmgmts://.").ExecQuery("select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")   
    For Each IPConfig In IPConfigSet 
            If Not IsNull(IPConfig.IPAddress) Then 
                    For i=LBound(IPConfig.IPAddress) To UBound(IPConfig.IPAddress) 
		    Set WshNetwork = WScript.CreateObject("WScript.Network")   
		    WScript.Echo "Computer Name = " & WshNetwork.ComputerName & VBCrLf _   
		    & "IP = " & IPConfig.IPAddress(i) & VBCrLf _   
		    & "Subnet: " & IPConfig.IPSubnet(i) & VBCrLf _  
		    & "MAC Address " & IPConfig.MACAddress   
                    Next
		    if (WshNetwork.ComputerName = "DEINCOMPUTERNAME") Then  
			WScript.Echo "RICHTIG"   
		    End If 
            End If
    Next

Ich versteh schonmal garnicht wofür das "WScript.Echo "Richtig"" sein soll , scheint garkeine Funktion zu haben ? Ich müsste theoretisch einfach die
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
Member: bastla
bastla Oct 27, 2010 at 14:14:42 (UTC)
Goto Top
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:
' 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
Grüße
bastla
Member: bastla
bastla Oct 27, 2010 at 20:13:21 (UTC)
Goto Top
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:
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
In Summe gesehen kann ich Dir also nicht wirklich Mut machen ... face-sad

Grüße
bastla
Member: lirico
lirico Oct 29, 2010 at 06:54:07 (UTC)
Goto Top
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
Member: bastla
bastla Oct 29, 2010 at 08:12:14 (UTC)
Goto Top
Hallo lirico!

Na dann bis zum nächsten Mal ... face-smile

Grüße
bastla