How to launch ssh-keygen.exe from C# windows form?

compile 21 Reputation points

I want to launch from a button in a Windows Form this command:

    private void buttonGenerateKey_Click(object sender, EventArgs e)
       var workingDir = @"C:\Users\me\Desktop\MyApp\key";
      Process process = new Process();
      process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
      process.StartInfo.FileName = @"C:\Windows\System32\OpenSSH\ssh-keygen.exe";
     process.StartInfo.Arguments = $"-t ecdsa -b 256 -m pem -N password123 -f \"{Path.Combine(workingDir, "new_ecdsa")}\"";
     process.StartInfo.UseShellExecute = false;
      process.StartInfo.CreateNoWindow = true;

But, when I click on this button (buttonGenerateKey), an exception occurs: Cannot find specified file: System.ComponentModel.Win32Exception (0x80004005): Cannot find specified file.
in System.Diagnostics.Process.StartWithCreateProcess(ProcessStartInfo startInfo)

the line number is the one corresponding to process.StartInfo.FileName = ....
my App is running as administrator so there shouldn't be any privilege issues. And ssh-keygen.exe exists in C:\Windows\System32\OpenSSH (I've installed OpenSSH).

How I can solve this? I've already tried to:

  • Delete the path before ssh-keygen.exe
  • Copy ssh-keygen.exe in my working dir

But nothing goes right.

Thank you.

An object-oriented and type-safe programming language that has its roots in the C family of languages and includes support for component-oriented programming.
9,923 questions
0 comments No comments
{count} votes

Accepted answer
  1. Castorix31 80,886 Reputation points

    Add before :

                bool bWow64 = false;
                IsWow64Process(Process.GetCurrentProcess().Handle, out bWow64);
                if (bWow64)
                    IntPtr OldValue = IntPtr.Zero;
                    bool bRet = Wow64DisableWow64FsRedirection(out OldValue);

    with :

        [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        private static extern bool IsWow64Process(IntPtr hProcess, out bool Wow64Process);
        [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
        private static extern bool Wow64DisableWow64FsRedirection(out IntPtr OldValue);

0 additional answers

Sort by: Most helpful