Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

VBS: Check of Internet Explorer nog draait

Pagina: 1
Acties:
  • 143 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hi Guys,

Zit met een volgende probleem. Voor een klant moet ik iets maken dat wanneer Internet Explorer wordt gesloten de client automatisch uitlogt. Ik heb nu een script gemaakt met VB die het IEXPLORE.EXE process checkt, is deze niet meer running dan wordt de client uitgelogd. Hierbij wat code;

VBScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
Option Explicit

'roep de functie aan die checkt of IE gestart is (kijkt naar het proces) Dit proces looped totdat IE daadwerkelijk gestart is en 
'gaat vervolgens pas verder.
Do 
    CheckProc
Loop Until CheckProc = "1"


'Roept de 2e functie aan die kijkt of het IE proces nog draait, zodra dit niet meer het geval is (IE is afgesloten) dan wordt er
'een andere waarde ingesteld
Do
    CheckProc2
Loop Until CheckProc2 = "2"

'waarde 2 (Betekend dat IE is afgesloten) zorgt ervoor dat onderstaande statement uitgevoerd wordt. Deze statement logt de 
'gebruiker uit.

If CheckProc2 = "2" Then
    Dim objWSH  
    Set objWSH = CreateObject("WScript.Shell")
    objWSH.Run("logoff")
End If


'Onderstaande functies zijn hetzelfde alleen geven een andere waarde terug. De eerste kijkt of IE start de 2e of IE stopt.
Function CheckProc()

Dim objWMIService, objProcess, colProcess
Dim strComputer, strList

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _ 
& strComputer & "\root\cimv2") 

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process")


For Each objProcess In colProcess
strList = objProcess.Name

If strList = "iexplore.exe" Or strList = "IEXPLORE.EXE" Then
    CheckProc = "1"
End If

Next

End Function

'Deze functie geeft een waarde terug die zorgt dat het logoff proces getriggerd wordt.
Function CheckProc2()

Dim objWMIService, objProcess, colProcess
Dim strComputer, strList

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" _ 
& strComputer & "\root\cimv2") 

Set colProcess = objWMIService.ExecQuery _
("Select * from Win32_Process")


For Each objProcess In colProcess
strList = objProcess.Name

If Not strList = "iexplore.exe" Or strList = "IEXPLORE.EXE" Then
   CheckProc2 = "2"
End If


Next

End Function


Probleem is dat dit in principe wel werkt alleen de computer logt te pas en te onpas zomaar uit terwijl IE nog draait... |:(
Iemand enig idee waar de fout zit of misschien een beter alternatief?

Bedankt alvast!

[ Voor 0% gewijzigd door RobIII op 02-11-2007 11:38 . Reden: Code tags toegevoegd ]


  • remco_k
  • Registratie: April 2002
  • Laatst online: 15:27

remco_k

een cassettebandje was genoeg

Zet je code even tussen code tags, leest veel beter.

Verder ben ik geen VBS kei, maar moet je in de functies CheckProc en CheckProc2 niet even de return waarde initialiseren?
VBScript:
1
2
3
Function CheckProc2()
CheckProc2 = "0"
...

Nu word CheckProc2 op 2 gezet, alleen als de explorer er niet is.

Verder moet je eens naar deze regel in CheckProc2 kijken:
VBScript:
1
If Not strList = "iexplore.exe" Or strList = "IEXPLORE.EXE" Then

Edit:
Als je dit gefixed hebt, kijk dan even naar lowercase functies zodat je maar 1 match hoeft te maken met "iexplore.exe". Want wat gebeurd er als hij ineens IExplore.exe heet? (wat theoretisch nooit voor zou komen, het maakt je code wel veel duidelijker en het probleem wat je nu hebt, had je dan waarschijnlijk niet gehad).

Edit:
En, los van je probleem: Geef functies altijd een duidelijke naam zodat een ander ook nog snapt wat ze ongeveer doen. (zonder het commentaar ervan te hoeven lezen).
CheckProc en CheckProc2 zijn daar niet echt duidelijk in.

Nog een Edit:
Verder denk ik dat je aan 1 "check" functie genoeg hebt: IsIExplorerRunning.
Laat die True of False terug geven en je hebt genoeg toch? Daarmee kan je je code lengte halveren en is het nog duidelijker ook.

[ Voor 89% gewijzigd door remco_k op 02-11-2007 11:48 ]

Alles kan stuk.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ik neem aan dat 't dan een soort "terminal" is waar alleen IE op gedraaid mag worden? In dat geval is het veel makkelijker om IE als "custom shell" in te stellen.

Ik heb er overigens ooit een stukkie software voor gemaakt; hiermee kun je een taak starten (in jouw geval dan dus IE) en ervoor zorgen dat 'ie daarna aflogt (of reboot, etc) als de custom shell wordt gesloten. Effe dubbelklikken op de .exe om de parameters te bekijken. In jouw geval zou je custom shell instelling iets worden als:
code:
1
delayshl /t=3 /c=iexplore.exe /s=l


Als je code post, gebruik dan code tags ;)

[ Voor 74% gewijzigd door RobIII op 02-11-2007 11:49 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Hi,

Code tags toegepast, sorry daarvoor.
remco_k schreef op vrijdag 02 november 2007 @ 11:33:

Verder ben ik geen VBS kei, maar moet je in de functies CheckProc en CheckProc2 niet even de return waarde initialiseren?
VBScript:
1
2
3
Function CheckProc2()
CheckProc2 = "0"
...

Nu word CheckProc2 op 2 gezet, alleen als de explorer er niet is.
Heb dit geprobeert alleen dan gebeurt er helemaal niets meer 8)7
RobIII schreef op vrijdag 02 november 2007 @ 11:37:
Ik neem aan dat 't dan een soort "terminal" is waar alleen IE op gedraaid mag worden? In dat geval is het veel makkelijker om IE als "custom shell" in te stellen.

Als je code post, gebruik dan code tags ;)
Ga ik eens doorlezen en kijken of het een mogelijkheid is, bedankt!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 15:27

remco_k

een cassettebandje was genoeg

Lees mijn edits nog effe... Je hebt nog genoeg te doen. :)

Alles kan stuk.


Verwijderd

Topicstarter
remco_k schreef op vrijdag 02 november 2007 @ 11:33:
Nog een Edit:
Verder denk ik dat je aan 1 "check" functie genoeg hebt: IsIExplorerRunning.
Laat die True of False terug geven en je hebt genoeg toch? Daarmee kan je je code lengte halveren en is het nog duidelijker ook.
Ik heb die functie inderdaad ook gevonden op internet maar kwam er niet goed verder mee, enig idee hoe ik die goed zou kunnen plaatsen?

Verwijderd

Topicstarter
Ik heb hem! :*) Met een stuk minder code en werk als een zonnetje, hierbij de code voor mensen die wellicht hetzelfde nodig hebben;

VBScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
'Variabele declareren
Dim result
result = "0"

'Als IE gestart wordt verandert de variabele
Do Until result = "1" 

    If IsExecuting("IEXPLORE.EXE") Then
        result = "1"    
    End If
    
Loop

'Variabele wordt terug op nul gezet
result = "0"

'Volgende loop gaat net zo lang door totdat IE stopt en sluit daarna de client af
Do Until result = "2" 

    If Not IsExecuting("IEXPLORE.EXE") Then
        result = "2"
            Dim objWSH  
            Set objWSH = CreateObject("WScript.Shell")
            objWSH.Run("logoff")
    End If
Loop


'functie voor het checken van het IE process
Function IsExecuting(sProc) 
Set list = GetObject("winmgmts:").execquery(_ 
"select * from win32_process where name='" & sProc & "'") 
If list.count > 0 Then IsExecuting = True 
End Function 


Bedankt Fellas voor jullie posts! Tot kijk!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Visual Basic:
1
2
3
4
5
6
7
8
9
Do Until result = "2" 

    If Not IsExecuting("IEXPLORE.EXE") Then
        result = "2"
            Dim objWSH    
            Set objWSH = CreateObject("WScript.Shell")
            objWSH.Run("logoff")
    End If
Loop 

:X Enig idee wat dat met je CPU load doet? En hoe vaak je dan een WScript.Shell instantieert? :X
.
Visual Basic:
1
2
3
4
5
6
'functie voor het checken van het IE process
Function IsExecuting(sProc) 
Set list = GetObject("winmgmts:").execquery(_ 
"select * from win32_process where name='" & sProc & "'") 
If list.count > 0 Then IsExecuting = True 
End Function

:X Dus je geeft True of NIKS terug? :X Ok, VBS's non-type-safe meuk geeft dan toevallig wel een 'variant' ofzo terug die evalueert naar false, maar ik zou er toch voor kiezen om zoiets te doen dan:
.
Visual Basic:
1
2
3
4
5
'functie voor het checken van het IE process
Function IsExecuting(sProc) 
  Set list = GetObject("winmgmts:").execquery("select * from win32_process where name='" & sProc & "'") 
  IsExecuting = List.Count>0
End Function

Dat geeft in ieder geval altijd True of False terug.

Niet dat je code geen major WTF is, maar als je het dan toch zo wil doen, dan is die result variabele sowieso overbodig:
.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Do Until  IsExecuting("IEXPLORE.EXE") Then
'Doe niks
Loop

Do Until Not IsExecuting("IEXPLORE.EXE")
'Doe niks
Loop

Dim objWSH    
Set objWSH = CreateObject("WScript.Shell")
objWSH.Run("logoff")


'functie voor het checken van het IE process
Function IsExecuting(sProc) 
  Set list = GetObject("winmgmts:").execquery("select * from win32_process where name='" & sProc & "'") 
  IsExecuting = List.Count>0
End Function

Maar again; dit is echt major-ranzig-WTF :X

Ik zou als ik jou was eens even kijken naar mijn vorige post ;)

[ Voor 84% gewijzigd door RobIII op 02-11-2007 13:06 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Je zou eventueel een BHO kunnen gebruiken, deze kan je weliswaar niet in VBS schrijven, maar is denk ik wel efficienter.

  • Brahiewahiewa
  • Registratie: Oktober 2001
  • Laatst online: 30-09-2022

Brahiewahiewa

boelkloedig

Welnee, je wacht gewoon op een event; vrij naar http://www.microsoft.com/.../qanda/jul05/hey0701.mspx
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
strComputer = "."
Set objWMIService = GetObject ( "winmgmts:\\" & strComputer & "\root\cimv2" )
Set colProcesses = objWMIService.ExecNotificationQuery ( "Select * From __InstanceDeletionEvent Within 1 Where TargetInstance ISA 'Win32_Process'" )

Do Until i = 1

    Set objProcess = colProcesses.NextEvent
    If UCASE ( objProcess.TargetInstance.Name ) = "IEXPLORE.EXE" Then Exit Do

Loop

Const LOGOFF = 0
Const SHUTDOWN = 1
Const REBOOT = 2
Const FORCE = 4
Const POWEROFF = 8

For Each objPC In GetObject ( "winmgmts:{(shutdown)}" ).ExecQuery ( "Select * from Win32_OperatingSystem" )

    objPC.Win32Shutdown SHUTDOWN + FORCE

Next
Dit script loopt, zonder dat je processor gaten in je tapijt brandt

QnJhaGlld2FoaWV3YQ==

Pagina: 1