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:
erscheint in der Ausgabe bei jedem Ausführen einer verknüpften Datei "D:\Ein Leerzeichen.erw" folgendes:
anstatt wie es richtig wäre:
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
install_(RunAsAdmin).bat
(bzw. bei 64-Bit mit folgendem Schlüssel anzupassen:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options])
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 %*
%1 %2 %3 %* "C:\Windows\NewProg\NewProg32.exe" D:\Zwei Leerzeichen.erw
"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])
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 313365
Url: https://administrator.de/contentid/313365
Ausgedruckt am: 24.11.2024 um 12:11 Uhr