My experiments suggest that the issue is related to the WOW64 emulator. I have this code in a non-elevated WinForms app:
...
using System.Diagnostics;
...
ProcessStartInfo startInfo = new ProcessStartInfo("cmd", "/K sfc.exe /scannow");
startInfo.UseShellExecute = true;
startInfo.Verb = "runas";
Process.Start(startInfo);
From a 32 bit WOW64 process this fails with this message in the console window:
Windows Resource Protection could not start the repair service.
From a 64 bit process, the above code succeeds.
Indeed, I don't think .net or WinForms are relevant here at all. If I run 32 bit cmd.exe from the SysWOW64 folder, and then call sfc, I experience failure. But I am successful with the 64 bit cmd.exe.
And there's not even any need to bring cmd.exe into this at all. From a 64 bit process, running without elevation, the following succeeds:
...
using System.Diagnostics;
...
ProcessStartInfo startInfo = new ProcessStartInfo("sfc.exe", "/scannow");
startInfo.UseShellExecute = true;
startInfo.Verb = "runas";
Process.Start(startInfo);
So I guess the solution to your problem will involve either switching your main program to 64 bit (probably a little drastic), or splicing a 64 bit process into the chain so that the 64 bit sfc
can be run.