ChatGPT解决这个技术问题 Extra ChatGPT

将 IIS 7 AppPool 身份添加为 SQL Server 登录

我正在运行一个带有集成管道模式 AppPool 的 IIS 7 网站。 AppPools 不在 NetworkService 等身份下运行(按目的),而是使用自己的 AppPool 身份(IIS AppPool\MyAppPool)。

这是所谓的服务帐户或虚拟帐户。 (用户帐户,不是完整帐户...)

我想授予此服务帐户 (IIS AppPool\MyAppPool) 权限以连接到我的 SQL Server 2008 Express(以混合身份验证模式运行)。

虽然 SQL Server 可以添加任何普通用户帐户,但 IIS AppPool\MyAppPool 虚拟帐户无法添加到有效登录中(SQL Server 表示找不到该帐户)。

有什么技巧,我需要启用什么才能使虚拟帐户正常工作吗? (根据taskmgr,w3wp.exe进程在此身份下运行,但我也无法在NTFS安全中使用该帐户...)

谢谢你的帮助!


d
dp.

“IIS APPPOOL\AppPoolName”会起作用,但如前所述,它似乎不是有效的 AD 名称,因此当您在“选择用户或组”对话框中搜索它时,它不会显示(实际上,它会找到它,但它会认为它是一个实际的系统帐户,它会尝试这样对待它......这是行不通的,并且会给你关于它找不到的错误消息)。

我如何让它工作是:

在 SQL Server Management Studio 中,查找安全文件夹(与数据库、服务器对象等文件夹处于同一级别的安全文件夹...而不是每个单独数据库中的安全文件夹)右键单击登录名并选择“新建登录名”在登录名字段中,键入 IIS APPPOOL\YourAppPoolName - 不要单击搜索填写您喜欢的任何其他值(即身份验证类型、默认数据库等)单击确定

只要 AppPool 名称实际存在,现在就应该创建登录。


很抱歉恢复旧帖子,但有谁知道这样做是否会在实时环境中产生任何安全隐患?
非常有帮助,但令人兴奋(而且很糟糕)的微软人。
哇。第 3 步中的“不要点击搜索”似乎有所作为(?)
如果 SQL 服务器实例在另一台服务器上,这不会失败吗?例如 - SQL1 如何知道 WEB1 上的本地/虚拟 IIS AppPool\MyAppPool
如果您的 Web Server 和 SQL Server 在不同的机器上,是否有任何解决方案!??我可以找到登录名,但无法创建新的 SQL 登录名。 (如果我不检查名称......它仍然不起作用)
R
Ryan Prechel
CREATE LOGIN [IIS APPPOOL\MyAppPool] FROM WINDOWS;
CREATE USER MyAppPoolUser FOR LOGIN [IIS APPPOOL\MyAppPool];

很好 - 虽然公认的答案是正确的 - 我设法让自己处于 Management Studio 无法正常工作的情况,所以这个原始 TSQL 解决方案正是我所需要的。
请注意像我这样的菜鸟:确保对您希望使用 IIS 应用程序池访问的数据库执行此查询,第二条语句在数据库级别。您可能需要使用户成为某些数据库角色的成员并授予他对架构(例如 dbo)的权限。
一旦我发现无法通过 SSMS GUI 添加 IIS APPPOOL 登录,我就运行了您的脚本。谢谢!它曾经是可能的 - 不是在 SSMS 18 中!我想这现在是一个“功能”
您可能希望将角色 db_owner 添加到新创建的用户 MyAppPoolUser 以避免权限问题:ALTER ROLE db_owner ADD MEMBER [MyAppPoolUser]
@rodsarria:这不一定是个好主意。然后,IIS 应用程序池用户将有权创建和更改表。相反,请在表、视图、函数和存储过程上进行显式 GRANT。您不想让应用程序级别的用户对您的数据库架构有太多的访问权限。
G
Gokhan Ertogan

可以这样解决

打开“应用程序池”,您应该右键单击已选择应用程序池。然后选择“高级设置”。单击“身份”选项卡上的三个点,然后您应该从“内置帐户”字段中选择“本地系统”

如果这样做,则无需在数据库中创建用户。


天哪,这工作得很好!此问题的最短解决方案。
当这个问题出现在开发环境中时,这需要得到更多的支持
虽然这可以在开发环境中工作,但我永远不会在生产环境中这样做,因为 IIS AppPool 用户对他们可以通过设计访问的内容有严格的限制。更改为具有“AUTHORITY\SYSTEM”和“BUILTIN\Administrators”的帐户会给面向外部的网站提供过多的系统访问权限。 docs.microsoft.com/en-us/troubleshoot/iis/… docs.microsoft.com/en-us/windows/win32/services/…
D
Dave Markle

如果您要跨机器运行,则需要使用网络服务、本地系统、域帐户或 SQL 2008 R2(如果有)托管服务帐户(如果您有这样的基础设施,这是我的偏好) .您不能使用对 Active Directory 域不可见的帐户。


S
Steven

作为旁注,使用虚拟帐户(NT Service\MyService 和 IIS AppPool\MyAppPool)的进程仍在“NETWORK SERVICE”帐户下运行,正如本文所建议的 http://www.adopenstatic.com/cs/blogs/ken/archive/2008/01/29/15759.aspx。唯一的区别是这些进程是“NT Service\MyService”或“IIS AppPool\MyAppPool”组的成员(因为这些实际上是组而不是不是用户)。这也是为什么进程在网络上以与 NETWORK SERVICE 帐户相同的方式在计算机上进行身份验证的原因。

确保访问安全的方法不是依赖于没有 NETWORK SERVICE 权限的帐户,而是专门授予“NT Service\MyService”或“IIS AppPool\MyAppPool”更多权限,并在必要时删除“Users”的权限。

如果有人有更准确或矛盾的信息,请发布。


R
Ricardo Yanez

看:http://www.iis.net/learn/manage/configuring-security/application-pool-identities

USE master
GO
sp_grantlogin 'IIS APPPOOL\<AppPoolName>'

USE <yourdb>
GO
sp_grantdbaccess 'IIS APPPOOL\<AppPoolName>', '<AppPoolName>'
sp_addrolemember 'aspnet_Membership_FullAccess', '<AppPoolName>'
sp_addrolemember 'aspnet_Roles_FullAccess', '<AppPoolName>'

k
keithwarren7

这可能是您正在寻找的...

http://technet.microsoft.com/en-us/library/cc730708%28WS.10%29.aspx

我还建议长期考虑有限权限的域用户,您正在尝试的内容在孤岛机器场景中运行良好,但如果您将数据库服务器移至另一台机器,您将不得不进行更改。


D
Danimal111

我通过反复试验找到了答案...盔甲中真正的裂缝是 IIS 中 Configuration Editor 中网站的一个鲜为人知的设置

Section: system.webServer/security/authentication/windowsAuthentication

From: ApplicationHost.config <locationpath='ServerName/SiteName' />

称为useAppPoolCredentials(默认设置为False。将此设置为True,生活再次变得美好!!!希望这可以为下一个人节省痛苦......

https://i.stack.imgur.com/YZHwc.png


我遵循相同的过程,但问题没有得到解决。你一定也做过别的事,可以分享一下吗?
@RSB - 您是否遵循所有其他步骤?您是否设置了 appPools,并授予他们访问您网站所在文件的权限?您是否将服务器名称添加为具有 SQL Server 权限的登录名?您是否将 appPool 应用到具有权限的 SQL Server?您是否修改了 IIS 以使用 WindowsAuthentication?你得到什么错误?它是否适用于您的开发环境而不是生产环境?
我设置了 appPool,但是如何授予他们访问网站所在文件的权限?如何将服务器名称添加为具有 SQL 服务器权限的登录名?我还将 appPool 添加到具有权限的 SQL Server 中。如何修改 IIS 以使用 WindowsAuthentocation。当 IIS 和 sql server 在同一台机器上时,它可以在我的开发环境中工作,但是当 IIS 和 Sql server 在不同的机器上时,它会给出错误-System.ComponentModel.Win32Exception: Access Denied 错误。请建议。
如果你给我你的电子邮件,我会给你一份我制作的关于如何做这一切的文件......这里太多了......
@RSB 我给你发了一封电子邮件。祝你好运。
a
arokanika

就我而言,问题是我开始使用 Visual Studio/Episerver 扩展从头开始创建一个 MVC Alloy 示例项目,并且在使用本地 Visual Studio iis express 执行时它运行良好。但是,默认情况下,它将 sql 数据库指向 LocalDB,当我将站点部署到本地 IIS 时,它开始出现错误,我通过以下方式解决了一些初始错误: 1.将本地站点 url 绑定添加到 C:/Windows/System32/drivers/ etc/hosts 2. 然后通过编辑 application.config 在使用 Visual Studio 运行站点时右键单击屏幕右下角的 IIS express 找到文件位置,并在那里为本地 iis url 添加绑定。 3. 最后,我遇到了“无法访问数据库错误”,为此我在 Sql express 中创建了一个空白的新数据库,并在 Web 配置中更改了连接字符串以指向我的新数据库,然后在包管理器控制台(使用 Visual Studio)中执行Episerver DB 命令,例如 - 1. initialize-epidatabase 2. update-epidatabase 3. Convert-EPiDatabaseToUtc


h
hastrb

对于 ApplicationPoolIdentity,将 MSSQL 中的登录名/用户添加为 IIS_IUSRS,对应于默认池。