为什么我的ASP.NET Web服务无法启动进程,但我的.NET控制台应用程序可以?

时间:2009-12-04 14:23:42

标签: c# .net asp.net web-services

这是来自类库的代码:

proc.StartInfo = new ProcessStartInfo(CmdPath, "+an -b");
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
proc.WaitForExit();

从控制台测试应用程序调用时,这可以完美地运行。当我使用相同的库并从ASP .NET Web服务调用该方法时,它就会挂起。

我在这里缺少什么,也许权限? ASPNET服务可以访问EXE所在的文件夹,我看到它在任务管理器中运行,但它没有做任何事情。

如果有人能告诉我我做错了什么,我将不胜感激。感谢。

编辑:抱歉缺少信息。 CmdPath转到我们的调度软件的命令行界面。我根据他们提供的文档传递命令。我有一种获取作业列表的方法,以及另一种运行作业的方法。 ......嗯想法。客户端通常使用Active Directory登录,我认为模仿是必要的。现在去测试。

编辑2 :好的,现在客户端正在解决AccessViolation问题。这显然是权限的事情。如果软件使用集成的AD授权,并且我冒充我的AD帐户,那就足够了吗?我正在使用web.config中的标记进行模拟。

7 个答案:

答案 0 :(得分:10)

我认为使用ASPNET标识启动可执行服务器端会遇到很多问题,您是否尝试使用适当的priveleges 模仿身份(这确实有效),但是再次启动可执行文件从服务器端开始可能不是一个好主意。

答案 1 :(得分:3)

ASP.Net用户帐户可能没有执行权限。您能否提供更多信息,说明为什么要尝试这样做,因为可能有更好的方法。

答案 2 :(得分:2)

这可能是权限问题。 ASPNET服务可能具有可执行文件的权限,但它具有可执行文件所有功能的权限。

例如,如果可执行文件复制文件,ASPNET帐户是否拥有这些文件的源和目标路径的完全权限?需要询问可执行文件所做的所有事情。

如果您需要解决此问题,可以使用模拟,或者指定网站在IIS中的其他帐户下运行,但这些不是推荐的做法,而且在大多数情况下比它们的价值更麻烦。< / p>

答案 3 :(得分:2)

默认情况下,ASP.NET辅助进程的安全性低于大多数本地帐户(当然是开发人员使用的帐户或服务器上登录的帐户。)

前进有两种主要方式:

  1. 为asp.net进程提供更多权限。有关如何执行此操作的详细说明,请参阅This Link
  2. 让asp.net在具有更多权限的帐户下运行。有关详细说明以及如何在其他帐户下运行该流程,请参阅This Link
  3. 要么适合你。

答案 4 :(得分:0)

重定向标准输出时,是否需要使用ReadToEnd读取StandardOutput的响应?

答案 5 :(得分:0)

您可能应该检查您的可执行文件执行的内容,因为ASP.NET在具有有限权限的用户(IIS 6.0上的NETWORK SERVICE)下工作,并且您的可执行文件也获得此权限并在同一用户下运行。至于你等待它完成它的工作,你可能运行的可执行文件可能有些错误。我建议你做一个简单的实验 - 将你的WebApplication切换到VS web服务器内置,称为“Casini”并检查你的代码行为。通过这种方式,您可以证明自己不是ASP.NET的错。如果我是对的,您唯一需要做的就是调查可执行文件的问题并确定它需要什么权限。

答案 6 :(得分:0)

而不是模仿或给予Asp.net更多权限,如何在不同凭据下启动流程。 在下面的示例中,UserWithVeryLimitedRights将是您创建的新帐户,只具有运行应用程序的权限。 这样做可以最大限度地降低安全风险。

ProcessStartInfo StartInfo = new ProcessStartInfo();
SecureString ss = new SecureString();
string insecurePassword = "SomePassword";

foreach(char passChar in insecurePassword.ToCharArray()) {
ss.AppendChar(passChar);
}

StartInfo.RedirectStandardInput = true;
StartInfo.RedirectStandardError = true;
StartInfo.RedirectStandardOutput = true; 

StartInfo.CreateNoWindow = true;
StartInfo.UseShellExecute = false;
StartInfo.Password = ss;
StartInfo.UserName = @"UserWithVeryLimitedRights";
StartInfo.FileName = @"c:\winnt\notepad.exe";
Process.Start(StartInfo);