ShellExecute: Das Verb "runas" funktioniert nicht für Batch-Dateien mit Leerzeichen im Pfad
Ich verwende ShellExecuteW, um eine Batch-Datei zu starten. Code sieht ungefähr so aus:
ShellExecuteW(GetDesktopWindow(), wide_verb.c_str(), wide_filename.c_str(), wide_parameters.c_str(), NULL, SW_SHOW);
Bei dem diewide_
Variablen sind vom Typwstring
. Dieser Code funktioniert gut für beliebige Kombinationen von Dateipfad und Verb, außer für das Verb "runas" (um Administratorrechte zu erhalten) und eine Batch-Datei mit Leerzeichen im angegebenen Pfadwide_filename
. Die UAC-Eingabeaufforderung wird eingeblendet und nach einer kurzen Bestätigung blinkt die Eingabeaufforderung mit der Meldung, dass der Pfad nicht gefunden wurde, und schneidet das erste Leerzeichen im Pfad ab.
Ich habe bereits versucht, den Dateinamen in zusätzliche Anführungszeichen zu setzen, aber das hat nicht geholfen.
Der Grund ist wahrscheinlich, dass .bat-Dateien nicht wirklich "ausführbare Dateien" sind, sondern Dokumente und daher
ShellExecuteW(GetDesktopWindow(), L"runas", L"C:\\Path To\\file.bat", L"Parameters For Batch", NULL, SW_SHOW);
ist intern einer erhöhten Ausführung von @ zugeordn
cmd.exe /C "C:\Path To\file.bat" "Parameters for Batch"
Weile sollte es etwas in der Art von @ se
cmd.exe /S /C " "C:\Path To\file.bat" Parameters for Batch "
Und tatsächlich, wenn ich so etwas ausführe:
ShellExecuteW(GetDesktopWindow(), L"runas", L"cmd.exe", L"/S /C \" \"C:\\Path To\\file.bat\" Parameters For Batch \"", NULL, SW_SHOW);
es macht den Trick!
Es scheint jedoch nicht der sauberste Weg zu sein, die ausführbare Datei (in diesem Fall cmd.exe) so hart zu codieren. Für Batch-Dateien ist das eigentlich egal, aber für andere Dokumente vom Typ Skript, die Parameter enthalten, kann es relevant werden.
So lautet die Frage: Ist es möglich, eine Batch-Datei (mit Leerzeichen im Pfad) auszuführen, die über ShellExecute oder einen ähnlichen Mechanismus erhöht wurde, ohne sie explizit an cmd.exe zu übergeben?