4

我在 tscon 上的 Process.Start 中收到“系统找不到指定的文件异常”

在职的:

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

该文件是否有一些硬化?无法理解这...

4

2 回答 2

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\"";
于 2012-06-07T12:45:52.120 回答
2

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

如果您使用 Process Monitor 观看,您会发现它实际上是在 C:\Windows\SysWOW64\ 而不是 C:\Windows\system32\ 中查找文件,因为文件系统重定向和您的程序是 32 位进程。

解决方法是针对 x64 而不是 Any CPU 进行编译,或者使用 P/Invoke 暂时怀疑并使用Wow64DisableWow64FsRedirection和 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);
}
                        }
于 2015-03-23T14:56:43.983 回答