ShellExecute:动词“runas”不适用于路径

时间:2015-07-06 13:46:12

标签: c++ windows batch-file shellexecute

我正在使用ShellExecuteW来启动批处理文件。代码看起来有点像这样:

ShellExecuteW(GetDesktopWindow(), wide_verb.c_str(), wide_filename.c_str(), wide_parameters.c_str(), NULL, SW_SHOW);

wide_变量的类型为wstring。此代码适用于文件路径和动词的任意组合,但动词“runas”(获取管理员权限)和给定路径wide_filename中包含空格的批处理文件除外。 UAC提示符将弹出,并在确认后短时间内,命令提示符将闪烁,表示无法找到路径,在路径的第一个空格处切断。

我已经尝试用其他引号包装文件名,但这没有帮助。

原因可能是.bat文件不是真正的“可执行文件”,而是文档,因此

ShellExecuteW(GetDesktopWindow(), L"runas", L"C:\\Path To\\file.bat", L"Parameters For Batch", NULL, SW_SHOW);

内部映射到

的提升执行
cmd.exe /C "C:\Path To\file.bat" "Parameters for Batch"

虽然它应该是

的内容
cmd.exe /S /C " "C:\Path To\file.bat" Parameters for Batch "

事实上,如果我执行这样的事情:

ShellExecuteW(GetDesktopWindow(), L"runas", L"cmd.exe", L"/S /C \" \"C:\\Path To\\file.bat\" Parameters For Batch \"", NULL, SW_SHOW);

它可以解决问题!

但是,这似乎不是最简洁的方法来“硬编码”可执行文件(在这种情况下为cmd.exe)。对于批处理文件,它确实无关紧要,但对于采用参数的其他脚本类型文档,它可能会变得相关。

所以问题是:是否可以通过ShellExecute或类似的机制执行批处理文件(路径中有空格),而无需将其显式传递给cmd.exe?

1 个答案:

答案 0 :(得分:1)

CreateProcessWithLogonW就是你需要的。它有很多参数,但在页面的末尾你会看到一个 Examples 部分,指示如何初始化args。

至于硬编码cmd.exe这里CreateProcess official doc说的是什么(在描述lpApplicationName参数的部分的末尾):

  

要运行批处理文件,必须启动命令解释程序;将lpApplicationName设置为cmd.exe并将lpCommandLine设置为以下参数:/ c加上批处理文件的名称。

所以我觉得你很好。当然,"中包含的路径仍然适用。