首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bcdedit文件输出不工作,但其他命令

bcdedit文件输出不工作,但其他命令
EN

Stack Overflow用户
提问于 2018-06-12 18:57:38
回答 2查看 2.9K关注 0票数 1

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

代码语言:javascript
复制
ShellExecute(NULL, "open", "cmd.exe", "/C ipconfig > file_output.txt", NULL, SW_SHOWNORMAL);

在执行时,ipconfig输出被写入file_output.txt",这正是我想要的。

代码语言:javascript
复制
ShellExecute(NULL, "open", "cmd.exe", "/C bcdedit > file_output.txt", NULL, SW_SHOWNORMAL);

生成文件,但文件中没有任何内容。我可以在cmd.exe中执行与管理员相同的命令,它可以工作。我也试过:

代码语言:javascript
复制
ShellExecute(NULL, "open", "cmd.exe", "/C bcdedit /enum all > file_output.txt", NULL, SW_SHOWNORMAL);

bcdedit不起作用。没有错误。下面是我尝试过的一些其他方法:

  1. 使用CreateProcess代替。
  2. 用系统代替。
  3. 将目录设置为C:\Windows\System32 32
  4. 将目录设置为C:\Windows\SysWOW64 64\

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

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

“‘bcdedit”不被识别为内部或外部命令、可操作的程序或批处理文件。 “C:\Windows\System32\bcdedit.exe”不被识别为内部或外部的c ommand、可操作的程序或批处理文件。

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

EN

回答 2

Stack Overflow用户

发布于 2018-06-13 11:02:15

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

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

因此,当您的32位应用程序调用cmd.exe时,它实际上是调用驻留在%windir%\SysWOW64中的32位版本的cmd.exe。32位版本的cmd.exe依次尝试从SysWOW64目录调用bcdedit.exe,但在%windir%\SysWOW64中没有32位版本的bcdedit.exe,只有32位cmd.exe无法访问的%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位版本的应用程序,并将64位可执行文件嵌入32位可执行文件中作为资源。然后32位应用程序可以检测它是在32位还是64位窗口下运行,所以它要么继续运行,要么将64位可执行文件提取到临时位置来运行。

票数 1
EN

Stack Overflow用户

发布于 2018-06-12 19:15:54

好吧。我认为您的应用程序是以管理员身份运行的,但是ShellExecute命令不是。要做到这一点,我相信您需要向runas而不是open提出第二个论点。如下所示:

代码语言:javascript
复制
ShellExecute(NULL, "runas", "cmd.exe", "/C bcdedit > file_output.txt", NULL, SW_SHOWNORMAL);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50824048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档