使用本地系统应用程序池标识时,进程仅适用于 Web 应用程序

Posted

技术标签:

【中文标题】使用本地系统应用程序池标识时,进程仅适用于 Web 应用程序【英文标题】:Process only works from Web Application when using Local System Application Pool Identity 【发布时间】:2013-05-05 08:10:37 【问题描述】:

我有一个试图从我的 ASP.Net Web 应用程序运行的命令行进程。

当 IIS7.5 应用程序池标识设置为“本地系统”时,将执行命令行代码。当它设置为 ApplicationPoolIdentity 时,它不会。由于使用“本地系统”存在安全风险,我只想授予 ApplicationPoolIdentity 所需的权限,而不是使用本地系统。

如果我正确理解了这个答案:IIS AppPoolIdentity and file system write access permissions,用户“IIS AppPool[我的应用程序池]”需要被授予对我的命令行进程将要修改的任何文件夹的权限。我已尝试向该用户授予该文件夹的完全权限,但它仍然无法正常工作。我还尝试了 IUSR 和 IIS_USRS 的完全权限。请参阅下面的代码:

using (Process process = new Process())
        
            process.StartInfo.FileName = fileToExecute;
            process.StartInfo.Arguments = arguments;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;

            StringBuilder output = new StringBuilder();
            StringBuilder error = new StringBuilder();

            using (AutoResetEvent outputWaitHandle = new AutoResetEvent(false))
            using (AutoResetEvent errorWaitHandle = new AutoResetEvent(false))
            
                process.OutputDataReceived += (sender, e) =>
                
                    if (e.Data == null)
                    
                        outputWaitHandle.Set();
                    
                    else
                    
                        output.AppendLine(e.Data);
                    
                ;
                process.ErrorDataReceived += (sender, e) =>
                
                    if (e.Data == null)
                    
                        errorWaitHandle.Set();
                    
                    else
                    
                        error.AppendLine(e.Data);
                    
                ;

                process.Start();

                process.BeginOutputReadLine();
                process.BeginErrorReadLine();
                int timeout = 1000;
                if (process.WaitForExit(timeout) &&
                    outputWaitHandle.WaitOne(timeout) &&
                    errorWaitHandle.WaitOne(timeout))
                
                    Logs logs = new Logs("Finished! - Output: " + output.ToString() + " | Error: " + error.ToString());
                    logs.WriteLog();
                
                else
                
                    // Timed out.
                    Logs logs = new Logs("Timed Out! - Output: " + output.ToString() + " | Error: " + error.ToString());
                    logs.WriteLog();
                
            
        

提前感谢您的帮助!!!

【问题讨论】:

【参考方案1】:

原来应用程序池中高级设置下的“加载用户配置文件”设置必须设置为true。通过这样做,PGP 加密程序能够将配置文件用于临时数据存储等。

【讨论】:

【参考方案2】:

您可以做的是创建新的 Windows 帐户并分配所需的权限。

在开始菜单中输入“mmc”,这将打开管理控制台。 转到“文件”菜单并选择“添加/删除管理单元...”。 选择“本地用户和组”,然后选择“添加”。

接下来以与上一个管理单元相同的方式添加“组策略对象”。你最终会得到这样的结果:

现在创建新的 windows 用户。由于您很可能不想让这个新用户能够在本地登录,我们需要设置附加设置。导航到用户权限分配,您应该会看到如下内容:

双击“拒绝本地登录”并添加您的新用户。确保您还将设置适当的文件系统权限。

最后只需打开 IIS 管理器并将新用户分配给您的应用程序池。

最好的问候

【讨论】:

感谢您的回答。我试了一下,仍然无法让 PGP 软件工作。我为我认为可能需要的 exe 和其他目录授予了新用户权限。 那么很可能您仍然缺少某些权利。如果您能找到任何其他数据,您可以查看事件日志。在其他情况下,您可以使用 Filemon 和 Regmon 等工具来确定您需要哪些资源,但这可能是一个缓慢的过程,因为您在短时间内监控大量数据......我想最好的选择是联系 PGP提供者为您提供运行此软件所需的确切权限列表。 感谢您的帮助...现在与他们讨论可能需要权限的资源【参考方案3】:

不久前我在部署一些 Web 应用程序时遇到了类似的问题。最后,我们通过授予以下权限解决了我们的权限问题:IIS_USRS,IUSR, LocalMachineName\Users, LocalMachineName$,SYSTEM,(如果您的应用程序在域 DomainName\IIS_WPG,DomainName\Domain Users 中)

注意:在 Web.config 中

 <authentication mode="Windows" />
        <authorization>
            <deny users="?" />
            <allow users="*"/>
        </authorization>
<identity impersonate="false" />

【讨论】:

【参考方案4】:

尝试向 IIS_IUSRS 帐户授予权限。

此外,请确保该帐户对您正在调用的文件及其引用的任何库具有执行权限。

我创建了一些测试代码(如下),文件夹密码仅被授予系统和管理员权限(不是用户)。这意味着 IIS 默认无法查看它(已测试)。然后我给了 IIS_IUSERS 读取权限,它工作正常。

(结果显示在屏幕上)

Dim compiler As New Process()
compiler.StartInfo.FileName = "C:\Windows\System32\cmd.exe"
compiler.StartInfo.Arguments = "/C dir c:\Secret"
compiler.StartInfo.UseShellExecute = False
compiler.StartInfo.RedirectStandardOutput = True
compiler.Start()
Dim results As String = compiler.StandardOutput.ReadToEnd()
compiler.WaitForExit()

如果您不确定哪些文件需要权限,有一个名为 process explorer 的程序可以让您准确查看正在使用的文件。

http://technet.microsoft.com/en-gb/sysinternals/bb896653.aspx

【讨论】:

我尝试过给予 IIS_IUSRS 和 IUSR 完全权限,但仍然遇到同样的问题。用这些信息更新我的问题。 事件日志中报告了哪些错误? 另外,我已尝试授予该用户对我尝试通过 Web 应用程序执行的 pgp.exe 文件的完全权限。 pgp.exe 可能会引用一些 DLL,这可能值得检查。 (或授予其所在文件夹的权限)

以上是关于使用本地系统应用程序池标识时,进程仅适用于 Web 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 云消息传递仅适用于本地主机

http.ListenAndServe 仅适用于本地主机?

防火墙中的入站规则仅适用于管理员权限

在发布时应用 EF 迁移仅适用于某些 Web 项目

.Net Core 3.1 Web Api 的 403 Forbidden Error 仅适用于 Delete & PUT 方法

Mongo“身份验证失败”仅适用于远程连接。本地工作正常