【问题标题】:bcdedit file output doesn't work but other commands dobcdedit 文件输出不起作用,但其他命令可以
【发布时间】:2018-11-22 06:10:53
【问题描述】:

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

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 命令,可运行的程序或批处理文件。

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

【问题讨论】:

  • 我不太确定 bash 标签适合这里。您的用户是否具有管理权限?如果它被编译为可执行文件,请尝试右键单击该 exe,然后选择“以管理员身份运行”
  • @Jason 是的,用户拥有管理员权限。而是可执行文件具有要求管理员执行级别。
  • 你有机会发布更多代码吗?
  • @Jason 这就是所有的代码。检查编辑!显然,尽管使用了所有其他 4 种方法,但无法识别该命令。它仍然对 runas 没有任何影响。
  • 也许尝试调用完整路径?在这种情况下不要忘记 \\ for \。

标签: c++ windows batch-file cmd


【解决方案1】:

好的。我认为您的应用程序正在以管理员身份运行,但 ShellExecute 命令不是。为此,我相信您需要将第二个参数设为runas 而不是open。像这样:

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

【讨论】:

  • 感谢您的回答。但是 file_output.txt 仍然是空白的。
【解决方案2】:

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

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

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

要获取有关文件系统重定向器的更多信息,您可以参考 MSDN 页面https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85).aspx

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2011-09-13
    • 1970-01-01
    • 2019-07-31
    • 2021-10-24
    相关资源
    最近更新 更多