使用本地系统应用程序池标识时,进程仅适用于 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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章
.Net Core 3.1 Web Api 的 403 Forbidden Error 仅适用于 Delete & PUT 方法