系统无法在Process Start(tscon.exe)中找到指定Exception的文件

时间:2012-06-07 07:31:56

标签: c# process

我在tscon上的Process.Start中收到“系统无法找到指定Exception的文件”

工作:

Process.Start(new ProcessStartInfo(@"c:\Windows\System32\notepad.exe", "temp.txt"));

不工作:

Process.Start(new ProcessStartInfo(@"c:\Windows\System32\tscon.exe", @"0 /dest:console"));

我需要tscon.exe。 为什么我会收到此错误?

编辑:

  1. 已验证tscon.exe确实位于c:\Windows\System32文件夹中。
  2. 我以管理员模式运行VS
  3. 该文件有些强化吗?无法理解这一点...

2 个答案:

答案 0 :(得分:7)

哦,这件事真的引起了我的注意 我终于设法从Process.Start启动tscon.exe 您需要传递“管理员”帐户信息,否则会收到“找不到文件”错误。

以这种方式行事

ProcessStartInfo pi = new ProcessStartInfo();
pi.WorkingDirectory = @"C:\windows\System32"; //Not really needed
pi.FileName = "tscon.exe";
pi.Arguments = "0 /dest:console";
pi.UserName = "steve";
System.Security.SecureString s = new System.Security.SecureString();
s.AppendChar('y');
s.AppendChar('o');
s.AppendChar('u');
s.AppendChar('r');
s.AppendChar('p');
s.AppendChar('a');
s.AppendChar('s');
s.AppendChar('s');
pi.Password = s;
pi.UseShellExecute = false; 
Process.Start(pi);

还要看到命令的结果改变以下两行

pi.FileName = "cmd.exe";
pi.Arguments = "/k \"tscon.exe 0 /dest:console\"";

答案 1 :(得分:1)

虽然看起来你很久以前就找到了解决方法,但我会解释为什么会出现这个问题以及可以说是更好的解决方案。我遇到了与shadow.exe相同的问题。

如果你使用Process Monitor观看,你会发现它实际上是在C:\ Windows \ SysWOW64 \而不是C:\ Windows \ system32 \中寻找文件,因为{{3}并且您的程序是32位进程。

解决方法是编译x64而不是Any CPU或使用P / Invoke临时怀疑并重新启用带有File System Redirection和Wow64RevertWow64FsRedirection Win API函数的文件系统重定向。

internal static class NativeMethods
{
    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);
}

////////////////

IntPtr wow64backup = IntPtr.Zero;
if (!Environment.Is64BitProcess && Environment.Is64BitOperatingSystem)
{                            
    NativeMethods.Wow64DisableWow64FsRedirection(ref wow64backup);
}

Process.Start(new ProcessStartInfo(@"c:\Windows\System32\tscon.exe", @"0 /dest:console"))

if (!Environment.Is64BitProcess && Environment.Is64BitOperatingSystem)
{
    NativeMethods.Wow64RevertWow64FsRedirection(wow64backup);
}
                        }