bcdedit 文件输出不起作用,但其他命令可以

bcdedit file output doesn't work but other commands do

本文关键字:其他 命令 文件 输出 不起作用 bcdedit      更新时间:2023-10-16

我在执行命令行时遇到了一个非常奇怪的问题。下面的代码工作没有问题:

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 没有任何工作。没有错误。以下是我尝试过的其他几种方法:

  1. 请改用 CreateProcess。
  2. 改用系统。
  3. 将目录设置为 C:\Windows\System32
  4. 将目录设置为 C:\Windows\SysWOW64\

同样,在cmd.exe中执行相同的命令是有效的,但它似乎在我的代码中不起作用。我整天都在搜索,似乎找不到有效的东西。有什么想法吗?


编辑:经过进一步调试,现在我看到以下命令。

"bcdedit"不被识别为内部或外部命令、可操作程序或批处理文件。

'C:\Windows\System32\bcdedit.exe' 不被识别为内部或外部 c ommand,可操作的程序或批处理文件。

我再次尝试了上面列出的所有 4 种方法,但显然仍然无法将其识别为命令。 **bcdedit.exe 实际上存在于 C:\Windows\System32** 中。

这是文件系统重定向对在 64 位窗口上运行的 32 位进程的影响。

在 64 位窗口中,每当 32 位应用程序尝试访问%windir%System32目录时,访问将被重定向到%windir%SysWOW64。此过程对应用程序是透明的,它仍然认为它正在访问%windir%System32目录。

因此,当您的 32 位应用程序调用cmd.exe时,它实际上是在调用驻留在%windir%SysWOW64中的 32 位版本的cmd.exe。32 位版本的cmd.exe反过来尝试从SysWOW64direcory 调用bcdedit.exe,但%windir%SysWOW64中不存在 32 位版本的bcdedit.exe,它只存在于 32 位cmd.exe无法访问的%windir%System32中。

若要获取有关文件系统重定向程序的详细信息,可以参阅 MSDN 页,网址为 https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85(.aspx

解决此问题的最便捷方法是将应用编译为 64 位可执行文件,以便在 64 位窗口上运行。

但是,如果您有特定需求仅保持应用程序 32 位,或者如果您希望有一个可以在 32 位和 64 位系统上运行的可执行文件,则可以暂时禁用文件系统重定向器,以便能够在 64 位窗口上运行 64 位版本的cmd.exe。有关如何执行此操作的信息可以在上面发布的链接中找到。

但通常不建议这样做,它需要通过对主题的理解,并且有可能产生比解决更多的问题。

如果需要 32 位和 64 位窗口的单个可执行文件,则替代方法是生成 32 位和 64 位版本的应用,并将 64 位可执行文件作为资源嵌入到 32 位版本中。然后,32 位应用程序可以检测它是在 32 位还是 64 位窗口下运行,因此它将继续运行或将 64 位可执行文件提取到临时位置以运行该窗口。

好的。我认为您的应用程序以管理员身份运行,但ShellExecute命令不是。 为此,我相信您需要向runas而不是open提出第二个论点。喜欢这个:

ShellExecute(NULL, "runas", "cmd.exe", "/C bcdedit > file_output.txt", NULL, SW_SHOWNORMAL);