Вызов программы в приглашении Windows по абсолютному пути из каталога C: Windows
работает, но эта программа вызывается из C: Windows System32
выдает ошибки.
C: Windows> D: pathtoexe program.exe
-> OKC: Windows System32> D: pathtoexe myprogram.exe
-> Завершается, не выполнив свою задачу
Программа читает файл конфигурации из текущего каталога. Файл конфигурации существует в обоих каталогах (Windows и System32). Если я удалю файл из каталога Windows, тогда вызов программы из каталога Windows завершится с той же ошибкой, как если бы я вызываю ее из каталога System32. Проблем с доступом к файлам быть не должно:
C: Windows> введите config.ini
-> OKC: 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