【问题标题】:Why can't my ASP.NET web service kick off a process, but my .NET console app can?为什么我的 ASP.NET Web 服务不能启动进程,但我的 .NET 控制台应用程序可以?
【发布时间】:2009-12-04 14:23:42
【问题描述】:

这是来自类库的代码:

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 中的标签进行模拟。

【问题讨论】:

  • 您没有指定 CmdPath 的作用——如果它要求用户输入,它会在那里等待很长时间!尝试使用 Process Explorer 查看该外部进程中实际运行的内容。
  • 对于您的 Edit2:通常在这种情况下,我看到人们只为需要此访问权限的呼叫模拟身份,显然呼叫者提供的所有 Windows 身份都无法访问您的服务器,所以理想情况下,您只想模拟调用您的 exe 而不是在 web.config 级别模拟 - 请参阅:blogs.msdn.com/shawnfa/archive/2005/03/21/400088.aspx - 不模拟运行 - 仅对启动进程的代码块使用模拟然后去恢复正常。
  • @bnkdev:我很快实现了这一点,并尝试使用 INTERACTIVE 调用库。仍然收到 AccessViolation 错误。此时,它可能是我试图调用的程序。使用模拟令牌向 AD 进行身份验证是否存在陷阱?
  • @bnkdev:这让我回到了第一轮——只是无限期地挂起。这个过程通常只需要几秒钟。
  • 好吧,让我看看其中一位开发人员在内部编写的一些代码,我 99% 确定他正在做你正在做的事情,尽管我们都建议他不要这样做,他没有办法。

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


【解决方案1】:

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

【讨论】:

  • +1 表示“在服务器端启动可执行文件可能不是一个好主意”
  • 我们实际上从来没有得到这个工作,但这显然是正确的道路。您是上面的 cmets 在研究解决方案方面非常有帮助。选票也不会说谎,所以我将其标记为解决方案。谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这可能是权限问题。 ASPNET 服务可能对可执行文件具有权限,但它对可执行文件所做的一切都具有权限。

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

    如果您需要解决此问题,您可以使用模拟,或指定网站在 IIS 中的不同帐户下运行,但这些不是推荐做法,而且在大多数情况下会带来更多麻烦。

    【讨论】:

      【解决方案4】:

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

      有两种主要的前进方式:

      1. 为 asp.net 进程提供更多权限。请参阅 This Link 以获得有关如何执行此操作的详细说明。
      2. 让 asp.net 在具有更多权限的帐户下运行。请参阅 This Link 以获得很好的解释以及如何让该进程在不同的帐户下运行。

      任何一个都适合你。

      【讨论】:

      • 我喜欢第 2 项中定义的内容。如果将其更改为 SYSTEM,会带来什么样的安全问题?这将位于内部公司网络服务器上。
      • 嗯,这肯定会奏效。它位于内部公司网络服务器上意味着这样做只是不好的做法,而不是真正的疯狂。 :) 没有比留下 dev db sa 帐户密码 sa 更糟糕的了。为了确认冒充具有扩展权限的帐户可以做到这一点,是的,就这样做。但从长远来看,如果我不为此创建一个新帐户,我会感到很肮脏。你甚至可以给它超级权限,但以后可以缩小它。如果有人问你是怎么做到的,说“我创建了一个新帐户”听起来比“我给它系统”更好。
      【解决方案5】:

      当您重定向标准输出时,您不需要使用 ReadToEnd 来读取来自 StandardOutput 的响应吗?

      【讨论】:

      • 不,如果我将它映射到 StreamReader 并一次通过一行,效果会很好。
      【解决方案6】:

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

      【讨论】:

      • 用VS内置的web服务器试过了。工作得很好。我假设这一直在使用我的凭据。我认为这证明它 ASP .NET 的错,更具体地说是我通过 ASP .NET 冒充...
      • ASP.NET 在有限的用户权限下工作是错误的。这不是 ASP.NET 的错,这是您的应用程序需要更多权限的问题。
      【解决方案7】:

      与其模拟或给予 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);
      

      【讨论】:

      • 刚刚使用我的用户名尝试了此操作,但程序无法登录。
      • 我已更新示例以说明如何构建安全字符串。还添加了额外的重定向。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多