C# 为什么可以';我的ASP.NET web服务启动了一个进程,但我的.NET控制台应用程序可以吗?

C# 为什么可以';我的ASP.NET web服务启动了一个进程,但我的.NET控制台应用程序可以吗?,c#,.net,asp.net,web-services,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(); proc.StartInfo=newproces

这是类库中的代码:

proc.StartInfo = new ProcessStartInfo(CmdPath, "+an -b"); proc.StartInfo.RedirectStandardOutput = true; proc.StartInfo.CreateNoWindow = true; proc.StartInfo.UseShellExecute = false; proc.Start(); proc.WaitForExit(); proc.StartInfo=newprocessstartinfo(CmdPath,“+an-b”); proc.StartInfo.RedirectStandardOutput=true; proc.StartInfo.CreateNoWindow=true; proc.StartInfo.UseShellExecute=false; proc.Start(); 进程WaitForExit(); 这与我从控制台测试应用程序调用时所期望的一样完美。当我使用相同的库并从ASP.NETWeb服务调用该方法时,它只是挂起

这里有我遗漏的东西吗?ASPNET服务可以访问EXE所在的文件夹,我看到它在任务管理器中运行,尽管它没有做任何事情

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

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


编辑2:好的,现在客户端出现访问冲突问题。这显然是一件好事。如果软件使用集成广告授权,并且我模拟我的广告帐户,这是否足够?我正在使用web.config中的标记进行模拟。

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

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

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

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

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


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

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

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

有两种主要的前进方式:

  • 为asp.net进程提供更多特权。有关如何执行此操作的详细说明,请参阅
  • 让asp.net在具有更多特权的帐户下运行。有关详细说明以及如何使该进程在其他帐户下运行的信息,请参阅

  • 这两种方法都适用于您。

    与其模拟或授予Asp.net更多权限,不如使用不同的凭据启动该进程。 在下面的示例中,UserWithVeryLimitDrights将是您创建的一个新帐户,您只需拥有足够的权限即可运行该应用程序。 这样做可以将安全风险降至最低

    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);
    

    您没有指定CmdPath的作用-如果它请求用户输入,它将在那里停留很长时间!尝试使用Process Explorer查看外部进程中实际运行的内容。对于您的Edit2:通常在这种情况下,我看到人们仅为需要此访问权限的呼叫模拟身份,显然是所有用户的身份调用者提供的windows标识在您的服务器上没有访问权限,因此理想情况下,您希望只对调用exe的调用进行模拟,而不是在web.config级别进行模拟-请参见:-在不进行模拟的情况下运行-仅对启动进程的代码块使用模拟,然后返回正常状态。@bnk戴夫:我很快实现了这一点,并尝试使用INTERACTIVE调用库。仍然会出现AccessViolation错误。此时,可能是我尝试调用的程序。是否有使用模拟令牌向AD进行身份验证的方法?@bnkdev:这让我回到了第一轮-只是无限期挂起。该过程只需要一个小时正常情况下几秒钟。好吧,让我看看一个开发人员内部编写的一些代码,我99%确定他正在做你正在做的事情,尽管我们都建议他不要这样做,但他没有追索权。+1表示“在服务器端启动可执行文件可能不是一个好主意”事实上,我们从来没有这样做过,但这显然是一条正确的道路。你上面的评论对研究解决方案非常有帮助。投票结果也不会说谎,所以我会将其标记为解决方案。谢谢。不,如果我将其映射到StreamReader并一次通过一条线,效果就很好。我喜欢第2条中的定义。什么是k如果将其更改为SYSTEM?Th,是否会引发安全问题