Windows Server 2016 IIS应用池本地账户无法访问服务控制管理器
问题分析与解决方案
当自定义本地账户作为IIS应用池身份时,调用System.ServiceProcess.ServiceController.GetServices()出现SCM访问拒绝错误,而ApplicationPoolIdentity可正常运行,核心原因是自定义账户缺少了ApplicationPoolIdentity默认具备的关键权限,具体如下:
缺失的关键权限(需在本地组策略「用户权限分配」中添加)
- Impersonate a client after authentication(SeImpersonatePrivilege):IIS应用池进程需要模拟客户端身份完成服务控制操作,
ApplicationPoolIdentity默认继承此权限,自定义账户需显式添加。 - Create global objects(SeCreateGlobalPrivilege):服务控制管理器(SCM)及相关服务操作依赖全局对象,
ApplicationPoolIdentity默认拥有此权限,自定义本地账户需手动授予。
额外验证项
注册表读取权限
确保自定义账户对注册表路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services拥有读取权限:- 打开注册表编辑器(
regedit),定位到该路径。 - 右键选择「权限」,添加自定义账户并授予「读取」权限。
- 打开注册表编辑器(
SCM安全权限验证
打开管理员权限的命令提示符,执行命令sc sdshow scmanager,查看输出的安全描述符,确保自定义账户所属的组(如Authenticated Users)包含CCLCSWLOCRRC权限(允许读取和列出服务)。默认SCM权限包含对Authenticated Users的读取授权,若被修改,可通过sc sdset scmanager命令恢复默认设置(操作前建议备份当前权限配置)。
注意事项
即使将自定义账户加入管理员组,也可能因UAC限制或权限继承问题导致权限未生效,添加上述权限后,需重启IIS应用池及服务器确保权限生效。
内容的提问来源于stack exchange,提问作者Mark Henneman
相关产品推荐
相关产品推荐

