How to launch SFC programatically on Windows Vista/7/8?

前端 未结 2 1204
情深已故
情深已故 2021-01-20 04:29

I\'ve been trying to solve the problem that Chris Iverson was having in this other Stackoverflow question.

I want to launch SFC (the System File

2条回答
  •  南方客
    南方客 (楼主)
    2021-01-20 05:16

    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.

提交回复
热议问题