从ASP.NET应用程序池标识运行命令

时间:2013-03-04 21:15:46

标签: c# asp.net iis-7 application-pool applicationpoolidentity

当用户单击按钮时,我正在从ASP.NET应用程序运行可执行进程。此过程会创建多个文件,并将其提供给最终用户。我无法确切地看到进程是做什么或不做什么,但是直到我将admin用户指定为服务器上的应用程序池标识才行。我正在使用IIS7。

 using (var proc = new Process())
 {
    proc.StartInfo.FileName = Server.MapPath("~/Testing/Demo/MyExe.exe");
    proc.StartInfo.Arguments = String.Format("\"{0}\"", commandFilePath);
    proc.StartInfo.UseShellExecute = true;
    proc.Start();
    proc.WaitForExit();
 }

我认为这通常是一件坏事。您是否可以让我深入了解需要采取哪些措施才能为普通ApplicationPoolIdentity帐户启用此功能?

谢谢!

4 个答案:

答案 0 :(得分:3)

首先,为什么需要Shell来执行它?不是控制台应用程序 - 你打开任何窗口吗?

其次,您需要重定向输入和输出。

最后,您需要做的是放置脚本运行的目录,运行池下的用户权限。并从池中删除管理员。

proc.StartInfo.UseShellExecute = false;
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.RedirectStandardError = true;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardInput = true;

proc.Start();

proc.StandardInput.Flush();
proc.StandardInput.Close();

proc.WaitForExit();
proc.Close();

因此,例如,如果将池添加到UserA下运行,则转到程序运行的目录,并为UserA添加权限,以便能够在该目录上执行程序。如果您的程序还使用其他目录进行读写,也可以为UserA添加权限。

  

我无法真正看到过程是做什么或不做什么

如果你在服务器上使用Process Explorer,你可以查看它是否运行,如果它关闭,它是否停止但是留在那里。

答案 1 :(得分:2)

可能是文件/执行权限问题。 尝试将execute权限授予ApplicationPoolIdentity ~/Testing/Dema/MyExe.exe和[{1}} read commandFilePath权限。您提到过程会创建文件。您需要为将要创建文件的文件夹的ApplicationPoolIdentity授予modifyfull control权限。这是一个矩阵list of permissions

有关授予权限的信息,请参阅assign permissions to ApplicationPoolIdentity account

安全事件日志应捕获权限被拒绝的错误。检查那里是否有访问权限问题。系统和应用程序日志可能还包含有关该问题的信息。

Process Explorer还可以显示文件访问请求。这是关于troubleshooting with Process Explorer的technet文章。

答案 2 :(得分:1)

每当您从ASP.NET页面运行任何进程时,它都会在工作进程的安全上下文中运行,即应用程序池帐户的权限。它不像您通常运行MyExe.exe,在这种情况下它将使用登录帐户运行。正因为如此,当您将管理员帐户提供给应用程序池时,您的代码才有效。

有很多方法可以解决这个问题。

最简单的方法之一是将您的应用池标识更改为网络服务,并将网络服务添加到MyExe.exe将访问文件格式的文件夹的权限。

希望它有所帮助。

答案 3 :(得分:1)

谢谢大家的帮助。我需要做的就是将StartInfo.WorkingDirectory设置为我能写的地方。

        using (var proc = new Process())
        {
            proc.StartInfo.FileName = Server.MapPath("~/Testing/Demo/MyEXE.exe");
            proc.StartInfo.Arguments = String.Format("\"{0}\"", commandFile);
            proc.StartInfo.WorkingDirectory = savePath;
            proc.Start();
            proc.WaitForExit();
        }

这会导致临时文件被写入非系统文件夹,因此不需要任何提升的应用程序池权限。