C# Process.Start for system32应用程序-系统找不到指定的文件

C# Process.Start for system32应用程序-系统找不到指定的文件,c#,.net,process,windows-8.1,system32,C#,.net,Process,Windows 8.1,System32,我已经用WPF为Windows 8.1系统编写了一个简单的自定义shell应用程序。它的功能很好,但是我需要在注册表的Run部分启动一些应用程序。很好,但是,无论我尝试什么,它们都不会启动,我收到一个错误:“系统找不到指定的文件。” 这是为64位系统设计的,所以我听说使用C:\Windows\Sysnative\作为路径而不是C:\Windows\System32\是一种修复方法,但它不起作用。我的代码如下: Process processToStart = new Process {

我已经用WPF为Windows 8.1系统编写了一个简单的自定义shell应用程序。它的功能很好,但是我需要在注册表的Run部分启动一些应用程序。很好,但是,无论我尝试什么,它们都不会启动,我收到一个错误:“系统找不到指定的文件。”

这是为64位系统设计的,所以我听说使用C:\Windows\Sysnative\作为路径而不是C:\Windows\System32\是一种修复方法,但它不起作用。我的代码如下:

Process processToStart = new Process 
{ 
    StartInfo = 
    { 
        FileName = @"C:\Windows\Sysnative\hkcmd.exe", 
        WorkingDirectory = @"C:\Windows\Sysnative\") 
    }
};
processToStart.Start();

不确定这些是否是您的问题的原因,但根据您在问题中发布的示例,请注意以下几点:

  • StartInfo.FileName应仅包含文件名,而不包含路径
  • 如果您试图执行hkcmd.exe,则将其编写为hkcmnd.exe(额外N)
  • 在上面的示例中,我认为重复指定文件名和workingdirectory会导致找不到文件。及

    Sysnative在我的计算机(Win 7 x64)上不存在,它可能在Windows 8中

    我无法让hkcmd.exe执行,它也抛出了一个错误,但是,执行cmd.exe和notepad.exe是可以的

    示例代码:

    System.Diagnostics.Process processToStart = new System.Diagnostics.Process();
    processToStart.StartInfo.FileName = "cmd.exe"; //or notepad.exe
    processToStart.StartInfo.WorkingDirectory = @"C:\Windows\System32\";
    processToStart.Start();
    

    我发现让它工作的方法是禁用WOW64文件系统重定向。似乎没有别的办法了。
    通过此链接:


    是的,刚刚删掉了多余的n。那是个错误,很抱歉。我刚刚尝试了Environment.GetFolderPath(Environment.SpecialFolder.System)+@“\hkcmd.exe”),它的结果是C:\Windows\system32\hkcmd.exe,但是当我执行一个file.exists时,即使该文件存在于该目录中,它也会显示为负值。超级奇怪。@Giallo不用担心D您可以尝试此处指定的修复程序吗?:这也适用于hkcmd以外的其他程序:System.IO.Directory.SetCurrentDirectory(@“C:\Windows\System32\”);System.Diagnostics.Process.Start(“cmd.exe”);我刚刚尝试了你的确切代码,用hkcmd.exe替换了cmd.exe,但我仍然得到了异常。尽管如此,cmd.exe仍然可以工作。特别是hkcmd.exe,由于某些原因无法启动。我怀疑(我无法在设置中测试以确认)该问题与我在评论中附加的SO链接类似。不过我不确定。(编辑:刚刚意识到我是个傻瓜,粘贴了错误的链接)这一条:这是我无法理解的,因为我不能从这里进行太多测试,祝你好运!似乎是权限问题。另一种方法是找到一种启动admin隐藏cmd.exe的方法,该命令将调用并运行hkcmd。我已通过admin cmd手动启动hkcmd进程(显示在任务管理器上)。请注意,当存在嵌套调用时,“Wow64EnableWow64FsRedirection”方法可能无法正常工作,因此您应该改用“Wow64DisableWow64FsRedirection”。刚刚写了一篇文章,介绍了如何使用C#从System32目录运行任何应用程序:
    [DllImport("Kernel32.Dll", EntryPoint="Wow64EnableWow64FsRedirection")]
    public static extern bool EnableWow64FSRedirection(bool enable);
    
    Wow64Interop.EnableWow64FSRedirection(false)
    Process processToStart = new Process 
    { 
        StartInfo = 
        { 
            FileName = @"C:\Windows\Sysnative\hkcmd.exe", 
            WorkingDirectory = @"C:\Windows\Sysnative\") 
        }
    };
    processToStart.Start();
    Wow64Interop.EnableWow64FSRedirection(true)