1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

mit Batch datei Programm überwachen

Discussion in 'Windows XP / Server 2003/2008 / Vista' started by haecker, Mar 5, 2010.

Thread Status:
Not open for further replies.
  1. haecker

    haecker Byte

    hi,

    ich habe mir ein patch datei programmiert will damit ein programm überwachen.

    1.es soll geprüft werden ob ein programm läuft oder nicht.
    2. wenn programm läuft nicht machen.
    3. wenn programm nicht läuft programm starten.

    wie unten beschrieben habe programmiert aber es prüft nicht nach ob läuft oder nicht sondern macht einfach programm auf.

    mfg

    @echo off
    :10
    start C:\Programme\TeamViewer\Version5\teamviewer

    echo %time%
    ping 127.0.0.1 -n 15>nul

    goto 10
     
  2. Hnas2

    Hnas2 Ganzes Gigabyte

    Dann benötigst du als erstes ja mal eine Abfrage, ob dein Programm aktiv ist. Allerdings kenne ich da kein Windows-Consolenprogramm.
     
  3. Urs2

    Urs2 Megabyte

    Hallo Haecker

    Ob das mit Batch auch geht, weiss ich nicht, mit VBScript geht es.
    Kopiere diesen Code in den Editor und speichere als "TeamViewerStarten.VBS"
    Code:
    Set WshShell = WScript.CreateObject("WScript.Shell")
    
    Set locator = CreateObject("WbemScripting.SWbemLocator")
    Set service = locator.ConnectServer()
    Set props = service.ExecQuery _
       ("select name, description from Win32_Process where name = 'TeamViewer.exe'")
    num = props.Count
    
    If num = 0 then WshShell.Run "C:\Programme\TeamViewer\Version5\TeamViewer.exe"
    
    Set WSHShell = Nothing
    
    Ich weiss nicht wie TeamViewer läuft, als Programm mit Fenster oder als Prozess im Hintergrund. Als Programm funktioniert dieser Code, als Prozess müsste man vielleicht einen anderen nehmen > Testen !


    Wenn der Script immer laufen und immer wieder testen soll, dann so >
    Code:
    pause = 60		'Pause in Sekunden, hier ändern...
    Do
    	Set WshShell = WScript.CreateObject("WScript.Shell")
    	Set locator = CreateObject("WbemScripting.SWbemLocator")
    	Set service = locator.ConnectServer()
    	Set props = service.ExecQuery _
    	("select name, description from Win32_Process where name = 'TeamViewer.exe'")
    	num = props.Count
    
    	If num = 0 then WshShell.Run "C:\Programme\TeamViewer\Version5\TeamViewer.exe"
    			'schläft 60 * 1000 Tausendstel Sekunden
    	WScript.Sleep(pause * 1000)
    Loop
    
    So kannst Du den Script aber nicht einfach anhalten, Du musst ihn im TaskManager erschlagen !
    Man könnte einen Zähler rein setzen, dass er zB nach 100 Durchgängen von alleine aufhört...

    Gruss Urs
     
    Last edited: Mar 6, 2010
  4. haecker

    haecker Byte

    hallo,

    als erste tausend mal danke, sie haben viel geholfen.

    was wöllen sie dafür haben ?

    wenn dass viel arbeit ist ich kann auch ihnen bezahlen.


    mfg
     
  5. haecker

    haecker Byte

    hy,

    genau so was habe ich gesucht und es funktioniert perfeckt vielen dank nochmal.

    bevor ich den skript einsetze habe ein frage es kann sein dass programm noch läuft allerdings ist abgesturzt kann mann den skript so programmieren dass der auch reaktion von programm testet ob reagiert oder nicht wenn nicht reagiert dann Programm ausmachen und neustarten.

    ist dass möglich ?


    mfg
     
  6. Urs2

    Urs2 Megabyte

    Hallo Haecker

    Ausländer.... oder feuchten Abend erlebt ?

    Es ist schwierig zu prüfen ob ein Programm abgestürzt ist >
    Das Programm selbst (also TeamViewer) kann es nicht wissen... es weiss gar nichts mehr, es ist ja abgestürzt...
    Man muss TeamViewer einen Befehl senden, den er beantworten muss. Wenn er nicht antwortet... ist er abgestürzt (im Prinzip).

    Dazu reichen meine Script-Kenntnisse nicht aus, wenn es mit VBS überhaupt gehen sollte. Eine Idee hätte ich schon...

    Beantworte zuerst diese Fragen >
    - Deinem Programmpfad nach zu schliessen, hast Du Windows XP. Richtig ?
    - TeamViewer hat ein geöffnetes Fenster, wenn er läuft. Richtig ?


    Dann würde es 2 kleine Programme von Microsoft brauchen (Downloads in den Windowsordner), eines um das Fenster zu testen, das andere um den abgestürzten TeamViewer abzuschiessen.
    Wie ich das selbst testen könnte, weiss ich noch nicht, normalerweise habe ich keine abgestürzten Programme auf dem PC...

    Gruss Urs
     
  7. haecker

    haecker Byte

    hallo Urs2,


    zu erste frage beide :)

    ja ich habe win XP.

    Es kann sein dass TeamViewer minimiert ist und hat keine geöffnete Fenster allerdings wenn es minimiert ist wird die nicht absturzen.
    Wenn es absturzt hat in der Regel immer geoffnete Fenster.


    grüss haecker
     
  8. Urs2

    Urs2 Megabyte

    Hallo Haecker

    Setze diesen Code in eine neue VBS-Datei >
    Code:
    pause = 60			'= Pause in Sekunden vor Neuaufruf... hier ändern
    				'Hilfs-Ordner- und Dateinamen 
    strDirectory = "c:\123456Delete" 
    strFile = strDirectory & "\123456.dmp"
    
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set WshShell = WScript.CreateObject("WScript.Shell")
    Set locator = CreateObject("WbemScripting.SWbemLocator")
    Set service = locator.ConnectServer()
    
    Do
    	Set props = service.ExecQuery _
    	("select name, description from Win32_Process where name = 'TeamViewer.exe'")
    				'wenn TeamViewer nicht gestartet > wird gestartet
    	If props.Count = 0 then 
    		WshShell.Run "C:\Programme\TeamViewer\Version5\TeamViewer.exe"
    	Else
    				'sonst wird geprüft ob das Fenster reagiert
    					'falls alter Hilfs-Ordner vorhanden > löschen
    		If objFSO.FolderExists(strDirectory) Then _
    			objFSO.DeleteFolder(strDirectory), True
    					'neuer leerer Hilfs-Ordner wird erstellt
    		Set objFolder = objFSO.CreateFolder(strDirectory)
    					'ProcDump prüft ob ein Fenster hängt...
    		WshShell.run "ProcDump -h TeamViewer.exe c:\123456Delete\123456.dmp"  
    					'ProcDump testet 5 Sekunden, also 10 Sekunden warten...
    		WScript.Sleep 10000
    					'wenn ProcDump DumpFile geschrieben hat, dann abgestürzt
    		If (objFolder.Files.Count = 0) Then
    						'schiesst TeamViewer ab
    			WshShell.Run "pskill -t TeamViewer.exe"
    						'entfernt Hilfs-Ordner
    			objFSO.DeleteFolder(strDirectory), True
    						'startet TeamViewer neu
    			WshShell.Run "C:\Programme\TeamViewer\Version5\TeamViewer.exe"
    		End If
    	End If
    				'schläft 60 * 1000 Tausendstel Sekunden
    	WScript.Sleep(pause * 1000)
    Loop
    
    WScript.Quit
    Bedingung >>> Diese Dateien herunterladen >
    >>> http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx
    Entpacken und die ProcDump.exe in den Ordner C:\Windows verschieben
    >>> http://technet.microsoft.com/en-us/sysinternals/bb896683.aspx
    Entpacken und daraus nur die die Datei PsKill.exe ind den Windows-Ordner, die anderen Dateien sind hier überflüssig.


    Funktion >
    - zuerst wird geprüft (wie vorher) ob TeamViewer läuft, wenn nicht wird, wird er gestartet > fertig
    - wenn er aber schon läuft, wird geprüft ob er hängt
    - ProcDump testet das Fenster, sofern es eines hat, auf Reaktion
    - wenn keine Reaktion während 5 Sekunden, schreibt er eine DumpFile
    - der Script schaut ob eine File dort ist, wenn ja
    - schiesst er den blockierten TeamViewer ab und startet ihn neu
    > normalerweise sollte der Hilfs-Ordner nie sichtbar sein, er wird sofort wieder entsorgt.


    Teste das gut.
    Ich habe getestet so gut ich konnte, aber einen Programmabsturz konnte ich nicht provozieren...

    Gruss Urs
     
  9. Urs2

    Urs2 Megabyte

    Korrektur 1 >

    Ohne abgestürztes Programm zeigte mir beim Testen der vorherige Code nicht, dass er verkehrt herum läuft...
    Hier ist der richtige Code, der theoretisch funktioniert >
    Code:
    pause = 60			'= Pause in Sekunden vor Neuaufruf... hier ändern
    				'Hilfs-Ordner- und Dateinamen 
    strDirectory = "c:\123456Delete" 
    strFile = strDirectory & "\123456.dmp"
    
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set WshShell = WScript.CreateObject("WScript.Shell")
    Set locator = CreateObject("WbemScripting.SWbemLocator")
    Set service = locator.ConnectServer()
    
    Do
    	Set props = service.ExecQuery _
    	("select name, description from Win32_Process where name = 'TeamViewer.exe'")
    				'wenn TeamViewer nicht gestartet > wird gestartet
    	If props.Count = 0 then 
    		WshShell.Run "C:\Programme\TeamViewer\Version5\TeamViewer.exe"
    	Else
    				'sonst wird geprüft ob das Fenster reagiert
    					'falls alter Hilfs-Ordner vorhanden > löschen
    		If objFSO.FolderExists(strDirectory) Then _
    			objFSO.DeleteFolder(strDirectory), True
    					'neuer leerer Hilfs-Ordner wird erstellt
    		Set objFolder = objFSO.CreateFolder(strDirectory)
    					'ProcDump prüft ob ein Fenster hängt...
    		WshShell.run "ProcDump -h TeamViewer.exe c:\123456Delete\123456.dmp"  
    					'ProcDump testet 5 Sekunden, also 10 Sekunden warten...
    		WScript.Sleep 10000
    					'wenn ProcDump DumpFile geschrieben hat, dann abgestürzt
    		If (objFolder.Files.Count <> 0) Then
    						'schiesst TeamViewer ab
    			WshShell.Run "pskill -t TeamViewer.exe"
    						'entfernt Hilfs-Ordner
    			objFSO.DeleteFolder(strDirectory), True
    						'startet TeamViewer neu
    			WshShell.Run "C:\Programme\TeamViewer\Version5\TeamViewer.exe"
    		End If
    						'entfernt ProcDump, falls hängengeblieben
    		WshShell.Run "pskill -t ProcDump.exe"
    						'entfernt Hilfs-Ordner
    		objFSO.DeleteFolder(strDirectory), True
    	End If
    				'schläft 60 * 1000 Tausendstel Sekunden
    	WScript.Sleep(pause * 1000)
    Loop
    
    WScript.Quit

    Korrektur 2 >

    Da bei mir die Programme von Sysinternals schon lange im Windows-Ordner sind, hatte ich die Eula übersehen.
    Kopiere auch die Datei "Eula.txt" aus dem Microsoft-Download in den Windows-Ordner.
    Bei der ersten Ausführung musst Du dann die Bedingung akzeptieren und OK clicken.

    Gruss Urs
     
  10. haecker

    haecker Byte

    hallo,

    danke für die hilfe.

    ich habe es getestet und bis jetzt funktioniert sehr gut.

    Ich werde jetzt den skrip einsetzten und abwarten wenn dass problemm weiter besteht dann werde ich hier posten.

    ansonsten nochmal tausend mal dankeschön

    mfg haecker
     
  11. Urs2

    Urs2 Megabyte

    Hallo Haecker

    Hoffen wir... so richtig konnte ich es ja nicht testen, etwas Glück schadet nie...

    Noch eine kleine Verbesserung >
    Wenn der Script läuft, geht das schwarze CMD-Fenster auf (gestartet von der ProcDump.exe) und wird nachher wieder geschlossen. Zum Testen musste ich dieses Fenster sehen können, um zu wissen was gerade passiert.
    Im Normalfall ist dieses Fenster nur lästig... und überflüssig.

    ...Ergänze im Code diese Zeile >
    WshShell.Run "ProcDump -h Calc.exe c:\123456\calc.dmp"
    ... mit einem Komma+Null... damit sie so aussieht >
    WshShell.Run "ProcDump -h Calc.exe c:\123456\calc.dmp",0

    ...jetzt wird das CMD-Fenster nicht mehr geöffnet !

    Gruss Urs
     
  12. Urs2

    Urs2 Megabyte

    Zum Glück hatte ich den Code nochmals angeschaut >>> noch eine Korrektur der Korrektur...
    Mangels TeamViewer hatte ich mit Calc.exe getestet... und die nachträgliche Aenderung des Hilfs-Ordners übersehen >>>

    ...in der letzten Code-Version im Beitrag #8 muss diese dortige Zeile >
    WshShell.run "ProcDump -h TeamViewer.exe c:\123456Delete\123456.dmp"

    ...geändert werden in diese Zeile >
    WshShell.run "ProcDump -h TeamViewer.exe c:\123456Delete\123456.dmp",0

    ...dann wird das CMD-Fenster nicht mehr geöffnet.


    Gruss Urs
     
  13. haecker

    haecker Byte

    hy,

    ich habe seit paar tagen den skript eingesetzt es läuft ganz gut.

    Sie haben recht den cmd fenster (schwarze Fenster ) war nervlich

    danke noch mal für die hilfe ich habe so gändert wie sie in lätzte beitrag geschrieben also am ende der satzt noch komme und null eingefügt.



    mfg
     
  14. Gandalf87

    Gandalf87 Byte

    Na also mit batch geht es so:


    Code:
    @echo off
    set use=0
    title Restarter (%use%)
    mode con cols=27 lines=3
    color 0c
    :fghh
    title Restarter (%use%)
    echo Schon %use% mal neugestartet!!!
    ping /n 2 localhost>nul
    tasklist | find /i "name der exe vom TeamViewer"
    if %errorlevel%==1 (
    start "pfad der exe von teamviewer"
    set /a use=%use%+1
    )
    cls
    goto fghh
    

    Glaube ich zumindest
    :baeh::heilig:
     
  15. Urs2

    Urs2 Megabyte

    Glauben tut man in der Kirche... eine Batch sollte man schon testen !

    Hast Du mitbekommen, dass der Script testen muss, ob sich der vorher gestartete TeamViewer etwa aufgehängt hat ?
    In diesem Fall ist er in der Taskliste nämlich noch vorhanden, reagiert aber nicht mehr...
    ...dann muss der halbtote TeamViewer zuerst gekillt und nachher neu gestartet werden.

    Gruss Urs
     
  16. Gandalf87

    Gandalf87 Byte

    Bin ich Gates???
    Ich weiss nicht ob man das mit Batch machen kann.
    Wenn es eine Lösung gibt bin ich interessiert.
    :)
     
  17. Urs2

    Urs2 Megabyte

    Gates hatte dazu nichts gesagt, DU hattest die Batch wieder ins Spiel gebracht...
    Hast Du jetzt einen Monat lang auf meinen paar Zeilen herumgekaut ?

    Laut haecker funktioniert mein Script doch, er hat sich jedenfalls nicht mehr gemeldet.

    Gruss Urs
     
  18. XP-Fan

    XP-Fan Halbes Megabyte

    Merkt ihr nicht das wieder Sven-Uwe unterwegs ist ? :rolleyes: ..... :saufen:
     
  19. Hascheff

    Hascheff Moderator

    Hallo Urs,
    es hätte mich gereizt, dazu zu schreiben, dann habe ich das Datum gesehen.

    Vorsicht! :bömo:

    ... und Leichen begraben. Hier werden sie wiederbelebt :rolleyes:
    Du hättest den Leichenfledderer melden sollen!
     
Thread Status:
Not open for further replies.

Share This Page