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

本文关键字:应用程序 程序池 标识 应用 NET ASP 运行 命令 | 更新日期: 2023-09-27 18:02:05

我正在从我的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帐户启用这个功能吗?

谢谢!

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

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

第二,你需要重定向输入和输出。

最后,您需要做的是在脚本运行的目录下,为运行池的用户设置权限。并从您的池中删除Admin。

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权限。

我不能真正看到进程在做什么或没有做什么

如果在服务器上使用进程资源管理器,您可以查看它是否运行,是否关闭,是否停止但停留在那里。

可能是文件/执行权限问题。尝试将ApplicationPoolIdentity的execute权限授予~/Testing/Dema/MyExe.exe,将read权限授予commandFilePath。您提到您的进程创建文件。您需要将modifyfull control权限授予ApplicationPoolIdentity在创建文件的文件夹上的权限。以下是权限的矩阵列表。

关于授予权限的信息,请参见assign permissions to ApplicationPoolIdentity account。

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

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

无论何时从ASP. net运行任何进程。. NET页面,它在工作进程的安全上下文中运行,这是你的应用程序池帐户的特权。它不像你通常运行MyExe.exe,在这种情况下,它将使用登录帐户运行。正因为如此,你的代码工作时,你给管理员帐户应用程序池。

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

最简单的方法之一是将你的应用程序池身份更改为网络服务,并将网络服务添加到myexe将访问文件表单的文件夹的权限中。

希望能有所帮助。

谢谢大家的帮助。我所需要做的就是设置StartInfo。工作目录到我能写的地方

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

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