Jak programowo uruchomić SFC w systemie Windows Vista / 7/8?

Próbowałem rozwiązać ten problemChris Iverson miał w tym innym pytaniu Stackoverflow.

Chcę wystartowaćSFC (Kontroler plików systemowych narzędzie) programowo.

Działa w systemie Windows XP:

private void RunSfc()
{
    ProcessStartInfo startInfo = new ProcessStartInfo("cmd", "/K sfc.exe /scannow");
    System.Diagnostics.Process.Start(startInfo);
}

Inne wariantyrobić działa pod Windows XP:

//Launch SFC directly
ProcessStartInfo startInfo = new ProcessStartInfo("sfc.exe", "/scannow"); 
System.Diagnostics.Process.Start(startInfo);

//Use full path to SFC
String sfcPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), "sfc.exe");
ProcessStartInfo startInfo = new ProcessStartInfo(sfcPath, "/scannow"); 

Ten sam kod nie działa w systemie Windows 7 (przy uruchomionym programie uruchamiającym jako administrator). Pojawi się okno konsoli, ale SFC daje błąd:

Windows Resource Protection could not start the repair service.

Ale jeśli ręcznie uruchomięsfc /scannow ododdzielny Podwyższony wiersz polecenia, działa:

W systemie Windows Vista / 7/8 jest oczywiście coś dziwnego. dokładnie nie wiem co. Ale jest to prawdopodobnie związane z UAC, UIPI, izoloacją sesji 0 lub faktem, żeokna konsoli były uruchamiane przez CSRSS

Ale nadal nie rozumiem tego problemu.

Byłoby miło rozwiązać problem Chrisa, nie mając szansy, że chcę zrobić to, co zrobił.

I pamiętaj: Mój kod już działa jako administrator. Kliknij prawym przyciskiem myszy iUruchom jako administrator:

To nie znaczy, że problem nie jest jakimś innym subtelnym problemem związanym z UAC, ale nie jest to spowodowane faktem, że pracuję jako standardowy użytkownik.

Kod w aplikacji WinForms
private void button1_Click(object sender, EventArgs e)
{
    RunSfc(); 
}
32-bitowy błąd

Okazuje się, że jest 32-bitowa wersjacmd.exe i 32-bitowa wersjasfc.exe:

C: Windows SystemWOW64 cmd.exeC: Windows SysWOW64 sfc.exe

Jeśli uruchomisz podwyższony 32-bitcmd, ani wersja 32-bitowa ani 64-bitowasfc będzie działać.

Tak więc zagadką staje się, jak uruchomić64-bit cmd.exe z procesu 32-bitowego. Co prawdopodobnie oznacza, że ​​zagadka staje się jakodnaleźć 64-bitowa wersjacmd.exe z procesu 32-bitowego:

możesz nie być na komputerze 64-bitowymmoże być już uruchomiony proces 64-bitowyWindows lubi fałszować nazwySystem32 folder oparty na bitości procesu

questionAnswers(2)

yourAnswerToTheQuestion