C # не может найти указанный файл - PullRequest
3 голосов
/ 13 января 2011

Привет! Я пытаюсь создать приложение, которое использует msg.exe для отправки сообщений по сети.

Когда я запускаю msg из cmd, все работает нормально, но когда я открываю cmd с формой, которую я не могу, перехожу в папку system32 с cmd, и файл там не отображается, но когда я обычно просматриваю или использую cmd, это есть и все работает

проверил его на другом компьютере, и приложение работает нормально, запустив win 7 64 bit на этом 1.

Вот пример кода, который я использую для открытия cmd:

Process.Start("cmd");

Я работаю как администратор. Я пытался выполнить его напрямую из msg.exe, похоже, это проблема 64-битных систем на всех 32-битных системах, но не на 64-битных

.

edit: ok Я обнаружил проблему, когда 64-битные 32-битные приложения не могут запускать 64-битные приложения в системной папке 32. при попытке доступа к этой папке он перенаправляет вас в% WinDir% \ SysWOW64, а обходной путь - использовать этот путь C: \ Windows \ Sysnative \ file (% windir% \ Sysnative)

Ответы [ 6 ]

2 голосов
/ 18 июня 2013

Решение, упомянутое в вопросе, заключалось в том, что помогло мне - опубликовать тестируемое решение для потомков:

public class Messenger : IMessenger
{
    private readonly IProcessWrapper _process;

    public Messenger(IProcessWrapper process)
    {
        _process = process;
    }

    public void SendMessage(string message)
    {
        var info = new ProcessStartInfo
            {
                WorkingDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "sysnative"),
                FileName = "msg.exe",
                Arguments = string.Format(@" * ""{0}""", message),
                WindowStyle = ProcessWindowStyle.Hidden,
                UseShellExecute = true,
                Verb = "runas"
            };
        _process.Start(info);
    }
}


public interface IProcessWrapper : IDisposable
{
    IEnumerable<Process> GetProcesses();
    void Start(ProcessStartInfo info);
    void Kill();

    bool HasExited { get; }
    int ExitCode { get; }
}
1 голос
/ 13 января 2011
Process p = new Process();
System.Diagnostics.ProcessStartInfo sinfo = new System.Diagnostics.ProcessStartInfo("C:\\Windows\\System32\\msg.exe");
p.StartInfo.Arguments=String.Format("/server:{0} {1} {2}",toServer,string.Compare(toUser.Trim(), "") == 0 ? "*" : toUser,message);
p.StartInfo = sinfo;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = "msg.exe";
p.Start();

Возможно, вам потребуется установить «Имя пользователя» и «Пароль» для StartInfo процесса. («Msg.exe» находится в системной папке, а пользователь, запускающий код, не имеет соответствующих прав для запуска из этого папка.)

1 голос
/ 13 января 2011

Если вы находитесь в приложении, вам, вероятно, лучше выполнить "msg" напрямую

Process.Start("msg");

или

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "msg.exe";
startInfo.Arguments = "/SERVER hellowword";
startInfo.WorkingDirectory = @"C:\Temp";
startInfo.WindowStyle = ProcessWindowStyle.Maximized;
startInfo.ErrorDialog = true;
Process process = Process.Start(startInfo);
1 голос
/ 13 января 2011

Нужно ли вообще использовать cmd?Почему бы не использовать Process.Start для непосредственного вызова msg.exe.Если вы знаете, где он находится, вы сможете запустить его.

0 голосов
/ 11 сентября 2013

Возможно, вам стоит проверить "целевую платформу", на которую вы хотите построить. На моем 64-битном компьютере с win7 я должен выбрать «x64» или «Любой процессор», чтобы мой код нашел «msg.exe».

0 голосов
/ 13 января 2011

В некоторых выпусках Windows (например, Домашняя, не Профессиональная / Бизнес и т. Д.) Msg.exe не входит.

...