# IIS 应用池身份与 NTFS 权限：能用的最小权限

> 用 ApplicationPoolIdentity 只授予站点需要的 NTFS 权限，调整应用池设置而不破坏应用或扩大权限。

**测试环境**

- 版本号: 26100.33650
- 版本: Standard / Datacenter
- 架构: x64
- 证据: E1
- 核验日期: 2026-10-29
- 测试机: IIS Manager UI 参考：VM 361 Windows 11 26H2；应用池 labpool；Server 2025 cmdlet 为 E1

VM 361 应用池：DefaultAppPool 与 labpool，均使用 ApplicationPoolIdentity；Lab 站点用 labpool。Windows 11 UI 参考；Server 2025 步骤 E1。

## 一句话结论

IIS 应用池默认以**虚拟账户**运行：`IIS AppPool\<池名>`（ApplicationPoolIdentity）。不用建密码；池启动时 Windows 创建 SID。

只给这个身份**必要**权限：

- 站点根目录读/执行；
- 需要写文件时，只给一个 upload/cache 目录 modify；
- 不要给 `C:\`、`C:\Windows` 或别的站点目录。

不要用加 `Everyone` 或把池改成域管来“修” 401.3。

## 身份选择

| 身份 | 用途 | 风险 |
|---|---|---|
| ApplicationPoolIdentity | 默认；每池虚拟账户 | 低；显式授 NTFS |
| NetworkService | 遗留/域机器账户 | 网络身份更宽 |
| LocalSystem | Web 应用永远不要 | 本机完全控制 |
| 自定义本地用户 | 应用需要固定配置/ACL | 密码/轮换负担 |
| gMSA | 域内应用、托管密码 | 需要 AD 设计 |

单机服务器，**ApplicationPoolIdentity** 是正确默认。

## 建池并授 NTFS

```powershell
Import-Module WebAdministration
New-WebAppPool -Name 'labpool'
Set-ItemProperty IIS:\AppPools\labpool -Name managedRuntimeVersion -Value ''
```

授读/执行：

```powershell
icacls C:\inetpub\lab /grant "IIS AppPool\labpool:(OI)(CI)RX"
```

只在需要处授写：

```powershell
New-Item -ItemType Directory -Force C:\inetpub\lab\uploads | Out-Null
icacls C:\inetpub\lab\uploads /grant "IIS AppPool\labpool:(OI)(CI)M"
```

`(OI)(CI)` 作用于文件和文件夹；`RX` 读/执行；`M` 修改。除非应用真的要改 ACL/所有权，不要给 `F`（完全）。

## 验证

```powershell
Get-IISAppPool | Select-Object Name, State, ProcessModel
icacls C:\inetpub\lab
Invoke-WebRequest http://localhost:8080/ -UseBasicParsing | Select-Object StatusCode
```

**401.3** 是身份读不到文件。查有效 ACL，不是只看共享选项卡。**500.19** 是配置/权限错误，常是父 `web.config` 或缺模块。

## 值得调的应用池设置

| 设置 | 默认 | 何时改 |
|---|---|---|
| .NET CLR 版本 | v4.0 | 静态/Node/Python 设 **No Managed Code** |
| 托管管道 | Integrated | 只有遗留应用用 Classic |
| 启动模式 | OnDemand | 延迟敏感用 `AlwaysRunning` |
| 空闲超时 | 20 分钟 | 只有必须常驻才关 |
| 定期回收 | 1740 分钟 | 低峰回收；观察内存 |
| 32 位应用 | False | 只有 32 位 DLL 才 True |
| 加载用户配置文件 | False | 需要配置文件的加密等应用才 True |

不要为了“修”内存泄漏全局关回收。找泄漏，或安排低峰回收。

> **警告: ApplicationPoolIdentity 不是能登录的用户**
>
> `IIS AppPool\labpool` 是虚拟账户。不能设密码、不能交互登录。给这个确切名字授 NTFS；不要猜 SID。

## 常见错误

- 一个子目录失败，就给整个站点加 `Everyone` 读。
- 为了上传，给站点根目录写权限；上传应指向单独目录。
- 为了访问 UNC 共享，把池跑成域管。
- 厂商安装器说要用 `LocalSystem` 就用。
- 忘了**虚拟目录**用父应用池，不是自己的。

## 实验室说明

截图来自 Windows 11 26H2；`labpool` 是给 `C:\inetpub\lab`（8080）建的。Server 2025 用同一套 WebAdministration 对象模型，但角色安装仍是 E1。

## 来源

- [Microsoft Learn — 应用程序池身份](https://learn.microsoft.com/zh-cn/iis/manage/configuring-security/application-pool-identities)
- [Microsoft Learn — 应用程序池](https://learn.microsoft.com/zh-cn/iis/configuration/system.applicationhost/applicationpools/)
- [Microsoft Learn — icacls](https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/icacls)

---

来源页面: https://winbook.fyi/zh/server/web/iis-app-pools/
