System.Diagnostics.Process not working !! please help

N

Nurit N

This is the third newsgroup that I'm posting my problem.
I'm sorry for the multiple posts but the matter becoming urgent.

I hope this is the right place for it...



I have created a very simple batch file (echo hello world) and was trying to
retrieve the standard output but every time I run the code it returns
ExitCode as 1.

The batch file runs just fine from command line.

There is no Win32Exception (no ERROR_FILE_NOT_FOUND and no
ERROR_ACCESS_DENIED)

Also strOutput and strError returns empty.

What ExitCode1 means?

Am I missing on something?

Here is the code:

try
{
System.Diagnostics.Process MFGProc = new System.Diagnostics.Process();
MFGProc.StartInfo.FileName = strMfgWorkDir + strMfgBatFile;
MFGProc.StartInfo.WorkingDirectory = strMfgWorkDir;
MFGProc.StartInfo.UseShellExecute = false;
MFGProc.StartInfo.RedirectStandardError = true;
MFGProc.StartInfo.RedirectStandardOutput = true;
MFGProc.Start();

string strOutput = MFGProc.StandardOutput.ReadToEnd();
string strError = MFGProc.StandardError.ReadToEnd();
MFGProc.WaitForExit();

if (MFGProc.ExitCode == 0)
{
Ok = true;
}
else
{
strErrorMsg = " Running failed. Description: " + strError;
}
}
catch (Win32Exception e)
{
strErrorMsg = "W32 Error:" + e.NativeErrorCode.ToString() + "." +
e.Message ;
}

catch (Exception err)
{
// Process other errors here
strErrorMsg = ("RunMFGCimSession Other error. ErrorMessage: " +
err.Message );
}

Thanks

Nurit
 
A

Abubakar

Hi,
I just tried your code and it works fine ( with a lil modification) for me,
the strOutput gets the right output. I'm pasting the code here and you check
it works for you or not. Make a new console application and past the code
there:

//--------------<code>
using System;

using System.Diagnostics;
using System.ComponentModel;

namespace ConsoleApplication1
{

class csomething
{
public static void Main()
{
csomething c = new csomething();
c.dosomething();

}
public void dosomething()
{

try
{
System.Diagnostics.Process MFGProc = new System.Diagnostics.Process();
MFGProc.StartInfo.FileName =
AppDomain.CurrentDomain.BaseDirectory+@"bat.bat"; //strMfgWorkDir +
strMfgBatFile;
MFGProc.StartInfo.WorkingDirectory =
AppDomain.CurrentDomain.BaseDirectory;
//@"D:\mycode\ConsoleApplication1\ConsoleApplication1\bin";
MFGProc.StartInfo.UseShellExecute = false;
MFGProc.StartInfo.RedirectStandardError = true;
MFGProc.StartInfo.RedirectStandardOutput = true;
MFGProc.Start();

string strOutput = MFGProc.StandardOutput.ReadToEnd();
string strError = MFGProc.StandardError.ReadToEnd();
MFGProc.WaitForExit();

if (MFGProc.ExitCode == 0)
{
//Ok = true;
Console.Write("no problem");

}
else
{
//strErrorMsg = " Running failed. Description: " + strError;
Console.Write("some problem");
}
}
catch (Win32Exception e)
{
Console.Write("W32 Error:" + e.NativeErrorCode.ToString() + "." +
e.Message);
}

catch (Exception err)
{
// Process other errors here
Console.Write("RunMFGCimSession Other error. ErrorMessage: " +
err.Message);
}

}

}//class

}

//--------------</code>

make a batch file in your debug bin directory and name it bat.bat and use
notepad to add the "echo hello world" in it.

-Abubakar.

++==
P.S: when pasting your code for others to run, make sure its complete in a
way that anyone can just copy and past it in the editor and it would give
the output that your writing about. Your code had missing variables and
missing using statements. It takes time to change those things and chances
for your getting help reduces. So always submit the complete working code.
Plz read this link http://www.pobox.com/~skeet/csharp/complete.html
-Thanks
 
N

Nurit N

Thanks for your replay.

I tried the code you sent me and it's working for me as well.

The different (and I'm sorry not to mentioned that before) that I'm running
on a web service application.

My program supposes to start the CMD on the server.

Any Idea?
 
A

Abubakar

You must be having permissions problem. You need to give approriate
permissions to the directory that you are trying to access on the harddrive
from the virtual directory. You can right click the directory where your
batch file is and goto the "security" tab, add the ASPNET user in it and
give appropriate permissions. Although this would be insecure i beleive but
first try this.

I created a new web appplication to do this in visual studio 2k5, but have
no problems running this code. What exact error do u get when you run this
code?

Ab.
 
N

Nurit N

Thank u again a lot for your replays.

I couldn't add ASPNET user. Gave me: "An object named "ASPNET" cannot be
found."

So I added the EVERYONE user instead for directory and sub-directory and CMD
file it self and gave it full control.

I didn’t get any error just ExitCode equals 1.

What does it mean?

In a log file on run time I got:



MFGProc.Start();

MFGProc.HasExited: False
MFGProc.Id: 8096
MFGProc.MachineName: .
MFGProc strOutput:

MFGProc strError:

MFGProc.WaitForExit();
MFGProc.ExitCode: 1
 
A

Abubakar

I cant figure out why are you getting that message. My process starts and
exits very fast and my exit code is always 0. What is that log file that you
are viewing, who creats that file?

Ab.
 
N

Nurit N

Because I'm running a web service I'm writing on run time to txt file to
debug the program.

Do u have any idea why i don't have ASPNET user on my server?

This is the full function that starts the process:



private bool RunMFGCimSession (string strFileName)

{

bool Ok = false;

try

{

dbg = File.AppendText("c:\\temp\\1web.txt");

dbg.WriteLine(" In RunMFGCimSession.");

dbg.Close();



dbg = File.AppendText("c:\\temp\\1web.txt");

dbg.WriteLine(" MFGProc 2: " + strMfgWorkDir +
strMfgBatFile);

dbg.Close();



System.Diagnostics.Process MFGProc = new
System.Diagnostics.Process();

MFGProc.StartInfo.FileName = strMfgWorkDir +
strMfgBatFile;

MFGProc.StartInfo.WorkingDirectory = strMfgWorkDir;

MFGProc.StartInfo.UseShellExecute = false;

MFGProc.EnableRaisingEvents = false;

MFGProc.StartInfo.RedirectStandardError = true;

MFGProc.StartInfo.RedirectStandardOutput = true;

MFGProc.Start();



dbg = File.AppendText("c:\\temp\\1web.txt");

dbg.WriteLine(" MFGProc.HasExited: " +
MFGProc.HasExited);

dbg.WriteLine(" MFGProc.Id: " + MFGProc.Id);

dbg.WriteLine(" MFGProc.MachineName: " +
MFGProc.MachineName);

dbg.Close();





string strOutput =
MFGProc.StandardOutput.ReadToEnd();

string strError = MFGProc.StandardError.ReadToEnd();



dbg = File.AppendText("c:\\temp\\1web.txt");

dbg.WriteLine(" MFGProc strOutput: " + strOutput + "
MFGProc strError: " + strError);

dbg.Close();



MFGProc.WaitForExit();



dbg = File.AppendText("c:\\temp\\1web.txt");

dbg.WriteLine(" MFGProc.ExitCode: " +
MFGProc.ExitCode);

dbg.Close();



if (MFGProc.ExitCode == 0)

{

Ok = true;

}

else

{

strErrorMsg = "RunMFGCimSession error: Running
MFG failed. Description: " + strError;

}



}

catch (Win32Exception e)

{

strErrorMsg = "W32 Error:" +
e.NativeErrorCode.ToString() + "." + e.Message ;

}

catch (Exception err)

{

// Process other errors here

strErrorMsg = ("RunMFGCimSession Other error.
ErrorMessage: " + err.Message );

}

return Ok;

}
 
A

Abubakar

Why do you want to write all this to the txt file when you can easily step
in the source at the debugger?

ASPNET should be created when the asp.net installs. Its local machine
account, you can try, yourmachinename\ASPNET. I dont know why its not there
in your system.

Since you are already writing to the txt file you already have the rights to
write on the harddrive directly so the permissions thing I wrote about is
not applicable here.

I have tried the source on web application, web service, console, and all
work fine. If you can try to run the same thing on some other machine that
may give you some idea of what the problem is.

Ab.
 
G

Guest

Nurit N said:
Do u have any idea why i don't have ASPNET user on my server?

If you're running on Windows Server 2003, ASP.NET runs under the "Network
Service" account. Is that the case?
 
N

Nurit N

Thanks, that's correct :)
Any way I'm trying to run under other server now (Windows Server 2003)....
 
N

Nurit N

It's working now on the new server. I don't know what the problem was...

Very strange...

I want to thank you very much for the time and efforts :)
 
Top