Como iniciar o SFC programaticamente no Windows Vista / 7/8?
Eu tenho tentado resolver o problema queChris Iverson estava tendo nesta outra questão Stackoverflow.
Eu quero lançarSFC
(aVerificador de arquivo do sistema ferramenta) programaticamente.
Funciona no Windows XP:
private void RunSfc()
{
ProcessStartInfo startInfo ,= new ProcessStartInfo("cmd", "/K sfc.exe /scannow");
System.Diagnostics.Process.Start(startInfo);
}
Outras variantes queFaz trabalhe no 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");
O mesmo código falha no Windows 7 (com o programa de inicialização sendo executado como administrador). A janela do console aparece, mas o SFC apresenta o erro:
Windows Resource Protection could not start the repair service.
Mas se eu executar manualmentesfc /scannow
a partir de umseparado prompt de comando elevado, ele funciona:
Portanto, obviamente há algo estranho acontecendo com o Windows Vista / 7/8. não sei exatamente o que. Mas provavelmente está relacionado ao UAC, UIPI, isolamento da sessão 0 ou ao fato de quejanelas do console foram executadas pelo CSRSS
Mas ainda assim, eu não entendo o problema.
Teria sido bom resolver o problema de Chris, com a possibilidade de eu querer fazer o que ele fez.
E lembre-se: Meu código já está sendo executado como administrador. Clico com o botão direito eIniciar como administrador:
Isso não significa que o problema não seja outro problema sutil relacionado ao UAC, mas não ao fato de eu estar executando como usuário padrão.
Código no aplicativo WinFormsprivate void button1_Click(object sender, EventArgs e)
{
RunSfc();
}
Falha de 32 bitsAcontece que há uma versão de 32 bits docmd.exe
e uma versão de 32 bits dosfc.exe
:
Se você executar uma taxa de 32 bits elevadacmd, nem a versão de 32 bits nem a de 64 bits dosfc vai funcionar.
Portanto, o enigma se torna como lançar o64 bits cmd.exe
de um processo de 32 bits. O que provavelmente significa que o enigma se torna comoencontrar a versão de 64 bits docmd.exe
de um processo de 32 bits, dado:
System32
pasta com base na bit-ness do seu processo