Как запустить 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, но это не связано с тем, что я работаю как обычный пользователь.
Код в приложении WinFormsprivate void button1_Click(object sender, EventArgs e)
{
RunSfc();
}
32-битный сбойОказывается, есть 32-битная версияcmd.exe
и 32-битная версияsfc.exe
:
Если вы используете повышенный 32-разрядныйCMDни 32-битная, ни 64-битная версияПФС будет работать.
Таким образом, загадка становится, как запустить64-битный cmd.exe
из 32-битного процесса. Что, вероятно, означает, что загадка становится, какнаходить 64-битная версияcmd.exe
из 32-битного процесса, учитывая:
System32
папка, основанная на битности вашего процесса