# 2025域控服务器Dnscache 服务（DNS Client 服务）自动被禁用解决方法

在 Windows Server 2025（目前仍处于预览/开发阶段，但行为可参考 Windows Server 2022/2019）环境中，若你部署了 **3 台域控制器（1 主 + 2 辅助）**，并发现 **Dnscache 服务（DNS Client 服务）总是自动被禁用**，从而导致本地 DNS 解析失败，这通常不是正常行为。以下是可能的原因和解决方案：

---

### 🔍 一、确认事实：Dnscache 服务是否真的“被禁用”？

首先澄清几个关键点：

<table id="bkmrk-%E9%A1%B9%E7%9B%AE-%E8%AF%B4%E6%98%8E-%E6%9C%8D%E5%8A%A1%E5%90%8D%E7%A7%B0-dnscache%EF%BC%88"><thead><tr><th>项目</th><th>说明</th></tr></thead><tbody><tr><td>**服务名称**</td><td>`Dnscache`（显示名为 “DNS Client”）</td></tr><tr><td>**作用**</td><td>缓存本地 DNS 查询结果、解析主机名（如 `ping dc01`），**不负责权威 DNS 响应**</td></tr><tr><td>**域控上是否必须运行？**</td><td>**推荐启用**，尤其用于解析其他域控、SRV 记录、客户端快速查找等</td></tr><tr><td>**默认启动类型**</td><td>**自动（Automatic）**，且应处于 **正在运行** 状态</td></tr></tbody></table>

> ⚠️ 注意：**DNS 服务器角色（DNS Server 服务） ≠ Dnscache 服务**
> 
> - `DNS Server`（服务名：`DNS`）：提供权威 DNS 解析（必须运行在域控上）
> - `Dnscache`（服务名：`Dnscache`）：本地 DNS 客户端缓存（建议启用）

---

### 🧨 二、Dnscache 被禁用的常见原因

#### 1. **组策略（GPO）强制禁用**

这是最常见原因！管理员可能通过 GPO 统一配置了服务启动状态。

- **检查路径**： ```
    计算机配置 → 策略 → Windows 设置 → 安全设置 → 系统服务 → DNS Client
    
    ```
- 如果此处设置为 **“已禁用”**，则所有域控都会被强制停用该服务。
- **解决方法**： 
    - 打开 **组策略管理（GPMC）**
    - 检查应用到域控 OU 的 GPO（如 “Default Domain Controllers Policy”）
    - 删除或修改对 `Dnscache` 的限制，设为 **“未配置”** 或 **“自动”**

> 💡 提示：运行 `gpresult /h report.html` 在域控上查看生效的 GPO。

---

#### 2. **安全加固脚本/基线配置误操作**

某些安全合规脚本（如 CIS Benchmark、内部安全基线）会错误地认为“域控不需要 DNS Client 服务”，从而禁用它。

- **排查方法**： 
    - 检查是否运行过自动化加固工具（如 Microsoft Security Compliance Toolkit、Ansible、PowerShell 脚本）
    - 查看事件日志：`Event Viewer → Windows Logs → System`，筛选 **Service Control Manager (Event ID 7040)**，看谁修改了启动类型

---

#### 3. **第三方安全软件干扰**

某些 EDR/XDR 或终端防护软件（如 CrowdStrike、McAfee、Symantec）可能出于“减少攻击面”目的，自动禁用非核心服务。

- **排查**： 
    - 暂时禁用第三方安全软件，观察服务是否恢复
    - 检查其策略中是否包含“服务控制”规则

---

#### 4. **手动误操作 + 启动类型被设为“禁用”**

虽然你说“自动禁用”，但也可能是某次手动设置后未注意，而系统重启后体现为“失效”。

- **验证命令**： ```powershell
    Get-Service Dnscache | Select Name, Status, StartType
    sc.exe qc Dnscache
    
    ```

---

### ✅ 三、正确配置建议

#### ✅ 步骤 1：确保 Dnscache 服务启用并运行

```powershell
# 设置启动类型为自动
Set-Service Dnscache -StartupType Automatic

# 启动服务（如果未运行）
Start-Service Dnscache

```

#### ✅ 步骤 2：检查 DNS 服务器配置

- 所有域控的 **网络适配器 DNS 设置** 应指向 **自身或其他域控 IP**，**不要指向 127.0.0.1（除非单 DC）**
    - 例如： 
        - DC01: DNS = DC02, DC03
        - DC02: DNS = DC01, DC03
        - DC03: DNS = DC01, DC02 > 避免环回依赖，防止复制中断

#### ✅ 步骤 3：验证 DNS 功能

```powershell
nslookup yourdomain.local
dcdiag /test:dns /v

```

---

### 🛑 四、特别注意：不要混淆概念！

<table id="bkmrk-%E9%94%99%E8%AF%AF%E8%AE%A4%E7%9F%A5-%E6%AD%A3%E7%A1%AE%E8%AE%A4%E7%9F%A5-%E2%80%9C%E5%9F%9F%E6%8E%A7%E8%87%AA%E5%B7%B1%E6%98%AF-dns"><thead><tr><th>错误认知</th><th>正确认知</th></tr></thead><tbody><tr><td>“域控自己是 DNS 服务器，不需要 Dnscache”</td><td>❌ Dnscache 用于**解析其他主机名**（如 `ping dc02`）、缓存外部查询、加速 LDAP/SRV 查找</td></tr><tr><td>“禁用 Dnscache 更安全”</td><td>❌ 微软官方推荐启用，禁用可能导致：  
• 组策略应用延迟  
• 域信任解析失败  
• 客户端登录变慢</td></tr></tbody></table>

---

### 📌 总结

> **Dnscache 服务在域控制器上应保持“自动”并“正在运行”**。  
> 若它反复被禁用，**90% 概率是组策略（GPO）所致**，请优先排查 `Default Domain Controllers Policy` 或自定义 GPO 中的服务配置。

建议操作顺序：

1. 运行 `rsop.msc` 或 `gpresult /h gpo.html` 查看生效策略
2. 检查系统事件日志（Event ID 7040）
3. 临时将启动类型设为自动并监控是否被覆盖
4. 如确认是 GPO，修正后执行 `gpupdate /force` 并重启测试

如需进一步分析，可提供：

- `sc qc Dnscache` 输出
- `gpresult /h` 报告片段
- 系统日志中关于 Dnscache 的事件记录

---

感谢提供 `sc qc Dnscache` 的输出。从结果来看，问题非常明确：

```
START_TYPE         : 4   DISABLED

```

这表示 **DNS Client（Dnscache）服务的启动类型已被设置为“禁用”**，因此系统不会自动启动它，导致本地 DNS 解析（如解析 `dc01`、`_ldap._tcp.dc._msdcs.yourdomain.com` 等）失败，进而可能影响域功能（如组策略应用、信任关系、客户端登录等）。

---

### 🔍 根本原因分析

虽然你没有手动禁用它，但 **Windows 默认绝不会将 Dnscache 设为 DISABLED**。  
所以一定是 **某种外部策略或配置强制修改了它**。

最可能的原因排序如下：

<table id="bkmrk-%E5%8F%AF%E8%83%BD%E6%80%A7-%E5%8E%9F%E5%9B%A0-%E9%AA%8C%E8%AF%81%E6%96%B9%E5%BC%8F-%E2%AD%90%E2%AD%90%E2%AD%90%E2%AD%90-%E7%BB%84%E7%AD%96%E7%95%A5"><thead><tr><th>可能性</th><th>原因</th><th>验证方式</th></tr></thead><tbody><tr><td>⭐⭐⭐⭐</td><td>**组策略（GPO）** 强制禁用服务</td><td>检查 `Default Domain Controllers Policy` 或其他应用到 DC 的 GPO</td></tr><tr><td>⭐⭐⭐</td><td>安全基线脚本（如 CIS、Microsoft SCAP、内部加固脚本）</td><td>检查是否运行过自动化安全配置工具</td></tr><tr><td>⭐⭐</td><td>第三方安全软件（EDR/AV）干预</td><td>查看安全软件是否有“服务控制”策略</td></tr><tr><td>⭐</td><td>手动误操作（但你说“总是自动”，可排除）</td><td>—</td></tr></tbody></table>

---

### ✅ 解决方案：分步排查与修复

#### ✅ 第一步：立即临时启用服务（验证是否解决问题）

```cmd
sc config Dnscache start= auto
net start Dnscache

```

> 注意：`start= auto` 中的空格是语法要求。

然后测试 DNS 解析：

```cmd
nslookup yourdomain.local
ping dc02  （假设 dc02 是另一台 DC 的主机名）

```

如果恢复正常，说明确实是 Dnscache 被禁用导致的问题。

---

#### ✅ 第二步：查找是谁禁用了它 —— 检查组策略（最关键！）

1. **在域控上运行**：
    
    ```cmd
    gpresult /h gpo_report.html
    
    ```
    
    打开生成的 `gpo_report.html`，查看 **“计算机配置” → “已应用的组策略对象”**。
2. **重点检查以下 GPO**：
    
    
    - `Default Domain Controllers Policy`
    - 任何名称含 “Security Baseline”、“Hardening”、“Server Policy” 的自定义 GPO
3. **在 GPMC（组策略管理控制台）中检查**：
    
    
    - 路径：  
        `计算机配置 → 策略 → Windows 设置 → 安全设置 → 系统服务`
    - 找到 **“DNS Client”** 服务
    - 如果其策略被设置为 **“已禁用”**，这就是罪魁祸首！
4. **修复方法**：
    
    
    - 将该策略改为 **“未配置”**（推荐），或显式设为 **“自动”**
    - 在域控上执行： ```cmd
        gpupdate /force
        
        ```
    - 重启或等待策略刷新（通常 90~120 分钟），观察 `Dnscache` 是否仍被禁用

---

#### ✅ 第三步：检查是否有安全基线脚本残留

- 回忆是否部署过：
    
    
    - Microsoft Security Compliance Toolkit (SCT)
    - CIS Microsoft Windows Server Benchmark
    - PowerShell DSC 配置
    - Ansible/Puppet 自动化脚本
- 这些工具常通过 **Local Group Policy** 或 **直接修改注册表** 禁用服务。
- **注册表位置**（不建议直接改，优先查 GPO）：
    
    ```
    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache
    Start = 4 （表示禁用）
    
    ```

> ⚠️ 如果是注册表被写死，即使 GPO 修复，也可能被脚本再次覆盖。需找到源头脚本并停用。

---

#### ✅ 第四步：监控服务是否再次被禁用

修复后，持续监控：

```powershell
# 每5分钟检查一次状态（可写成脚本）
while ($true) {
    $svc = Get-Service Dnscache -ErrorAction SilentlyContinue
    if ($svc.StartType -ne 'Automatic' -or $svc.Status -ne 'Running') {
        Write-Host "$(Get-Date): Dnscache 异常! StartType=$($svc.StartType), Status=$($svc.Status)" -ForegroundColor Red
    }
    Start-Sleep -Seconds 300
}

```

同时查看 **事件查看器 → Windows 日志 → 系统**，筛选 **事件来源 = "Service Control Manager"**，事件 ID **7040**（服务启动类型更改）或 **7036**（服务停止），看是否有记录谁修改了它。

---

### 📌 最终建议

> **不要长期禁用 Dnscache 服务**，尤其在域控制器上。  
> 微软官方文档明确指出：**域控制器应启用 DNS Client 服务以支持高效名称解析和 Active Directory 功能**。

参考：[Microsoft Docs - DNS Client service on domain controllers](https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/dns-client-service-domain-controllers)

---

### 总结操作清单

<table id="bkmrk-%E6%AD%A5%E9%AA%A4-%E6%93%8D%E4%BD%9C-1-sc-config-dn"><thead><tr><th>步骤</th><th>操作</th></tr></thead><tbody><tr><td>1</td><td>`sc config Dnscache start= auto && net start Dnscache`（临时恢复）</td></tr><tr><td>2</td><td>`gpresult /h gpo.html` + 检查 GPMC 中系统服务策略</td></tr><tr><td>3</td><td>修正 GPO，将 DNS Client 设为“未配置”或“自动”</td></tr><tr><td>4</td><td>`gpupdate /force` 并验证服务状态</td></tr><tr><td>5</td><td>监控日志，确认是否再次被禁用</td></tr></tbody></table>

如按上述操作仍无法解决，请提供：

- `gpresult /h` 报告中“已应用的 GPO”列表
- 系统日志中最近关于 Dnscache 的事件（ID 7040/7036）

我会帮你进一步分析！