我一直在尝试解决Chris Iverson在另一个Stackoverflow问题中遇到的问题。
我想要以编程方式启动SFC(系统文件检查器工具)。
它在Windows XP上运行:
在Windows 7上(以管理员身份运行启动程序),相同的代码会失败。控制台窗口会出现,但SFC会给出错误提示:
我想要以编程方式启动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运行控制台窗口的事实有关。
但是,我仍然不理解这个问题。
如果我想做跟Chris一样的事情,解决他的问题就很好了。
请记住:我的代码已经作为管理员运行。我右键单击并以管理员身份运行:
这并不意味着问题不是与UAC相关的其他微妙问题,但这并不是因为我以标准用户身份运行。
WinForms应用程序中的代码
private void button1_Click(object sender, EventArgs e)
{
RunSfc();
}
32位操作失败
原来有一个32位版本的 cmd.exe
和一个32位版本的 sfc.exe
:
- C:\Windows\SysWOW64\cmd.exe
- C:\Windows\SysWOW64\sfc.exe