如何从代码后面访问rstrui.exe?

时间:2013-07-22 11:34:50

标签: c# wpf windows xaml system-restore

请告诉我如何从我的c#代码访问系统还原“rstrui.exe”。

我试着打电话给C:\Windows\System32\rstrui.exe; 但根本无法访问。

我需要调用此函数将我的控件重定向到系统还原。

感谢....

2 个答案:

答案 0 :(得分:0)

您可以使用以下属性访问C:\ Windows \ System32:

Environment.SystemDirectory

Environment.SystemDirectory Property

您可以使用以下方法运行可执行文件:

Process.Start(Path.Combine(Environment.SystemDirectory, "rstrui.exe"));

Path.Combine Method

Process.Start Method

更新>>>

啊......现在我看到了你的问题。

当从64位Windows 7和Vista(也许是Windows 8)上的32位代码访问System32文件夹时,Windows“巧妙地”将请求路径的这一部分更改为SysWow64。这就是为什么你可能有一个'找不到路径'的错误。为了解决这个问题,您可以使用以下内容:

Process.Start(@"C:\Windows\SysNative\rstrui.exe");

更完整的答案可能是:

if (Environment.Is64BitProcess)
{
    Process.Start(Path.Combine(Environment.SystemDirectory, "rstrui.exe"));
}
else Process.Start("C:\\Windows\\sysnative\\rstrui.exe");

答案 1 :(得分:0)

我正在64位系统上运行所有程序,但仍然没有任何效果。 所以我设法解决了这个问题:

IntPtr wow64Value = IntPtr.Zero;
        try
        {
            Wow64Interop.DisableWow64FSRedirection(ref wow64Value);
            ProcessStartInfo psi1 =
        new ProcessStartInfo("cmd.exe");

            psi1.UseShellExecute = false;
            psi1.RedirectStandardOutput = true;
            psi1.RedirectStandardInput = true;
            psi1.CreateNoWindow = true;
            psi1.Verb = "runas";


            Process ps1 = Process.Start(psi1);
            ps1.EnableRaisingEvents = true;
            StreamWriter inputWrite1 = ps1.StandardInput;

            // uses extra cheap logging facility
            inputWrite1.WriteLine("chcp 437");
            inputWrite1.WriteLine("rstrui.exe");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Unabled to disable/enable WOW64 File System Redirection");
            Console.WriteLine(ex.Message);
        }
        finally
        {
            // 3. Let the Wow64FSRedirection with its initially state
            Wow64Interop.Wow64RevertWow64FsRedirection(wow64Value);
        }

要启用它:

public class Wow64Interop
    {
        const string Kernel32dll = "Kernel32.Dll";

        [DllImport(Kernel32dll, EntryPoint = "Wow64DisableWow64FsRedirection")]
        public static extern bool DisableWow64FSRedirection(ref IntPtr ptr);

        [DllImport(Kernel32dll, EntryPoint = "Wow64RevertWow64FsRedirection")]
        public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
    }