当用户单击按钮时,我正在从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
帐户启用此功能?
谢谢!
答案 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授予modify
或full 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();
}
这会导致临时文件被写入非系统文件夹,因此不需要任何提升的应用程序池权限。