0

Windowsインストールを「再パッケージ化」するプロセスを自動化するように設計されたacプログラムを実行しています。私は2つの理由でこれを行っています。最初の理由はcプログラミングを学ぶことであり、2番目の理由はスーパードライブのないMacBookProでWindowsを実行していることです。Windowsをvboxにインストールし、それを別のハードドライブにコピーする方法を説明するチュートリアルを見つけました。私はcプログラミングを練習してこのチュートリアルを自動化することに決めたので、以下のコードを書きました。以下のプログラムを実行すると、bcdeditが内部コマンドまたは外部コマンドではなく、unnattend.xmlがコピーされるというエラーが表示されますが、存在するかどうかを確認すると、どこにも見つかりません。少し実験した結果、System()関数で使用するコードは、管理者特権のコマンドプロンプトから直接実行すると、完全に正常に実行されることがわかりました。昇格したコマンドプロンプトからプログラムを実行すると、前述のエラーが発生しますが。exeファイルがSystem32フォルダにアクセスできないようです?? 助けてください!ここの壁に頭をぶつけている

    #include <stdio.h>

    void part1 (void);
    void part2 (void);

    void part1 (void)
    {
        FILE *fp;
        //Run Switcheroo
        if ((fp=fopen("log.txt", "r")) == NULL)
        {
            //Run part 1.
            system("DISKPART /s resources\\diskpart\\DskPrtAssgn.txt");
            system("TIMEOUT /T 3");
            system("reg unload HKLM\\BCD00000000");
            system("TIMEOUT /T 3");
            system("robocopy s:\\ c:\\ bootmgr");
            system("TIMEOUT /T 3");
            system("robocopy s:\\Boot c:\\Boot /s");
            system("TIMEOUT /T 3");
            system("bcdedit /store c:\\boot\\bcd /set {bootmgr} device partition=C:");
            system("TIMEOUT /T 3");
            system("DISKPART /s resources\\diskpart\\DskPrtActv.txt");
            system("TIMEOUT /T 3");
            system("schtasks /create /tn 'Switcheroo' /tr %userprofile%\\Desktop\\Switcheroo\\Switcheroo.exe /sc onlogon");

            //Set up the log file that the computer will check upon reboot.
            char buffer[2] = {'0'};
            fp = fopen("log.txt", "wb");
            fwrite (buffer , 1 , sizeof(buffer) , fp );

            //Reboot.
            system("shutdown -r");
        }
        else if (fp = fopen("log.txt", "rt"))
        {
            part2();
        }
    }

    void part2 (void)
    {
        FILE *fp;

        //Read the log file from part1. 
        if (fp = fopen("log.txt", "rt"))
        {
            //Run part 2.
            system("DISKPART /s resources\\diskpart\\DskPrtRmv.txt");
            system("TIMEOUT /T 3");
            system("cd resources\\sysprep");
            system("copy unattend.xml C:\Windows\System32\Sysprep");
            system("TIMEOUT /T 3");     
            system("runas /user:%username% %userprofile%\\Desktop\\Switcheroo\\resources\\sysprep\\ sysprep.bat");
        }

        //If part one did not finish then print error.
        else if ((fp=fopen("log.txt", "r")) == NULL)
        {
            printf("Error.");
        }
    }

    int main ()
    {
        part1();
        return(0);
    }
4

4 に答える 4

1

システム管理スクリプトをCで記述しないでください。バッチ、Python、またはPowerShellで記述してください。Cはあなたが書いているプログラムにとって絶対に正しい選択ではありません。

于 2012-05-31T18:50:23.417 に答える
1

これがあなたの問題であるとは断言できませんが...新しいディレクトリへのsystem()呼び出しがあるのではないかと疑っています。cdそれぞれが新しいシェルで実行されるため、以降のへの呼び出しには影響しませsystem()ん。したがって、ファイルを操作するために存在するディレクトリに変更しようとすると、実際にはそのディレクトリにいないことがわかります。

于 2012-05-31T18:50:40.573 に答える
1

おそらく、すべての警告をオフにしてコンパイルしていますか?

system("copy unattend.xml C:\Windows\System32\Sysprep"); をエスケープするにはバックスラッシュが必要だからです。

編集

これは、そのフォルダへのアクセスが拒否されている特権の問題になります。管理者として.exeを実行すると機能するはずです。

于 2012-05-31T18:46:44.483 に答える
0

失敗している行を除くすべての行のすべてのバックスラッシュをエスケープしました。そこにも逃げる必要があります。

system("copy unattend.xml C:\\Windows\\System32\\Sysprep"); 

私はあなたがしていることがCプログラムに夢中になっていることに同意しなければなりません。しかし、それは機能するはずです。

編集

またsysprep.bat、最後のSystem()呼び出しの前に不要なスペースがあるようです。

cdまた、私はあなたのシステムコールが何の役にも立たないというFatalErrorに同意します。その行を削除し、次の行のファイルへのフルパスを「unattend.xml」の前に付けます。

デフォルトのPATHフォルダー内にbceditが見つからない場合は、ファイルへの絶対パスを指定する必要があります。

于 2012-05-31T18:57:54.550 に答える