【问题标题】:Why do windows commands that access C:\Windows\System32\... not work in a C program?为什么访问 C:\Windows\System32\... 的 windows 命令在 C 程序中不起作用?
【发布时间】:2012-05-31 18:30:10
【问题描述】:

我正在运行一个 c 程序,该程序旨在自动执行“重新打包”Windows 安装的过程。我这样做有两个原因。第一个原因是学习 c 编程,第二个原因是我在没有超级驱动器的 MacBook Pro 上运行 Windows。我找到了一个教程,解释了如何在 vbox 上安装 Windows,然后将其复制到另一个硬盘驱动器。我决定要练习 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);
    }

【问题讨论】:

  • 您使用的是哪个版本的 windows?
  • 这读起来很像一个批处理文件......只是说;)。
  • @fduff:Windows 8。@FatalError:我知道,但这只是为了了解 c 程序的工作原理。我对它很陌生。如果你知道我可以让它更像“C”的任何其他方式,请随时告诉我。我实际上希望我能找到一种方法让它不像批处理文件。
  • 如果你想让它看起来不像一个批处理文件,你可以考虑包括 windows.h。我不知道具体细节,因为我从未使用过它,但这是一个开始。
  • 顺便说一句,不是每个人都在 C: 驱动器上拥有 Windows 目录,因此请考虑将 C:\Windows\System32 替换为 %windir%\system32

标签: c windows cmd system32 bcdedit


【解决方案1】:

您不应该在 C 中编写系统管理脚本。以批处理、python 或 PowerShell 的形式进行。 C 绝对不是您正在编写的程序的正确选择。

【讨论】:

  • @MK。我修改了 c 程序以使用 bcdedit 命令运行批处理文件。出现同样的问题。我知道 c 可能不是最佳选择,但为了学习,我想找到我的问题的答案。
  • 哦,一定要试着弄清楚。但我认为值得一提的是,在 C 中这样做并不是正确的事情(tm)。
  • 谢谢。我会给powershell一个机会。感谢您的帮助。
【解决方案2】:

我不能肯定地说这是你的问题,但是......我怀疑你有 system() 调用只是 cd 到一个新目录。由于每个都在一个新的 shell 中运行,它不会影响对system() 的后续调用。因此,如果您尝试切换到存在文件的目录来对其进行操作,您会发现您实际上并不在该目录中。

【讨论】:

  • +1 - 我相信这是代码的至少 3 个问题之一。
【解决方案3】:

您是否在关闭所有警告的情况下进行编译?

因为system("copy unattend.xml C:\Windows\System32\Sysprep");这行 需要转义反斜杠。

编辑

这将是您被拒绝访问该文件夹的权限问题。如果您以管理员身份运行 .exe,它应该可以工作。

【讨论】:

  • 我看不出更改编译选项会有什么帮助。直到运行时才会发生错误。
  • @dbenham \ 是 C 字符串中的转义字符。所以你得到了\w和\S。你不想要那个。你只需要一个反斜杠。所以你必须让它 C:\\Windows\\System32\\Sysprep
  • 我意识到这一点。我只是说编译器永远无法检测到问题。代码应该可以正常编译,没有任何错误。这是一个运行时错误。
【解决方案4】:

除了失败的那一行之外,您已经转义了每一行中的所有反斜杠。你也只需要在那里逃脱它们。

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

我不得不同意你所做的对于 C 程序来说是疯狂的。但它应该可以工作。

编辑

您在上次 System() 调用中的 sysprep.bat 之前似乎还有一个不需要的空格。

另外,我同意 FatalError 的观点,即您的 cd 系统调用没有任何好处。删除该行,然后在下一行中为“unattend.xml”添加文件的完整路径。

如果在您的任何默认 PATH 文件夹中都找不到 bcedit,那么您可能需要提供文件的绝对路径。

【讨论】:

  • @AndrewRynhard - 查看我编辑的答案,指出不需要的空间。
  • 是的,你是对的。谢谢你。我似乎仍然无法找出为什么 bcdedit 不起作用。
  • @AndrewRynhard - 再加上两个问题
猜你喜欢
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 2017-09-03
  • 2017-03-01
  • 2013-01-15
  • 1970-01-01
相关资源
最近更新 更多