C# cannot find file specified
Hi I am try开发者_运维知识库ing to create a app that uses the msg.exe to send messages over a network.
When i execute msg from cmd everything works fine, but when i open cmd with the form i am unable to, went to the system32 folder with cmd and the file is not shown there, but when i browse or use cmd normally it is and evrything works
tested it on another computer and app works fine, running win 7 64 bit on this 1.
Here is a code sample that i use to open cmd:
Process.Start("cmd");
i am running as admin i have tried executed it directly from msg.exe aswell, it seems to be a problem on 64 bit works on all 32 bit systems but not on any 64bit
edit: ok i found the problem when running 64bit 32 bit applications cannot run 64 bit apps in the system 32 folder. when trying to access this folder it redirects you to %WinDir%\SysWOW64 a work around is to use this path C:\Windows\Sysnative\file (%windir%\Sysnative)
The solution mentioned in the question was what did the trick for me - posting testable solution here for posterity:
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; }
}
Do you need to use cmd at all? Why not use Process.Start to call msg.exe directly. If you know where it is, you should be able to run it.
If you are in an app, you are probably better off executing "msg" directly
Process.Start("msg");
or
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);
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();
You may need to set the "Username" and "Password" for the StartInfo of the process.("msg.exe" is residing in a system folder and the user running the code not having the appropriate permissions to run from that folder.)
Perhaps you shoud check the "target platform" to build to. On my 64-bit win7 pc, I should choose "x64" or "Any CPU" to let my code to find "msg.exe".
On some Windows editions (e.g. Home, not Professional/Business etc.) msg.exe is not included.
精彩评论