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

时间:2018-06-12 18:57:39

标签: c++ windows batch-file cmd

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

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 \
  5. 同样,在cmd.exe中执行相同的命令也可以,但它似乎不适用于我的代码。我一直在寻找,我似乎无法找到有用的东西。有什么想法吗?

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

      

    'bcdedit'未被识别为内部或外部命令,可操作程序或批处理文件。

         

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

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

2 个答案:

答案 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位可执行文件提取到临时位置以运行它。