Как запустить SFC программно в Windows Vista / 7/8?

Я пытался решить проблему,У Криса Айверсона был другой вопрос Stackoverflow.

Я хочу запуститьSFC (Проверка системных файлов инструмент) программно.

Работает на Windows XP:

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

Другие варианты, которыеделать работа под 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"); 

Тот же код не работает в Windows 7 (с запуском программы от имени администратора). Появляется окно консоли, но SFC выдает ошибку:

Windows Resource Protection could not start the repair service.

Но если я запускаю вручнуюsfc /scannow изотдельный повышенная командная строка, она работает:

Так что, очевидно, что-то странное происходит с Windows Vista / 7/8. я не знаю что именно. Но это, скорее всего, связано с UAC, UIPI, изоляцией сеанса 0 или тем, чтоконсольные окна были запущены CSRSS

Но все же я не понимаю проблему.

Было бы неплохо решить проблему Криса, если бы я не хотел делать то, что он сделал.

И запомни: Мой код уже работает от имени администратора. Я щелкаю правой кнопкой мыши иЗапустить от имени администратора:

Это не означает, что проблема не является какой-то другой тонкой проблемой, связанной с UAC, но это не связано с тем, что я работаю как обычный пользователь.

Код в приложении WinForms
private void button1_Click(object sender, EventArgs e)
{
    RunSfc(); 
}
32-битный сбой

Оказывается, есть 32-битная версияcmd.exe и 32-битная версияsfc.exe:

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

Если вы используете повышенный 32-разрядныйCMDни 32-битная, ни 64-битная версияПФС будет работать.

Таким образом, загадка становится, как запустить64-битный cmd.exe из 32-битного процесса. Что, вероятно, означает, что загадка становится, какнаходить 64-битная версияcmd.exe из 32-битного процесса, учитывая:

вы не можете быть на 64-битной машиневозможно, вы уже запускаете 64-битный процессWindows любит подделывать именаSystem32 папка, основанная на битности вашего процесса

Ответы на вопрос(2)

Ваш ответ на вопрос