执行命令行时遇到一个非常奇怪的问题。下面的代码没有问题:
ShellExecute(NULL, "open", "cmd.exe", "/C ipconfig > file_output.txt", NULL, SW_SHOWNORMAL);
执行时,ipconfig输出写入file_output.txt“,这正是我想要的。但是当我使用bcdedit:
ShellExecute(NULL, "open", "cmd.exe", "/C bcdedit > file_output.txt", NULL, SW_SHOWNORMAL);
生成文件,但文件中没有任何内容。我可以作为管理员在cmd.exe中执行相同的命令,它可以工作。我也试过了:
ShellExecute(NULL, "open", "cmd.exe", "/C bcdedit /enum all > file_output.txt", NULL, SW_SHOWNORMAL);
bcdedit没有任何作用。没有错误。以下是我尝试过的其他一些方法:
同样,在cmd.exe中执行相同的命令也可以,但它似乎不适用于我的代码。我一直在寻找,我似乎无法找到有用的东西。有什么想法吗?
编辑:进一步调试后,现在我看到以下命令。
'bcdedit'未被识别为内部或外部命令,可操作程序或批处理文件。
'C:\ Windows \ System32 \ bcdedit.exe'无法识别为内部或外部c ommand,可操作程序或批处理文件。
我再次尝试了上面列出的所有4种方法,显然它仍然无法被识别为命令。 ** bcdedit.exe确实存在于C:\ Windows \ System32 **。
答案 0 :(得分:0)
好。我认为您的应用程序以管理员身份运行,但ShellExecute
命令不是。要做到这一点,我相信您需要将第二个参数改为runas
而不是open
。像这样:
ShellExecute(NULL, "runas", "cmd.exe", "/C bcdedit > file_output.txt", NULL, SW_SHOWNORMAL);
答案 1 :(得分:0)
这是文件系统重定向对在64位窗口上运行的32位进程的影响。
在32位应用程序尝试访问%windir%\System32
目录时,在64位窗口上,访问权限将重定向到%windir%\SysWOW64
。此过程对应用程序是透明的,它仍然认为它正在访问%windir%\System32
目录。
因此,当您的32位应用程序调用{{1}}时,它实际上正在调用驻留在cmd.exe
中的32位版本的cmd.exe
。 32位版本的%windir%\SysWOW64
依次尝试从cmd.exe
目标调用bcdedit.exe
,但SysWOW64
中没有bcdedit.exe
的32位版本仅出现在%windir%\SysWOW64
中,32位%windir%\System32
无法访问。
要获取有关文件系统重定向器的更多信息,请参阅https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85).aspx上的MSDN页面
解决这个问题最方便的方法是将您的应用程序编译为64位可执行文件,以便在64位窗口上运行。
但是,如果您有特定需要将应用程序保留为32位,或者如果您希望有一个可以在32位和64位系统上运行的单个可执行文件,那么您可以暂时禁用文件系统重定向器能够在64位窗口上运行64位版本的cmd.exe
。有关如何操作的信息可以在上面发布的链接中找到。
但通常不建议这样做,它需要通过对主题的理解,并且它有可能产生比解决更多的问题。
如果需要32位和64位窗口的单个可执行文件,那么替代方法是生成应用程序的32位和64位版本,并将32位可执行文件嵌入到32-第一位作为资源。然后,32位应用程序可以检测它是否在32位或64位窗口下运行,因此它将继续运行,或者将64位可执行文件提取到临时位置以运行它。