C# 正在从ASP.NET应用程序池标识运行命令

C# 正在从ASP.NET应用程序池标识运行命令,c#,asp.net,iis-7,application-pool,applicationpoolidentity,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.A

当用户单击按钮时,我正在从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
帐户启用此功能需要做些什么吗


谢谢

可能是文件/执行权限问题。 尝试将应用程序池标识的
execute
权限授予
~/Testing/Dema/MyExe.exe
read
权限授予
commandFilePath
。您提到您的流程创建文件。您需要向将创建文件的文件夹上的ApplicationPoolIdentity授予
修改
完全控制
权限。这是一个矩阵

有关授予权限的信息,请参阅

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


Process Explorer还可以显示文件访问请求。这里有一篇关于的technet文章

首先,为什么需要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添加对这些目录的权限

我真的看不出这个过程在做什么或没有做什么


您可以查看是否在服务器上使用,并查看其是否运行、是否关闭、是否停止但仍停留在那里。

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

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

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


希望能有所帮助。

谢谢大家的帮助。我所需要做的就是将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();
        }

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

该进程如何向最终用户提供文件?它存储在临时目录中,压缩所有文件并提供文件。这已经奏效了。写入位置已经可以正常工作了。。。这是执行权限。如何更改ApplicationPoolIdentity以获得执行权限?它正在使用IUSR帐户。。。并且该帐户对该目录具有完全权限。我还需要执行该线程中提到的操作吗?您可以启动ProcessExplorer,然后在管理员帐户下运行apppool,并在应用程序成功运行时(通过ProcessExplorer)记录所有活动。然后改为在IUSR帐户下运行,并比较ProcessExplorer日志。我向亚里士多德推荐它。很高兴您已经启动并运行。Process Explorer更像是一个高级任务管理器。。。进程监视器实际上让您跟踪特定进程,并查看它正在(或不在)做什么。我看到进程运行一秒钟,然后结束。。。我假设没有权限。@daniel如果您看到它开始运行,则运行时没有权限。在应用程序中添加一些日志以查找停止的原因。是否运行过命令,它会告诉您需要“以管理员身份运行”?进程可能仍会启动,但如果没有提升的权限,它可能无法执行任何其他操作。@daniel不,您不需要管理员,除非您打了一些我不知道为什么的电话,我需要该权限。我有一些类似的应用程序,它们只是以相同的方式运行,不需要管理员。检查为什么需要这样做。它正在尝试写入c:\windows\syswow64\inetsrv目录(临时文件)。我猜这是因为appcmd住在那里?我没办法控制这件事,这有点让人失望。我可以用不同的方式运行它,看看这是否会导致在其他地方创建临时文件。网络服务不授予对inetsrv目录的访问权。