Thomas Wölfers Baustatik-Blog

Thomas Wölfers Baustatik Blog

Windows Explorer durch ein anderes Programm ersetzen


Ich musste heute für einen bestimmten Account die normale Windows Shell (Explorer.exe) durch ein anderes Programm ersetzen. Das Verhalten sollte dabei derart sein, das beim beenden dieses anderen Programmes der Account direkt abgemeldet wird.

Zunächst braucht man dazu ein kleines Programm, das die "eigentliche" Shell startet, darauf wartet das der Shell-Prozess beendet wird, und dann den Abmeldevorgang einleitet. Sowas kann man zum Beipiel als Skript anlegen:

REM Starten
StartProcessAndWait "ZuStartendesProgramm.exe"

REM Abmelden
Set oOS = GetObject("winmgmts:{(Shutdown)}").ExecQuery("Select * from Win32_OperatingSystem")
For Each oOperatingSystem in oOS
   oOperatingSystem.Win32Shutdown(4)
Next

Function StartProcessAndWait( processName)
   Set objWMIService = GetObject("winmgmts:\\.\root\cimv2:Win32_Process")
   errResult = objWMIService.Create("C:\temp\" & processName, "C:\temp\", null, intPosID)
   Set objWait = GetObject("winmgmts:\\.\root\cimv2")
   Set colProcesses = objWait.ExecNotificationQuery("Select * From __InstanceDeletionEvent " & "Within 1 Where TargetInstance ISA 'Win32_Process'")
   mustWait = true
   Do while mustWait
      Set objProcess = colProcesses.NextEvent
      If objProcess.TargetInstance.ProcessID = intPosID Then
          mustWait = false
      End If
   Loop
   StartProcessAndWait = true
End Function

Jetzt braucht man nur noch einen Eintrag in der Registry, der sich darum kümmert, das dieses Skript (nennen wir es "shell.vbs") startet. Der findet sich unter

HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Winlogon

Der Key hat den Namen "Shell" und als Wert (für dieses Beispiel) "cscript c:\temp\shell.vbs"