VBS For Each Schleife in vorhandenen Code einfügen -
Hallo zusammen,
ich habe hier ein Skript welches auf einem Remote-Server das EreignisLog checkt und mir dann eine Mail schickt mit allen Errormeldungen in den Bereichen "System" und "Anwendung". Soweit klappt dies auch.
Nun möchte ich aber mit dem selben Skript mehrere Server auf einmal checken so, dass ich eine Mail bekomme mit den Errormeldungen von allen Servern.
Ich hänge mal eine Kopie von dem Skript an, als dies noch wenigstens mit einem Server funktionierte. Das Skript indem ich versucht habe die Schleife einzubauen, mute ich euch lieber nicht zu. ^^
Wenn ich das richtig sehe, müssen ja "nur" die beiden For Each Schleifen sowie am Anfang die Tabellen für jeden Server in dem Array dann ausgeführt werden. Ist aber nicht so einfach, wie ich finde...
Zum testen einfach die Daten oben in den Einstellungen anpassen.
Danke im Voraus
Gruß Azubi
Das Skript habe ich übrigens von hier : Zentrale und automatisierte Bereitstellung aller Windows Logfiles
ich habe hier ein Skript welches auf einem Remote-Server das EreignisLog checkt und mir dann eine Mail schickt mit allen Errormeldungen in den Bereichen "System" und "Anwendung". Soweit klappt dies auch.
Nun möchte ich aber mit dem selben Skript mehrere Server auf einmal checken so, dass ich eine Mail bekomme mit den Errormeldungen von allen Servern.
Ich hänge mal eine Kopie von dem Skript an, als dies noch wenigstens mit einem Server funktionierte. Das Skript indem ich versucht habe die Schleife einzubauen, mute ich euch lieber nicht zu. ^^
Wenn ich das richtig sehe, müssen ja "nur" die beiden For Each Schleifen sowie am Anfang die Tabellen für jeden Server in dem Array dann ausgeführt werden. Ist aber nicht so einfach, wie ich finde...
Zum testen einfach die Daten oben in den Einstellungen anpassen.
Danke im Voraus
Gruß Azubi
Das Skript habe ich übrigens von hier : Zentrale und automatisierte Bereitstellung aller Windows Logfiles
'--------------------------------------------------Einstellungen-------------------------------------------------
'Gibt die Maximale Anzahl der zurückgelieferten Einträge an
'Werte für System Log
maxwert = 50
'Werte für Application Log
maxwert2 = 25
'gibt an wieviele Tage zurück gegangen werden soll
zeitsp = 7
'Email Settings
absender = "absender@test.de"
mailserver = "IP"
empfanger = "empfanger@test.de"
Set oArg = wscript.arguments
strServer = "Server-IP"
mail = "mail@test.de"
mail2 = "mail@test.de"
ifertig = "False"
i2fertig = "False"
if isOnline(strServer) Then
strNamespace = "root\cimv2"
strUser = "domäne\admin" 'domäne\admin
strPassword = "PW"
'--------------------------------------------Einstellungen Ende---------------------------------------------------
Const WbemAuthenticationLevelPktPrivacy = 6
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
Set objWMI = objwbemLocator.ConnectServer _
(strServer, strNamespace, strUser, strPassword)
objWMI.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
Set objInstances = objWMI.ExecQuery ("Select * from Win32_NTLogEvent WHERE Logfile = 'System' and EventType = 1")
Set objInstances2 = objWMI.ExecQuery ("Select * from Win32_NTLogEvent WHERE Logfile = 'Application' and EventType = 1")
dim f
Else
wscript.quit
End if
mail = "<h1>System :</h1><br><TABLE Border=1>" & chr(13)
mail = mail & "<Tr>" & chr(13)
mail = mail & "<TD>Computer</TD>"& chr(13)
mail = mail & "<TD>Ereigniskennung</TD>"& chr(13)
mail = mail & "<TD>Beschreibung</TD>"& chr(13)
mail = mail & "<TD>Quelle </TD>"& chr(13)
mail = mail & "<TD>Datum </TD>"& chr(13)
mail = mail & "</TR>"& chr(13)
mail2 = "<br><h1>Anwendung:</h1><br><TABLE border=1>" & chr(13)
mail2 = mail2 & "<Tr>" & chr(13)
mail2 = mail2 & "<TD>Computer</TD>"& chr(13)
mail2 = mail2 & "<TD>Ereigniskennung</TD>"& chr(13)
mail2 = mail2 & "<TD>Beschreibung</TD>"& chr(13)
mail2 = mail2 & "<TD>Quelle</TD>"& chr(13)
mail2 = mail2 & "<TD>Datum </TD>"& chr(13)
mail2 = mail2 & "</TR>"& chr(13)
dat = now() - zeitsp
i = 0
i2 = 0
For Each objInstance in objInstances
dat1 = objInstance.TimeGenerated
dat1 = dConvertWMItoVBSDate(dat1)
if i < maxwert and dat1 > dat Then
With objInstance
mail = mail & "<Tr>"& chr(13)
mail = mail & "<TD>" & .ComputerName & "</TD>"& chr(13)
mail = mail & "<TD>" & .EventCode & "</TD>"& chr(13)
mail = mail & "<TD>" & .Message & "</TD>"& chr(13)
mail = mail & "<TD>" & .SourceName & "</TD>"& chr(13)
mail = mail & "<TD>" & dConvertWMItoVBSDate(.TimeGenerated) & "</TD>"& chr(13)
mail = mail & "</TR>"& chr(13)
i = i +1
End With
On Error Goto 0
Elseif i > maxwert Then
ifertig="True"
exit for
Elseif dat1 < dat Then
ifertig="True"
exit for
end if
Next
For Each objInstance in objInstances2
dat1 = objInstance.TimeGenerated
dat1 = dConvertWMItoVBSDate(dat1)
if i2< maxwert2 and dat1 > dat Then
With objInstance
mail2 = mail2 & "<Tr>"& chr(13)
mail2 = mail2 & "<TD>" & .ComputerName & "</TD>"& chr(13)
mail2 = mail2 & "<TD>" & .EventCode & "</TD>"& chr(13)
mail2 = mail2 & "<TD>" & .Message & "</TD>"& chr(13)
mail2 = mail2 & "<TD>" & .SourceName & "</TD>"& chr(13)
mail2 = mail2 & "<TD>" & dConvertWMItoVBSDate(.TimeGenerated) & "</TD>"& chr(13)
mail2 = mail2 & "</TR>" & chr(13)
i2 = i2 +1
End With
On Error Goto 0
elseif i2 > maxwert2 Then
i2fertig = "True"
exit for
elseif dat1 < dat Then
ifertig="True"
exit for
End if
Next
mail = mail & "</Table>"& chr(13)
mail2 = mail2 & "</Table>"& chr(13)
Set objEmail = CreateObject("CDO.Message")
objEmail.From = absender
objEmail.To = empfanger
objEmail.Subject = "Ereignisanzeige von: " & strserver & " - System : " & i & " Anwendung: " & i2
objEmail.HTMLbody = "<HTML><Body>" & mail & "<br>" & mail2 & "</body></html>"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "MAILSERVER"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send
wscript.quit
'----------------Schleifenende !--------------------------------------------------
function IsOnline(host)
set WshShell = CreateObject("Wscript.Shell")
set temp = wshshell.Exec ("ping.exe -n 1 -w 100 "&host)
dummy = temp.StdOut.ReadAll
IF instr(1,dummy,"Antwort") >0 THEN
isonline = true
ELSE
isonline = false
END IF
end Function
Private Function dConvertWMItoVBSDate(sDate)
Dim sMonth, sDay, sYear, sHour, sMinutes, sSeconds
sMonth = Mid(sDate,5,2)
sDay = Mid(sDate,7,2)
sYear = Mid(sDate,1,4)
sHour = Mid(sDate,9,2)
sMinutes = Mid(sDate,11,2)
sSeconds = Mid(sDate,13,2)
dConvertWMItoVBSDate = DateSerial (sYear, sMonth, sDay) + TimeSerial (sHour, sMinutes, sSeconds)
End Function
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 152587
Url: https://administrator.de/forum/vbs-for-each-schleife-in-vorhandenen-code-einfuegen-152587.html
Ausgedruckt am: 24.12.2024 um 13:12 Uhr
18 Kommentare
Neuester Kommentar
Hallo Azubi452 und willkommen im Forum!
Rein schematisch (und völlig ungetestet) sollte sich das etwa so machen lassen:
Je nachdem, ob es für jeden Server unterschiedliche User / Passwörter geben soll, müsste jeweils ein weiteres Array dafür erstellt werden und die Schleife auf
geändert werden ...
Grüße
bastla
Rein schematisch (und völlig ungetestet) sollte sich das etwa so machen lassen:
'--------------------------------------------------Einstellungen-------------------------------------------------
'Gibt die Maximale Anzahl der zurückgelieferten Einträge an
'Werte für System Log
maxwert = 50
'Werte für Application Log
maxwert2 = 25
'gibt an wieviele Tage zurück gegangen werden soll
zeitsp = 7
'Email Settings
absender = "absender@test.de"
mailserver = "IP"
empfanger = "empfanger@test.de"
Const WbemAuthenticationLevelPktPrivacy = 6
Set objWbemLocator = CreateObject("WbemScripting.SWbemLocator")
strNamespace = "root\cimv2"
mail = "mail@test.de"
mail2 = "mail@test.de"
Set oArg = wscript.arguments
arrServer = Array("Server1-IP", "Server2-IP", "Server3-IP")
For Each strServer In arrServer
ifertig = "False"
i2fertig = "False"
If isOnline(strServer) Then
strUser = "domäne\admin" 'domäne\admin
strPassword = "PW"
'--------------------------------------------Einstellungen Ende---------------------------------------------------
Set objWMI = objwbemLocator.ConnectServer _
(strServer, strNamespace, strUser, strPassword)
objWMI.Security_.authenticationLevel = WbemAuthenticationLevelPktPrivacy
Set objInstances = objWMI.ExecQuery ("Select * from Win32_NTLogEvent WHERE Logfile = 'System' and EventType = 1")
Set objInstances2 = objWMI.ExecQuery ("Select * from Win32_NTLogEvent WHERE Logfile = 'Application' and EventType = 1")
dim f
mail = "<h1>System :</h1><br><TABLE Border=1>" & chr(13)
mail = mail & "<Tr>" & chr(13)
mail = mail & "<TD>Computer</TD>"& chr(13)
mail = mail & "<TD>Ereigniskennung</TD>"& chr(13)
mail = mail & "<TD>Beschreibung</TD>"& chr(13)
mail = mail & "<TD>Quelle </TD>"& chr(13)
mail = mail & "<TD>Datum </TD>"& chr(13)
mail = mail & "</TR>"& chr(13)
mail2 = "<br><h1>Anwendung:</h1><br><TABLE border=1>" & chr(13)
mail2 = mail2 & "<Tr>" & chr(13)
mail2 = mail2 & "<TD>Computer</TD>"& chr(13)
mail2 = mail2 & "<TD>Ereigniskennung</TD>"& chr(13)
mail2 = mail2 & "<TD>Beschreibung</TD>"& chr(13)
mail2 = mail2 & "<TD>Quelle</TD>"& chr(13)
mail2 = mail2 & "<TD>Datum </TD>"& chr(13)
mail2 = mail2 & "</TR>"& chr(13)
dat = now() - zeitsp
i = 0
i2 = 0
For Each objInstance in objInstances
dat1 = objInstance.TimeGenerated
dat1 = dConvertWMItoVBSDate(dat1)
if i < maxwert and dat1 > dat Then
With objInstance
mail = mail & "<Tr>"& chr(13)
mail = mail & "<TD>" & .ComputerName & "</TD>"& chr(13)
mail = mail & "<TD>" & .EventCode & "</TD>"& chr(13)
mail = mail & "<TD>" & .Message & "</TD>"& chr(13)
mail = mail & "<TD>" & .SourceName & "</TD>"& chr(13)
mail = mail & "<TD>" & dConvertWMItoVBSDate(.TimeGenerated) & "</TD>"& chr(13)
mail = mail & "</TR>"& chr(13)
i = i +1
End With
On Error Goto 0
Elseif i > maxwert Then
ifertig="True"
exit for
Elseif dat1 < dat Then
ifertig="True"
exit for
end if
Next
For Each objInstance in objInstances2
dat1 = objInstance.TimeGenerated
dat1 = dConvertWMItoVBSDate(dat1)
if i2< maxwert2 and dat1 > dat Then
With objInstance
mail2 = mail2 & "<Tr>"& chr(13)
mail2 = mail2 & "<TD>" & .ComputerName & "</TD>"& chr(13)
mail2 = mail2 & "<TD>" & .EventCode & "</TD>"& chr(13)
mail2 = mail2 & "<TD>" & .Message & "</TD>"& chr(13)
mail2 = mail2 & "<TD>" & .SourceName & "</TD>"& chr(13)
mail2 = mail2 & "<TD>" & dConvertWMItoVBSDate(.TimeGenerated) & "</TD>"& chr(13)
mail2 = mail2 & "</TR>" & chr(13)
i2 = i2 +1
End With
On Error Goto 0
elseif i2 > maxwert2 Then
i2fertig = "True"
exit for
elseif dat1 < dat Then
ifertig="True"
exit for
End if
Next
mail = mail & "</Table>"& chr(13)
mail2 = mail2 & "</Table>"& chr(13)
Set objEmail = CreateObject("CDO.Message")
objEmail.From = absender
objEmail.To = empfanger
objEmail.Subject = "Ereignisanzeige von: " & strserver & " - System : " & i & " Anwendung: " & i2
objEmail.HTMLbody = "<HTML><Body>" & mail & "<br>" & mail2 & "</body></html>"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "MAILSERVER"
objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
objEmail.Configuration.Fields.Update
objEmail.Send
End If
Next
'----------------Schleifenende !--------------------------------------------------
function IsOnline(host)
set WshShell = CreateObject("Wscript.Shell")
set temp = wshshell.Exec ("ping.exe -n 1 -w 100 "&host)
dummy = temp.StdOut.ReadAll
IF instr(1,dummy,"Antwort") >0 THEN
isonline = true
ELSE
isonline = false
END IF
end Function
Private Function dConvertWMItoVBSDate(sDate)
Dim sMonth, sDay, sYear, sHour, sMinutes, sSeconds
sMonth = Mid(sDate,5,2)
sDay = Mid(sDate,7,2)
sYear = Mid(sDate,1,4)
sHour = Mid(sDate,9,2)
sMinutes = Mid(sDate,11,2)
sSeconds = Mid(sDate,13,2)
dConvertWMItoVBSDate = DateSerial (sYear, sMonth, sDay) + TimeSerial (sHour, sMinutes, sSeconds)
End Function
For s = 0 To UBound(arrServer)
strServer = arrServer(s)
strUser = arrUser(s)
strPW = arrPW(s)
....
Next
Grüße
bastla
Hallo Azubi1452!
Dabei sei vielleicht noch anzumerken, dass:
sich noch die unnötigen Chr(13)-Funktionsaufrufe durch die eine einfache vbCr-Konstante ersetzen ließen
die Tags: "<HTML><Body>" und "</Body></Html>" genauso unnötig sind, weil der Text ja schon explizit in den objEmail.HtmlBody geschrieben wird. D.h. die Body-Tags sind mit dem ganzen sonstigem Html-Klumpatsch bereits vordefiniert
Gruß Dieter
Dabei sei vielleicht noch anzumerken, dass:
sich noch die unnötigen Chr(13)-Funktionsaufrufe durch die eine einfache vbCr-Konstante ersetzen ließen
die Tags: "<HTML><Body>" und "</Body></Html>" genauso unnötig sind, weil der Text ja schon explizit in den objEmail.HtmlBody geschrieben wird. D.h. die Body-Tags sind mit dem ganzen sonstigem Html-Klumpatsch bereits vordefiniert
Gruß Dieter
Hallo Azubi1452!
Mit VB-Script würde es in etwa so aussehen:
Gruß Dieter
Mit VB-Script würde es in etwa so aussehen:
<input type='button' value='Alle Aufklappen' onClick='ShowAll'>
Gruß Dieter
Hallo Azubi!
Mit Deinem Beispiel funktioniert es so nicht. Wenn ich ich aber den Toggle-Text mit Zeilenvorschub in die Html schreibe, dann funktioniert es:
Gruß Dieter
Mit Deinem Beispiel funktioniert es so nicht. Wenn ich ich aber den Toggle-Text mit Zeilenvorschub in die Html schreibe, dann funktioniert es:
toggle = "<a href='javascript: toggle()'>toggle</a>" & vbCrLf
toggle = toggle & "<div id='div1' style='display:none'>Don't display me</div>" & vbCrLf
toggle = toggle & "<script>" & vbCrLf
toggle = toggle & "function toggle(){" & vbCrLf
toggle = toggle & " var div1 = document.getElementById('div1')" & vbCrLf
toggle = toggle & " if (div1.style.display == 'none') {" & vbCrLf
toggle = toggle & " div1.style.display = 'block'" & vbCrLf
toggle = toggle & " } else {" & vbCrLf
toggle = toggle & " div1.style.display = 'none'" & vbCrLf
toggle = toggle & " }" & vbCrLf
toggle = toggle & "}" & vbCrLf
toggle = toggle & "</script>" & vbCrLf
Set fso = CreateObject("Scripting.FileSystemObject")
sZDatei = "E:\Threads\$Test\test.html"
Set oZDatei = fso.OpenTextFile(sZDatei, 2, True)
oZDatei.Write "<html><body>" & toggle &"</body></html>"
oZDatei.Close
Gruß Dieter
Hallo Azubi!
Yepp, gern geschehen
Gruß Dieter
Yepp, gern geschehen
Gruß Dieter