c – ShellExecute:Verb“runas”不适用于路径中包含空格的批处理文件
作者:互联网
我正在使用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?
解决方法:
CreateProcessWithLogonW就是你需要的.它有很多参数,但在页面的末尾你会看到一个Examples部分,它指示如何初始化args.
至于硬编码cmd.exe这里是CreateProcess official doc所说的(在描述lpApplicationName参数的部分的末尾):
To run a batch file, you must start the command interpreter; set lpApplicationName to cmd.exe and set lpCommandLine to the following arguments: /c plus the name of the batch file.
所以我觉得你很好.当然,封闭在“s”中的路径仍然适用.
标签:shellexecute,c,windows,batch-file 来源: https://codeday.me/bug/20191008/1873110.html