vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
vb@rchiv Offline-Reader - exklusiv auf der vb@rchiv CD Vol.4  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB Skript (VBS)
Programmausführung loggen 
Autor: Knutsen
Datum: 13.06.07 07:05

Hab mich mal an ein VBS gesetzt, was den Zweck erfüllen soll, den Start und die Beendigung von Prozessen zu überwachen und eine Meldung bei Starten oder Beenden von Prozessen im Ereignislog abzusetzen.

Was funktioniert: Die Überwachung des Starts von Prozessen verläuft zuverlässig.
Was nicht funktioniert: Beim Beenden von Prozessen wird die Meldung nicht immer gespeichert... offenbar ein Bug. Es wird erst beim Starten eines Prozesses nach dem Speichern der Meldung, daß ein Prozess gestartet wurde, die Meldung des zuletzt beendeten Prozesses gespeichert. Wurden davor noch weitere beendet, fallen diese Meldungen unter den Tisch. Hat jemand Muße, sich den Code anzuschauen und mir einen Tipp zu geben, woran das liegen könnte?

PS: Das Script braucht eine whitelist.txt im gleichen Verzeichnis. Je Zeile ein Prozess, der nicht überwacht werden soll, also z.B. "svchost.exe" in einer Zeile, in der nächsten dann "taskmgr.exe" usw.

PPS: Die CPU-Auslastung ist momentan etwas hoch, weil das Script einmal alle 100ms durchläuft. An sich kann das Script aber auch einmal alle 5s laufen - oder sogar noch weniger. Dafür dann einfach den Wert im sleep-Aufruf am Ende des Scripts erhöhen.

Dim File, strComputer, eRet, processtxt, runallways, run, entry, Output
 
strComputer = "."
Set objWMIService = GetObject("winmgmts:" & _
  "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set ofso = createobject("Scripting.FileSystemObject")
 
' Whitelist: Prozesse, die nicht überwacht werden sollen
File = ".\whitelist.txt"
run = 0
runallways = 1
 
' ProcessArrays zur Berechnung des Deltas zwischen zwei Messungen
Dim ProcessArray()
Redim ProcessArray(0)
Dim TempArray()
Redim TempArray(0)
 
' Zur Speicherung der Meldungen im Ereignislog
Set objShell = Wscript.CreateObject("Wscript.Shell")
 
If ofso.fileexists(File) Then
 
	' Whitelist-Einträge einladen	
	Set processtxt = ofso.OpenTextFile(File, 1)
	RA =  processtxt.ReadAll
	GetLine = processtxt.Line   
	processtxt.Close
	counter = 0
 
	sqlAdd = " WHERE Name != " & """" & "Check" & """" 
	Set processtxt = ofso.OpenTextFile(File, 1)
	Do Until counter = GetLine
		sqlAdd	= sqlAdd & " AND Name != " & """" & processtxt.ReadLine & """"
		counter = counter + 1
	Loop	
	sql = "Select * from Win32_Process " & sqlAdd	
 
	' Beginne mit der Prozessüberwachung (Endlosschleife! Überwachung beenden mit 
' Killen von wscript.exe im Task-Manager.)
	Do Until run = 1
 
		' Prozesse lesen
		Set colProcessList = objWMIService.ExecQuery(sql)
 
		procCount = 0
		' Alle laufenden Prozesse durchgehen
		For Each objProcess In colProcessList
			' Nachschauen, ob der Prozess neu gestartet wurde
			processAlreadyRunning = False
			For Each entry In ProcessArray
				If objProcess.Name = entry Then
					processAlreadyRunning = True
				End If
			Next
			If processAlreadyRunning = False Then
				objShell.LogEvent 0, objProcess.Name & " was started..."
			End If
 
			' Bei zu kleinem Array, erweitern...
			procCount = procCount + 1
			If Ubound(TempArray) < procCount Then Redim Preserve TempArray(procCount)
  			TempArray(procCount) = objProcess.Name
		Next
 
		' Nachschauen, ob Prozesse seit dem letzten Durchlauf beendet wurden
		For Each entry In ProcessArray
			processStillRunning = False
			' Nachschauen, ob der alte Prozess noch läuft
			For Each oldEntry In TempArray
				If oldEntry = entry Then processStillRunning = True
			Next
			If processStillRunning = False Then
				objShell.LogEvent 0, entry & " has been ended..."
			End If
		Next
 
		' Neues Prozessarray wird zum alten
		ReDim ProcessArray( Ubound(TempArray) )
		For i = 1 To UBound(TempArray)
			ProcessArray(i) = TempArray(i)
		Next
 
		' Warte einige (Milli)sekunden bis zum neuen Durchlauf (je nach 
' Prozessorstärke und Wunsch anpassen)
		WScript.sleep 100
 
		If runallways = 0 Then
			run = run + 1
		End If
 
	Loop
 
Else
	wscript.echo "whitelist.txt nicht gefunden"
End If
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Programmausführung loggen2.698Knutsen13.06.07 07:05

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel