Отличия запуска программы из C: Windows от C: Windows system32

Вызов программы в приглашении Windows по абсолютному пути из каталога C: Windows работает, но эта программа вызывается из C: Windows System32 выдает ошибки.

  • C: Windows> D: pathtoexe program.exe -> OK
  • C: Windows System32> D: pathtoexe myprogram.exe -> Завершается, не выполнив свою задачу

Программа читает файл конфигурации из текущего каталога. Файл конфигурации существует в обоих каталогах (Windows и System32). Если я удалю файл из каталога Windows, тогда вызов программы из каталога Windows завершится с той же ошибкой, как если бы я вызываю ее из каталога System32. Проблем с доступом к файлам быть не должно:

  • C: Windows> введите config.ini -> OK
  • C: Windows system32> введите config.ini -> OK

Та же программа с тем же файлом конфигурации на Windows Server 2003 работает для обоих каталогов!

Как мне отладить, почему он не запускается из system32 в 2008 году?


Я предполагаю, что вы находитесь на 64-разрядная ОС, а program.exe — 32-разрядная программа.

Если это правда, поместите файл конфигурации в каталог windows syswow64 . Это то, что выглядит 32-битным процессом как system32 .

Из-за того, как Windows запускает процессы, они не наследуют напрямую свой рабочий каталог, а выполняют эквивалент cd во время запуска. Следовательно, 32-битный процесс, запущенный в 64-битном системном каталоге, на самом деле заканчивается в 32-битном системном каталоге (называемом syswow64 в 64-битном cmd или проводнике).


Ваше приложение чувствительно к тому, в каком каталоге оно запущено, из-за ожидания определенных файлов — файлов конфигурации, возможно, DLL или сторонние бывшие из текущего каталога. Я бы посоветовал использовать pstools procmon для определения файлов .exact, к которым осуществляется доступ.

Это также может быть проблема 32 и 64 бит. Procmon также покажет это.

1



Почему команды Windows, которые обращаются к C: Windows System32 … не работаете в программе C?

Я запускаю программу ac, предназначенную для автоматизации процесса «переупаковки» установки Windows. Я делаю это по двум причинам. Первая причина — изучить программирование на c, а вторая причина — то, что я запускаю Windows на MacBook Pro, у которого нет супердрайва. Я нашел руководство, в котором объясняется, как установить Windows на vbox, а затем скопировать его на другой жесткий диск. Я решил, что хочу попрактиковаться в программировании на c и автоматизировать этот учебник, поэтому написал код ниже. Когда я запускаю приведенную ниже программу, я получаю ошибки, что bcdedit не является внутренней или внешней командой и что unnattend.xml копирует, но когда я проверяю, есть ли он там, его не найти. Немного поэкспериментировав, я обнаружил, что код, который я использую в функциях System (), работает отлично, если я запускаю его прямо из командной строки с повышенными правами. Хотя это дает мне ошибки, о которых я упоминал ранее, когда я запускаю свою программу из командной строки с повышенными привилегиями. Вроде у exe нет доступа к папке System32 ?? Пожалуйста помоги! Я бьюсь головой об стену здесь

  #include  void part1 (void);  недействительна часть2 (недействительна);  void part1 (void) {FILE * fp; //Запускаем Switcheroo if ((fp = fopen ("log.txt", "r")) == NULL) {//Запускаем часть 1. system ("DISKPART/s resources \ diskpart \ DskPrtAssgn.txt")  ;  система ("ТАЙМ-АУТ/Т 3");  system ("рег выгрузить HKLM \ BCD00000000");  система ("ТАЙМ-АУТ/Т 3");  система ("robocopy s: \ c: \ bootmgr");  система ("ТАЙМ-АУТ/Т 3");  system ("robocopy s: \ Boot c: \ Boot/s");  система ("ТАЙМ-АУТ/Т 3");  system ("bcdedit/store c: \ boot \ bcd/set {bootmgr} раздел устройства = C:");  система ("ТАЙМ-АУТ/Т 3");  system ("Ресурсы DISKPART/s \ diskpart \ DskPrtActv.txt");  система ("ТАЙМ-АУТ/Т 3");  система ("schtasks/create/tn 'Switcheroo'/tr% userprofile% \ Desktop \ Switcheroo \ Switcheroo.exe/sc onlogon"); //Настраиваем файл журнала, который компьютер будет проверять при перезагрузке.  char buffer [2] = {'0'};  fp = fopen ("log.txt", "wb");  fwrite (буфер, 1, sizeof (буфер), fp); //Перезагрузить.  система ("выключение -r");  } иначе, если (fp = fopen ("log.txt", "rt")) {part2 ();  }} void part2 (недействительно) {FILE * fp; //Читаем файл журнала из части 1.  if (fp = fopen ("log.txt", "rt")) {//Запускаем часть 2. system ("DISKPART/s resources \ diskpart \ DskPrtRmv.txt");  система ("ТАЙМ-АУТ/Т 3");  система ("cd resources \ sysprep");  system ("скопируйте unattend.xml C:  Windows  System32  Sysprep");  система ("ТАЙМ-АУТ/Т 3");  система ("runas/user:% username%% userprofile%  Desktop  Switcheroo  resources  sysprep  sysprep.bat");  }//Если первая часть не завершена, выводится ошибка.  иначе, если ((fp = fopen ("log.txt", "r")) == NULL) {printf ("Ошибка.");  }} int main () {part1 ();  возврат (0);  }  

Не следует писать сценарии системного администрирования на C. Делайте это пакетно, на Python или в PowerShell. C — абсолютно неправильный выбор для программы, которую вы пишете.


Я не могу сказать, что это ваша проблема наверняка, но … мне кажется подозрительным, что у вас есть system () , который вызывает просто cd в новый каталог. Поскольку каждый из них работает в новой оболочке, он не влияет на последующие вызовы system () . Таким образом, если вы попытались перейти в каталог, в котором существует файл для работы с ним, вы обнаружите, что на самом деле вас нет в этом каталоге..

1


Возможно, вы компилируете с отключенными всеми предупреждениями?

Поскольку строка system ("copy unattend.xml C: Windows System32 Sysprep"); требует экранирования обратной косой черты.

Это будет проблема с привилегиями, когда вам будет отказано в доступе к этой папке. Он должен работать, если вы запустите .exe от имени администратора.

3


Вы сбежали все обратные косые черты в каждой строке, кроме той, которая не работает. Вам просто нужно убрать их там.

  system ("скопируйте unattend.xml C: \ Windows \ System32 \ Sysprep");   

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

EDIT

Также похоже, что у вас есть нежелательный пробел перед sysprep.bat в вашем последнем вызове System ().

Кроме того, я согласен с FatalError, что ваша система cd звонок не приносит никакой пользы. Отбросьте эту строку, а затем префикс «unattend.xml» с полным путем к файлу в следующей строке.

Если bcedit не найден ни в одной из ваших папок PATH по умолчанию, то вам, вероятно, понадобится для предоставления абсолютного пути к файлу.

3

Оцените статью
clickpad.ru
Добавить комментарий