当我在控制台应用程序中运行System.Diagnostics.Process.Start
时它可以正常工作,但是当我从托管在IIS中的Web服务中运行相同的代码时却无法正常工作。
这是不是与ASP.Net权限有关?如果是,如何从我的C#代码中进行配置。
ASP.NET网页和服务器控件代码在Web服务器的ASP.NET工作进程上下文中执行。如果您在ASP.NET网页或服务器控件中使用Start方法,则新进程以受限权限在Web服务器上执行。该进程不会在客户端浏览器相同的上下文中启动,并且无法访问用户桌面。 http://msdn.microsoft.com/en-us/library/0w4h05yb.aspx
或允许ASP.NET工作进程在SYSTEM帐户中运行。
按照以下步骤进行配置:
a. 打开控制面板并执行以下步骤: 对于Windows NT:单击“服务”。 对于Windows 2000、Windows XP和.NET Server:单击“管理工具”,然后单击“服务”。
b. 双击“IIS管理服务”。
我曾尝试过其他解决方案,但对我没有用。我需要的是,一个命令应该通过Windows命令提示符以管理员身份运行。 以下是未能执行的代码:
Process sysProcess = new Process();
sysProcess.StartInfo.FileName = "cmd.exe";
sysProcess.StartInfo.Verb = "runas";
sysProcess.StartInfo.CreateNoWindow = true;
sysProcess.StartInfo.RedirectStandardInput = true;
sysProcess.StartInfo.RedirectStandardOutput = true;
sysProcess.StartInfo.RedirectStandardError = true;
sysProcess.StartInfo.UseShellExecute = false;
sysProcess.Start();
sysProcess.StandardInput.WriteLine("cal.exe");
sysProcess.StandardInput.Flush();
sysProcess.StandardInput.Close();
//localProcess.WaitForExit();
sysProcess.StandardOutput.ReadToEnd();
如果您的应用程序正在运行Windows 7,则无法进行通信。基本上,服务运行会话0,用户桌面运行会话1,因此您无法从会话0通信到会话1。即使您尝试从Win登录进程(用于为每个新用户启动用户会话)进行通信,也无法获取某些本地信息(例如浏览器设置,如本地存储信息)。
对我而言,像这样的代码是有效的:
ProcessStartInfo psi = new ProcessStartInfo();
psi.UseShellExecute = true;
psi.LoadUserProfile = true;
psi.WorkingDirectory = sender.Server.MapPath("../");// This line solved my problem
psi.FileName = sender.Server.MapPath("../myexecutable.exe");
psi.Arguments = "Myargument1 Myargument2";
Process.Start(psi);
`