Вывод файла bcdedit не работает, но другие команды работают - PullRequest
0 голосов
/ 12 июня 2018

У меня очень странная проблема с выполнением командной строки.Приведенный ниже код работает без проблем:

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' не распознается как внутренняя или внешняя команда, работающая программа или пакетный файл.

Я перепробовал все 4 метода, перечисленных выше, и, по-видимому, он все еще не может быть распознан как команда.** bcdedit.exe действительно существует в C: \ Windows \ System32 **.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Это эффект перенаправления файловой системы для 32-разрядных процессов, работающих в 64-разрядных окнах.

В 64-разрядных окнах, когда 32-разрядное приложение пытается получить доступ к каталогу %windir%\System32, доступ будетбыть перенаправлен на %windir%\SysWOW64.Этот процесс прозрачен для приложения, и он по-прежнему думает, что обращается к каталогу %windir%\System32.

Так что, когда ваше 32-разрядное приложение вызывает cmd.exe, оно фактически вызывает 32-разрядную версию cmd.exeкоторый находится в %windir%\SysWOW64.32-битная версия cmd.exe, в свою очередь, пытается вызвать bcdedit.exe из SysWOW64 direcory, но в %windir%\SysWOW64 нет 32-битной версии bcdedit.exe, а только в %windir%\System32, который32-разрядный cmd.exe не может получить доступ.

Для получения дополнительной информации о Redirector файловой системы вы можете обратиться к странице MSDN по адресу https://msdn.microsoft.com/en-us/library/windows/desktop/aa384187(v=vs.85).aspx

Наиболее удобныйЧтобы решить эту проблему, нужно скомпилировать ваше приложение в 64-битный исполняемый файл для работы в 64-битных окнах.

Но если у вас есть особые потребности, оставьте ваше приложение только 32-битным или если вы хотите иметьодин исполняемый файл, который можно запускать как в 32-разрядных, так и в 64-разрядных системах, тогда вы можете временно отключить перенаправитель файловой системы, чтобы иметь возможность запускать 64-разрядную версию cmd.exe в 64-разрядных окнах.Информацию о том, как это сделать, можно найти в размещенной выше ссылке.

Но, как правило, это не рекомендуется, это требует понимания предмета и может вызвать больше проблем, чем решить.

Если существует необходимость в одном исполняемом файле для 32-разрядных и 64-разрядных окон, то альтернативой является создание как 32-разрядных, так и 64-разрядных версий приложения и встраивание 64-разрядного исполняемого файла в32-битный как ресурс.Затем 32-разрядное приложение может определить, работает ли оно в 32-разрядных или 64-разрядных окнах, поэтому оно либо продолжит работу, либо извлечет 64-разрядный исполняемый файл во временную папку для его запуска.

0 голосов
/ 12 июня 2018

Хорошо.Я думаю, что ваше приложение работает от имени администратора, но команда ShellExecute - нет.Я полагаю, что для этого вам нужно будет указать второй аргумент runas вместо open.Как это:

ShellExecute(NULL, "runas", "cmd.exe", "/C bcdedit > file_output.txt", NULL, SW_SHOWNORMAL);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...