joe2017
Goto Top

IE Prozess wird nicht direkt beendet

Schönen Guten Morgen,

ich habe ein kleines Powershell Script mit einem WAIT. Bei Verwendung der iexplore.exe dauert es sehr lange bis das Script weiter abgearbeitet wird.
Wenn ich Beispielsweise die notepad.exe verwende, wird das Script direkt abgearbeitet.

Hier ein Beispiel:
Schnell
Start-Process notepad.exe
Get-Process notepad | Foreach-Object { $_.WaitForExit() }
Start-Process explorer.exe

Langsam
C:\Progra~1\Intern~1\iexplore.exe -k http://administrator.de
Get-Process iexplore | Foreach-Object { $_.WaitForExit() }
Start-Process explorer.exe

Im Taskmanager wird der IE nicht direkt beendet. Es dauert eine Weile bis dieser verschwindet.
Kann man das beschleunigen? Evtl. mit einer GPO?

Content-ID: 665189

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

Ausgedruckt am: 21.11.2024 um 17:11 Uhr

joe2017
joe2017 27.03.2021 um 07:20:24 Uhr
Goto Top
Ich hab evtl eine Idee.

Wenn ich "Get-Process iexplore" eingebe sehe ich immer mehr als einen iexlore Prozess.
Könnte man das nicht in einer Schleife abfragen und "Stop-Process -name iexplore" ausführen wenn es nur noch ein Prozess ist?
joe2017
joe2017 27.03.2021 um 07:38:46 Uhr
Goto Top
Also ich habe das wie folgt gelöst...

C:\Progra~1\Intern~1\iexplore.exe -k http://administrator.de
sleep 2
$varProcess=(Get-Process iexplore).count
while ($varProcess -gt 1){
   $varProcess=(Get-Process iexplore).count
}
Stop-Process -name iexplore
Start-Process explorer.exe
147669
147669 27.03.2021 aktualisiert um 10:32:31 Uhr
Goto Top
Ja nee das ist ehrlich gesagt mit der heißen Nadel gestrickt, das Process-Object hat ein "Exited" Event, das reagiert beim IE zuverlässiger als asynchrone EventProzedur
$ps = start iexplore.exe -Passthru
Register-ObjectEvent $ps Exited -SourceIdentifier IEExited -Action {
    write-host "IE has closed." -F Green  
    start explorer
    Unregister-Event IEExited
} | out-null

Gruß SK
joe2017
joe2017 27.03.2021 um 13:00:07 Uhr
Goto Top
Hi SK,

leider trägt deine Version nicht zu dem gewünschten Ergebnis bei.
In deinem Script wird auch wieder gewartet bis der IE komplett beendet wurde. Was bedeutet, dass ich wieder warten muss bis jeder IE Prozess beendet wird. Der IE öffnet leider zwei Prozesse und somit bin ich wieder am Anfang.


In meiner Version prüfe ich wie oft der IE geöffnet wurde und sobald die erste Version beendet wird, beende ich die restlichen IE Prozesse.
147669
147669 27.03.2021 aktualisiert um 13:29:43 Uhr
Goto Top
Zitat von @joe2017:
leider trägt deine Version nicht zu dem gewünschten Ergebnis bei.
In deinem Script wird auch wieder gewartet bis der IE komplett beendet wurde. Was bedeutet, dass ich wieder warten muss bis jeder IE Prozess beendet wird. Der IE öffnet leider zwei Prozesse und somit bin ich wieder am Anfang.
Klappt hier einwandfrei und verzögerungsfrei (Windows 10 Pro 20H2).
Bedenke das das Event "Asynchron" ausgeführt wird, du also am Ende mit while warten musst wenn du das script so lange offen halten willst.

In meiner Version prüfe ich wie oft der IE geöffnet wurde und sobald die erste Version beendet wird, beende ich die restlichen IE Prozesse.
Und schießt damit auch anderen evt. noch offene "erwünschte" Instanzen des Users ab face-wink, aber wenn das nicht weh tut ... der IE tut ja so eh schon weh face-smile.
joe2017
joe2017 27.03.2021 um 13:31:55 Uhr
Goto Top
Deine Version hat bei mir leider nicht funktioniert.

Ich habe meine vorherige Version noch einmal aktuallisert.
Das Script prüft den COMPUTERNAME da ich das nur auf einem speziellen Server ausführe und mehrere Server das selbe Logon Script verwenden. Anschließend wird der CLIENTNAME geprüft welcher sich mittels RDP anmeldet hat. Hier grenze ich diverse Clients ein.

Ich habe auch bemerkt, dass alle IE Prozesse beendet werden. Daher habe ich das noch mal angepasst.

if ($env:COMPUTERNAME -match "SERVER") {  
  if ($env:CLIENTNAME -match "RDP-CLIENT") {  
    C:\Progra~1\Intern~1\iexplore.exe -k https://administrator.de
    sleep 2
    $varProcess=(Get-Process -Name iexplore | ? {$_.SI -eq (Get-Process -PID $PID).SessionId}).count
    while ($varProcess -gt 1){
    $varProcess=(Get-Process -Name iexplore | ? {$_.SI -eq (Get-Process -PID $PID).SessionId}).count
    }
  Get-Process -Name iexplore | ? {$_.SI -eq (Get-Process -PID $PID).SessionId} | kill
  logoff
  }
}
else {
  exit
}

Ich verwende den IE übrigens nur, weil wir intern entwickelte Silverlight Applikationen ausführen. Sonst würde ich den IE natürlich auch nicht verwenden! face-wink