7

当用户单击一个按钮时,我正在从我的 ASP.NET 应用程序运行一个可执行进程。这个过程创建了几个文件并将它们提供给最终用户。我无法真正看到该进程在做什么或没有在做什么,但是直到我将管理员用户指定为服务器上的应用程序池身份之后,它才起作用。我正在使用 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

4 回答 4

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,您可以查看它是否运行,是否关闭,是否停止但停留在那里。

于 2013-03-04T21:23:49.837 回答
2

这可能是文件/执行权限问题。尝试execute将 ApplicationPoolIdentity 的~/Testing/Dema/MyExe.exe权限read授予给commandFilePath. 您提到您的流程会创建文件。您将需要在将创建文件的文件夹上授予 ApplicationPoolIdentitymodify或权限。full control这是权限的矩阵列表

有关授予权限的信息,请参阅为 ApplicationPoolIdentity 帐户分配权限。

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

Process Explorer 还可以显示文件访问请求。这是一篇关于使用 Process Explorer 进行故障排除的技术网文章。

于 2013-03-04T21:23:12.787 回答
1

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

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

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

希望能帮助到你。

于 2013-03-04T22:45:50.220 回答
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();
        }

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

于 2013-03-05T15:13:35.173 回答