"C:\Windows\System32\OpenSSH\ssh.exe" 的 Createprocess() 失败,错误为 2

Createprocess() of "C:\\Windows\\System32\\OpenSSH\\ssh.exe" fails with error=2

在 Windows-10 机器上,我正在尝试 运行 ssh.exe 作为使用 createprocess 的子进程,类似于下面的代码片段:

// Create the child process.
bSuccess = CreateProcess(NULL,
    child_cmd,     // command line 
    NULL,          // process security attributes 
    NULL,          // primary thread security attributes 
    TRUE,          // handles are inherited 
    0,             // creation flags 
    NULL,          // use parent's environment 
    NULL,          // use parent's current directory 
    &siStartInfo,  // STARTUPINFO pointer 
    &piProcInfo);  // receives PROCESS_INFORMATION 

                   // If an error occurs, exit the application. 
if (!bSuccess)
{
    ErrorExit(TEXT("CreateProcess"));
    return NULL;
}

当 child_cmd 参数包含“C:\\Windows\\System32\\OpenSSH\\[=23 时,CreateProcess API 失败并出现错误 2(未找到文件) =]”。令人费解的是,这个文件——‘C:\Windows\System32\OpenSSH\ssh.exe’——存在于机器上;然而,CreateProcess() 报告错误 2。如果我将 'C:\Windows\System32\OpenSSH\ssh.exe' [从命令提示符] 复制到其他位置,请说 'C:\tmp\System32_OpenSSH\ssh.exe' 然后调用 CreateProcess( ) child_cmd 参数包含“C:\\tmp\\System32_OpenSSH\\ssh.exe”,完全相同的程序就像一个魅力。知道这里发生了什么吗?是否对 C:\Windows\system32 文件夹施加了任何 OS 限制?

我在文件复制方面也遇到了类似的问题 - system("copy C:\Windows\system32\OpenSSH\ssh.exe OpenSSH_ssh.exe").

你必须用双斜杠转义路径中的斜杠。

我的通灵能力表明,虽然你的 C:\Windows\System32\OpenSSH 文件夹中确实有一个名为 ssh.exe 的二进制文件,但你的编译代码是 运行 作为 32 位,但是你的 OS 是 64 位。

32 位代码 运行 在 64 位 OS 上获取特定文件夹的文件系统重定向。这样任何访问 C:\Windows\System32 的尝试都会映射到 C:\Windows\SysWOW64。我猜您的 C:\Windows\SysWOW64\OpenSSH 文件夹中没有 ssh.exe 的副本。 (看来我也是这样。)

如果您将代码编译为 64 位,它可能会工作。如果允许 32 位进程 "create" 64 位进程,我不记得规则了。 (我会这么认为 - 对吗?)但是快速 Google 引用 this post on Whosebug. Looks like there are some APIs 可以调用它来禁用文件系统重定向。