【问题标题】:Running command from ASP.NET App Pool Identity从 ASP.NET 应用程序池标识运行命令
【发布时间】:2013-02-19 02:45:10
【问题描述】:

当用户单击按钮时,我正在从我的 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 帐户启用此功能?

谢谢!

【问题讨论】:

  • 进程如何将文件提供给最终用户?
  • 它存储在临时目录中,压缩所有文件并提供服务。这已经奏效了。

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


【解决方案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();
        }

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

【讨论】:

    【解决方案2】:

    这可能是文件/执行权限问题。 尝试将execute 权限授予~/Testing/Dema/MyExe.exeread 权限到commandFilePath。您提到您的流程会创建文件。您将需要向将创建文件的文件夹上的 ApplicationPoolIdentity 授予 modifyfull control 权限。这是一个矩阵化的list of permissions

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

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

    Process Explorer 还可以显示文件访问请求。这是一篇关于troubleshooting with Process Explorer 的技术网文章。

    【讨论】:

    • 同意。写入位置已经可以正常工作了……这是执行权限。我将如何更改 ApplicationPoolIdentity 以具有执行权限?
    • 它正在使用 IUSR 帐户...并且该帐户对目录具有完全权限。我还需要做那个帖子中提到的事情吗?
    • 您可以启动 ProcessExplorer,然后在管理员帐户下运行 apppool,并在应用程序成功运行时记录(通过 ProcessExplorer)所有活动。然后改在IUSR账号下运行,对比ProcessExplorer日志。
    • 我给 Aristos 的建议提供道具。很高兴您已经启动并运行。
    • 进程资源管理器更像是一个高级任务管理器......进程监视器实际上可以让您跟踪特定进程并查看它正在(或没有)在做什么。
    【解决方案3】:

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

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

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

    希望对你有帮助。

    【讨论】:

    • 网络服务不授予对 inetsrv 目录的访问权限。
    【解决方案4】:

    首先,为什么需要 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,你可以看看它是否运行,是否关闭,是否停止但停留在那里。

    【讨论】:

    • 我看到进程运行了一秒钟然后结束...我假设缺少权限。
    • @daniel 如果你看到它启动了,那么它就没有运行权限。在您的应用程序中添加一些日志以查找停止的原因。
    • 曾经运行过一个命令,它告诉您需要“以管理员身份运行”?该过程可能仍会启动,但如果没有提升的权限,它可能无法执行任何其他操作。
    • @daniel 不,您不需要管理员,除非您拨打一些我不知道为什么的电话,需要该权限。我有类似的应用程序,运行方式相同,不需要管理员。检查为什么需要这样做。
    • 它正在尝试写入 c:\windows\syswow64\inetsrv 目录(临时文件)。我猜这是因为 appcmd 住在那里?有点可惜,我无法控制。我也许可以以不同的方式运行它,看看是否会导致在其他地方创建临时文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多