需要在ASP.net中从服务器执行*.exe文件

20

我目前的情况是需要在托管ASP.net/C# API的远程服务器上执行一个可以创建本地.txt文件的exe文件。我创建了一个本地用户(假设为userA)作为管理员来运行远程服务器上的Web服务,但.txt文件没有被创建。我已经检查并授予了必要的文件夹权限给userA,并将该用户添加到各种组中。有趣的是,如果我以userA身份登录远程系统,则exe程序可以按预期执行。如果我退出登录,则执行失败。服务器是Win Server 2008,带有IIS 7。感谢任何帮助。

更新:我已解决该问题,并在此处发布了答案和几个相关问题的链接。简而言之,我需要在IIS应用程序池中设置“加载用户配置文件”为true。

感谢所有人的贡献

编辑:从评论中提取的代码

Process proc = new Process(); 
proc.StartInfo.FileName = path; 
proc.StartInfo.Arguments = exeparams; 
proc.Start(); 
proc.WaitForExit(); 
stat = proc.ExitCode; 
if (stat != 0) 
{ 
    throw new Functions.log("Error"); 
} 

FYI:这不是让代码调用进程的问题。问题在于只有当IIS用户手动登录并保持远程系统登录状态时,*.exe才会被执行,而在调用API时则不会。 - santhosh.v
请把你目前正在使用的代码粘贴出来,我很想看看你是怎样尝试编写回应的... - beyond-code
这听起来像是一个IIS身份验证问题。您能否在IIS中检查并列出身份验证下的所有设置?我猜测您启用了Windows身份验证和ASP.NET模拟,而实际上您不需要它们。此外,请转到应用程序池的高级设置并列出进程模型标识。这应该为我们提供更多的工作材料。 - Stephen Oberauer
代码如下: Process proc = new Process(); proc.StartInfo.FileName = path; proc.StartInfo.Arguments = exeparams; proc.Start();
proc.WaitForExit();stat = proc.ExitCode; if (stat != 0) { throw new Functions.log("错误"); } 就像我所说的,在问题描述的条件下,代码可以正常工作。
- santhosh.v
好的,以下是IIS设置。Windows身份验证:禁用;表单身份验证:禁用;匿名身份验证:启用;.Net模拟:禁用。在进程模型ID中,托管管道为:集成,标识为:admin(目前用于测试,以前是userA),应用程序有2个。 - santhosh.v
2个回答

14

更新:经过多周的努力,我最终成功解决了这个问题。感谢大家的贡献。显然,IIS默认不加载Windows用户配置文件。因此,当使用未登录用户运行时,IIS必须加载其Windows配置文件。在应用程序池的高级设置菜单中,有一个选项“加载Windows配置文件”,我只需将其更改为true。在之前的IIS版本中,此选项默认设置为“true”。

相关的SO问题与相同的解决方案:

1)ASP.NET中的安全异常和IIS 7.5中的“加载用户配置文件”选项

2)在IIS7上运行ASP.NET Web应用程序项目会引发异常

3)新部署的System.Web.AspNetHostingPermission异常

另一个4)http://geekswithblogs.net/ProjectLawson/archive/2009/05/05/iis-system.web.aspnethostingpermission-exception-on-windows-7-rc.aspx


8
您可以使用Process.Start。
Process process = new Process();
process.StartInfo.FileName = "CVS.exe";
process.StartInfo.Arguments = "if any";
process.Start();

还有一篇关于在asp.net中以另一个用户身份运行进程的文章:

http://weblogs.asp.net/hernandl/archive/2005/12/02/startprocessasuser.aspx

提供用户凭据

简而言之,它说您必须重定向进程,使用类似以下代码的方式:

ProcessStartInfo info = new ProcessStartInfo("cmd.exe");

info.UseShellExecute = false;

info.RedirectStandardInput = true;

info.RedirectStandardError = true;

info.RedirectStandardOutput = true;

info.UserName = dialog.User; // see the link mentioned at the top

info.Password = dialog.Password;

using (Process install = Process.Start(info))

{

      string output = install.StandardOutput.ReadToEnd();

      install.WaitForExit();

      // Do something with you output data

      Console.WriteLine(output);

}

谢谢。是的,我确实在使用Process.start。问题不在于调用进程,而在于得到对我的情况的答案/澄清。 - santhosh.v
是的,谢谢。但我尝试使用本地管理员帐户,没有成功。:( 我认为这会弹出一个窗口提示输入用户名/密码。该exe文件位于远程服务器上,必须在没有任何用户交互的情况下调用。 - santhosh.v
编写一个try/catch语句并打印错误消息,你会得到什么? - user1182183
很奇怪,没有错误,进程的退出代码是“成功”。但是没有生成输出文件。 - santhosh.v
已经尝试过了。当应用程序池 ID 设置为本地管理员时,相同的代码可以正常工作。 - santhosh.v
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接