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);

また、コマンドの結果を確認するには、次の 2 行を変更します

pi.FileName = "cmd.exe";
pi.Arguments = "/k \"tscon.exe 0 /dest:console\"";
于 2012-06-07T12:45:52.120 に答える
2

ずいぶん前に回避策を見つけたようですが、問題が発生する理由とおそらくより良い解決策について説明があります。shadow.exe で同じ問題に遭遇しました。

Process Monitor で監視すると、ファイル システム リダイレクトとプログラムが 32 ビット プロセスであるため、実際には C:\Windows\system32\ ではなく C:\Windows\SysWOW64\ でファイルを探していることがわかります。

回避策は、任意の CPU ではなく x64 用にコンパイルするか、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 に答える