evinben
Goto Top

Default-Programm mit einem neuen Programm über Image File Execution Options ersetzen, Argumente korrekt übergeben

Es geht primär darum ein Programm über die "Image File Execution Options" (Debugger-Option über Registry) auszuführen.
Dies stellt sich als problematisch, wenn in der Befehlszeile des Werts Debugger bloß der Pfad zu einem neuen Programm eingetragen wird, in etwa "%ProgramFiles%\NewProg\NewProg32.exe":
Wenn eine assoziierende Datei (mit einem Dateityp, das im System zur Standard-Anwendung verknüpft ist) aufgerufen wird, wird ihr Pfad leider nicht in Anführungszeichen umrahmt an die neuen Anwendung übergeben, was bei Pfade mit Leerzeichen natürlich so zum Problem führt (dass das eigentlich "eine" Argument in Einzelteilen in mehreren Argumente zerpflückt wird).
Das neuverknüpfte Programm startet zwar, kann allerdings so die aufgerufene Datei natürlich nicht finden.
Zum Verdeutlichen dieses gewollten oder ungewollten Bugs (für mich bleibt es erstmals ein Bug oder Unfug), gebe ich erstmals ein verkürztes Code-Beispiel:
Wenn in der Befehlszeile von "Image File Execution Options" folgender Befehl eingetragen wird:
cmd /k echo %1 %2 %3 %*
erscheint in der Ausgabe bei jedem Ausführen einer verknüpften Datei "D:\Ein Leerzeichen.erw" folgendes:
%1 %2 %3 %* "C:\Windows\NewProg\NewProg32.exe" D:\Zwei  Leerzeichen.erw  
anstatt wie es richtig wäre:
"C:\Windows\NewProg\NewProg32.exe" "D:\Zwei  Leerzeichen.erw"  

Kennt sich jemand bereits mit diesem "Bug-Feature" aus?

Mit einem VBS-Zwischenskript, habe ich zumindest geschafft so eine Umleitung zu einem neuen Programm zum Laufen zu bringen und die zu der Standard-Anwendung verknüpften Dateien auch bei Pfade "mit mehr als nur ein Leerzeichen nacheinander" zu öffnen. Allerdings bleibt noch das Problem zur Hälfte bestehen, dass die restlichen übergebenen Argumente nicht durchkommen bzw. vom VBS-Skript abgefangen werden (welche noch bei der Übergabe an eine assoziierende Datei, in Anführungszeichen gesetzt werden).

(Außer "Image File Execution Options" möchte ich hier ungern Symbolische Links, Junctions oder Default-EXE-Dateien direkt zu überschreiben, in diesem Kapitel behandeln, zumindest nicht am Anfang, da all dies ja eine völlig andere Methode ist, um nicht alles hier durchzumischen. Andererseits legt ihr los und traut euch natürlich zu, wenn es mal doch wichtig wäre dies und jenes dazu zu äußern).

Run_with_IFEO.vbs
Option Explicit
Dim sCmd
Dim ProgPath
Dim objSWbemServices
Dim colProcess
Dim objProcess
Dim strLine

ProgPath = """" & LeftB(WScript.ScriptFullName, LenB(WScript.ScriptFullName) - LenB(WScript.ScriptName)) & "NewProg32.exe" & """ "  

set objSWbemServices = GetObject("WinMgmts:Root\Cimv2")   
set colProcess = objSWbemServices.ExecQuery("Select * From Win32_Process")   
For Each objProcess In colProcess 
	If InStr (objProcess.CommandLine, WScript.ScriptName) <> 0 Then
			strLine = Mid(objProcess.CommandLine, InStr(objProcess.CommandLine , WScript.ScriptName) + Len(WScript.ScriptName) + 1)
	End If 
Next

strLine = "" & strLine & ""  
msgbox strLine

'sCmd = ProgPath & strLine  
'msgbox sCmd  

'CreateObject("WScript.Shell").Run sCmd, 1, True  
WScript.Quit

install_(RunAsAdmin).bat
set InstallDirectoryNewProg=%ProgramFiles%\NewProg
set ReplaceDefaultProg=Default32.exe

set Script=Run_with_IFEO.vbs
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\%ReplaceDefaultProg%" /v "Debugger" /t REG_SZ /d "wscript \"%InstallDirectoryNewProg%\%Script%\"" /f  
PushD %~dp0
copy ".\%Script%" "%InstallDirectoryNewProg%"  
pause >nul

(bzw. bei 64-Bit mit folgendem Schlüssel anzupassen:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options])

Content-Key: 313365

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

Printed on: April 19, 2024 at 20:04 o'clock