IIS 7.5 ApplicationPoolIdentity 权限
IIS 7.5 ApplicationPoolIdentity Permissions
我在正确设置 AppPoolIdentity 的权限时遇到一些困难。
失败请求日志中显示的错误是:
ModuleName="IIS Web Core", Notification="BEGIN_REQUEST", HttpStatus="500", HttpReason="Internal Server Error", HttpSubStatus="0", ErrorCode="The I/O operation has been aborted because of either a thread exit or an application request.
(0x800703e3)", ConfigExceptionInfo=""
我认为这是一个权限问题,因为将应用程序池的 AppPoolIdentity 更改为 LocalSystem 会使网站中的所有内容正常运行。当 AppPoolIdentity 设置为 ApplicationPoolIdentity 时,上面显示的错误就是我收到的。我使用以下语法命名了应用程序池标识:
IIS APPPOOL\<app_pool_name>
我已经确认:
- 我在设置权限时使用了正确的 app_pool_name。 (在设置权限时使用检查名称,这意味着 Windows 正在查找用户。)
- wwwroot 和 oracle 客户端目录具有允许应用程序池标识读取和执行文件的权限。
- IIS 中启用了匿名身份验证,并设置为使用应用程序池标识。
我错过的其他目录是否需要授予权限?还是我完全想念的其他问题?
对于一些额外的背景,我使用 Windows Server 2008 R2 with IIS 7.5。
提前致谢!
编辑:
多亏了 Peter 的建议,我做了一些追踪,发现我缺少一些权限。我缺少的权限是:
- 完全控制 HKLM\SOFTWARE\Microsoft\SystemCertificates\
- 完全控制
香港大学{GUID}\Software\Policies\Microsoft\SystemCertificates\
- 完全控制 HKLM\SOFTWARE\Microsoft\EnterpriseCertificates\
- 读到 HKLM\System\CurrentControlSet\services\eventlog\Security\
- 完全控制 C:\Windows\SysWOW64\config\systemprofile\AppData\
修改这些权限后,我的应用程序现在正在将自定义应用程序错误记录到 Windows 事件日志。 (基本上自定义应用程序错误告诉我它无法建立与数据库的连接。)。请记住,如果我 运行 作为 LocalSystem 而不是 IIS 中的 AppPoolIdentity 用户,则一切正常。再次使用进程监视器,我发现 Oracle 客户端正在记录到一个 sqlnet.log 文件。在此文件中显示:
Fatal NI connect error 12631, connecting to:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=[DB IP ADDRESS])(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=[SERVICE NAME])(CID=(PROGRAM=C:\Windows\SysWOW64\inetsrv\w3wp.exe)(HOST=[WEB APPLICATION SERVER NAME])(USER=[APP POOL IDENTITY USER]))))
VERSION INFORMATION:
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
Windows NT TCP/IP NT Protocol Adapter for 32-bit Windows: Version 11.2.0.1.0 - Production
Time: 21-JUL-2015 16:28:00
Tracing not turned on.
Tns error struct:
ns main err code: 12631
TNS-12631: Username retrieval failed
ns secondary err code: 0
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0
知道为什么它使用 AppPoolIdentity 作为它尝试连接的用户吗?
我终于解决了这个问题。
在上面的 EDIT 中,我添加了解决第一个问题的必要权限。
为了让它工作,我修改了我的 SQLNET.ora 文件,如下所示:
# sqlnet.ora Network Configuration File: E:\Oracle_client\product.2.0.1\client_x32\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.
#SQLNET.AUTHENTICATION_SERVICES= (NONE, NTS)
SQLNET.AUTHENTICATION_SERVICES= (NONE)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
请注意,原来的 SQLNET.AUTHENTICATION_SERVICES 现在仅设置为 NONE。
(我相信此更改不会立即生效,但几分钟后就会生效。重新启动机器可能有点矫枉过正,但已足够)。
我还将 AppPoolIdentity 切换为 LocalService,然后又切换回 AppPoolIdentity。这样做之后它起作用了,但我不认为来回切换 AppPoolIdentity 对让它起作用有任何影响。
我在正确设置 AppPoolIdentity 的权限时遇到一些困难。
失败请求日志中显示的错误是:
ModuleName="IIS Web Core", Notification="BEGIN_REQUEST", HttpStatus="500", HttpReason="Internal Server Error", HttpSubStatus="0", ErrorCode="The I/O operation has been aborted because of either a thread exit or an application request.
(0x800703e3)", ConfigExceptionInfo=""
我认为这是一个权限问题,因为将应用程序池的 AppPoolIdentity 更改为 LocalSystem 会使网站中的所有内容正常运行。当 AppPoolIdentity 设置为 ApplicationPoolIdentity 时,上面显示的错误就是我收到的。我使用以下语法命名了应用程序池标识:
IIS APPPOOL\<app_pool_name>
我已经确认:
- 我在设置权限时使用了正确的 app_pool_name。 (在设置权限时使用检查名称,这意味着 Windows 正在查找用户。)
- wwwroot 和 oracle 客户端目录具有允许应用程序池标识读取和执行文件的权限。
- IIS 中启用了匿名身份验证,并设置为使用应用程序池标识。
我错过的其他目录是否需要授予权限?还是我完全想念的其他问题?
对于一些额外的背景,我使用 Windows Server 2008 R2 with IIS 7.5。
提前致谢!
编辑: 多亏了 Peter 的建议,我做了一些追踪,发现我缺少一些权限。我缺少的权限是:
- 完全控制 HKLM\SOFTWARE\Microsoft\SystemCertificates\
- 完全控制 香港大学{GUID}\Software\Policies\Microsoft\SystemCertificates\
- 完全控制 HKLM\SOFTWARE\Microsoft\EnterpriseCertificates\
- 读到 HKLM\System\CurrentControlSet\services\eventlog\Security\
- 完全控制 C:\Windows\SysWOW64\config\systemprofile\AppData\
修改这些权限后,我的应用程序现在正在将自定义应用程序错误记录到 Windows 事件日志。 (基本上自定义应用程序错误告诉我它无法建立与数据库的连接。)。请记住,如果我 运行 作为 LocalSystem 而不是 IIS 中的 AppPoolIdentity 用户,则一切正常。再次使用进程监视器,我发现 Oracle 客户端正在记录到一个 sqlnet.log 文件。在此文件中显示:
Fatal NI connect error 12631, connecting to:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=[DB IP ADDRESS])(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=[SERVICE NAME])(CID=(PROGRAM=C:\Windows\SysWOW64\inetsrv\w3wp.exe)(HOST=[WEB APPLICATION SERVER NAME])(USER=[APP POOL IDENTITY USER]))))
VERSION INFORMATION:
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
Windows NT TCP/IP NT Protocol Adapter for 32-bit Windows: Version 11.2.0.1.0 - Production
Time: 21-JUL-2015 16:28:00
Tracing not turned on.
Tns error struct:
ns main err code: 12631
TNS-12631: Username retrieval failed
ns secondary err code: 0
nt main err code: 0
nt secondary err code: 0
nt OS err code: 0
知道为什么它使用 AppPoolIdentity 作为它尝试连接的用户吗?
我终于解决了这个问题。
在上面的 EDIT 中,我添加了解决第一个问题的必要权限。
为了让它工作,我修改了我的 SQLNET.ora 文件,如下所示:
# sqlnet.ora Network Configuration File: E:\Oracle_client\product.2.0.1\client_x32\network\admin\sqlnet.ora
# Generated by Oracle configuration tools.
#SQLNET.AUTHENTICATION_SERVICES= (NONE, NTS)
SQLNET.AUTHENTICATION_SERVICES= (NONE)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
请注意,原来的 SQLNET.AUTHENTICATION_SERVICES 现在仅设置为 NONE。
(我相信此更改不会立即生效,但几分钟后就会生效。重新启动机器可能有点矫枉过正,但已足够)。
我还将 AppPoolIdentity 切换为 LocalService,然后又切换回 AppPoolIdentity。这样做之后它起作用了,但我不认为来回切换 AppPoolIdentity 对让它起作用有任何影响。