“昨天还能打开。”“文件资源管理器能打开,应用却失败。”“重启后又好了。”当每次尝试看上去都相同时,共享文件夹问题反而更难排查。
即使以为每次打开的都是同一个共享文件夹,只要目标名称、执行账户或已有连接不同,Windows 执行的处理就可能不同。找出这些差异,是调查的起点。
本文汇总了检查命令、结果的解读方式和下一步调查方向,而不是仅凭症状断定原因。Kerberos 和 NTLM 协议本身的机制见 NTLM 与 Kerberos 详解,应用设计方面见网络驱动器与 UNC 路径的常见问题。
1. 先看结论与症状索引
排查顺序是:能否到达 → 以谁的身份连接 → 采用什么身份验证与保护条件 → 该身份是否有权执行目标操作。对成功和失败的尝试,按相同格式记录这些条件。症状只是入口,不是已经确认的原因。
| 症状 | 首先检查 | 对应章节 |
|---|---|---|
| 名称与 IP 的结果不同 | 实际目标 IP,以及依赖名称的身份验证条件 | 通信、Kerberos |
| 只有文件资源管理器成功 | 应用的执行身份、会话与操作 | 执行条件 |
| 看起来不需要密码 | 共享服务器实际接受的账户 | 凭据 |
| 换用户连接失败或出现 1219 | 到同一服务器的已有连接 | 连接冲突 |
| 重启或注销后恢复 | 变更前后的状态差异 | 重启 |
| 更新后、部分 PC 或 NAS 才失败 | 签名、来宾与 NTLM 的实际生效设置 | 保护条件 |
| 能打开但不能保存 | 目标操作的权限与原始错误 | 权限与应用 |
flowchart TB
accTitle: 从症状转向证据的诊断流程
accDescr: 根据症状选择候选原因,比较成功与失败时的证据,再决定处理方法。
symptom["选择症状"] --> compare["比较成功与失败"]
compare --> evidence["通过日志缩小范围"]
evidence --> fix["逐项处理并复测"]
图1:用症状确定调查入口,检查证据后再决定处理方法。
本文适用于 Windows 11 与 Windows Server 的 SMB 2/3 共享,以及普通的 TCP 445 连接。PowerShell 示例以 Windows PowerShell 5.1 为前提。这是一篇面向管理员和开发者的中级文章,但没有共享服务器管理权限的读者,也可以先收集客户端信息。
请区分 AD 域、工作组内的 Windows 共享以及 NAS 自有账户。本文讨论常见的 AD Kerberos 和传统本地账户配置,不涵盖 SMB over QUIC、Azure Files 特有的身份验证,也不讨论 IAKerb、LocalKDC 的具体配置。使用 DFS 时,还应记录最终目标服务器。设置与默认值依据截至 2026 年 9 月 8 日已核实的官方资料;实际配置优先于根据操作系统名称作出的推测。
首先确认共享服务器被配置为接受哪类账户。 AD 用于集中管理组织账户,本地账户则由各台 PC 分别持有。NAS 既可以使用自有账户,也可以加入 AD。不要仅凭产品名称或所在位置,认定“公司局域网就用 Kerberos”或“NAS 就用 NTLM”;应向管理员确认身份验证配置。123
| 登录共享所用的账户 | 优先调查方向 |
|---|---|
| AD 域账户 | 检查通信后,确认名称、SPN 和票据,以及身份验证日志 |
| Windows 共享服务器的本地账户 | 先看使用的凭据与空密码、已有连接和保护条件 |
| NAS 自有账户 | 检查 NAS 的账户设置、身份验证日志,以及来宾、签名和 NTLM 限制 |
| 不清楚是哪种 | 保存客户端记录,并确认服务器实际接受的账户 |
“PC 是否加入域”和“本次使用了哪些凭据”也是两回事。下文中,CORP\alice 是域账户的示例,FILESRV01\alice 是共享服务器本地账户的示例。即使自己的 PC 上存在同名用户,也不代表该用户在共享服务器上具有相同权限。45
图中实线表示始终成立的关系,虚线表示带条件的关系(成立条件写在详情页各关系的说明中)。关系的完整列表(共 19 条,附依据与确信度)以及主要概念的定义,汇总在知识地图详情页(日文)。数据:JSON-LD / Turtle
2. 把“无法连接”拆成不同阶段
打开文件之前,需要建立通信、协商 SMB 条件、验证会话身份、连接共享,再执行文件操作。身份验证成功并不代表拥有共享或文件的访问权限。此外,“找不到网络路径”也可能与来宾连接被拒绝有关。不要仅凭显示的错误文字就断定是 DNS 故障。67
flowchart TB
accTitle: 打开共享文件之前的各个阶段
accDescr: 通信、SMB 条件协商、身份验证、共享连接和文件操作都可能分别失败。
net["名称解析与 TCP 连接"] --> negotiation["协商 SMB 条件"]
negotiation --> session["SESSION_SETUP:身份验证"]
session --> tree["TREE_CONNECT:连接共享"]
tree --> file["CREATE 等文件操作"]
图2:前一个阶段成功,不能证明下一个阶段也会成功。
这里的“成功”是指能够对目标文件执行目标操作。在文件资源管理器的“网络”中看到 PC 名称、看到共享列表、读取某个文件,并不等价。排查时应记录实际失败的 UNC 路径和操作,而不是只看列表是否显示。
3. 重启或修改设置前,先保留记录
一开始就删除连接或票据,会丢失原本需要比较的状态。首先在客户端记录时间、UNC 路径、用户、操作系统及已有连接。下面的命令用于查看状态。排查服务故障时,不能把这个交互式终端的结果当成服务自身的结果。489
Get-Date -Format o
whoami /user
whoami /groups
Get-CimInstance Win32_OperatingSystem |
Select-Object Caption, Version, BuildNumber
net use
cmdkey /list
klist
如果终端有查询 SMB 连接的权限,再收集以下信息。若被拒绝访问,应记录为“无法查询”,而不是“没有连接”。使用管理员身份重新收集的结果,需要明确标记执行条件。未经说明就把整个调查切换为提升权限的环境,会改变正在比较的登录会话。410
Get-SmbConnection | Format-List *
| 记录 | 能说明什么 | 单凭它不能说明什么 |
|---|---|---|
whoami |
该命令在本地的执行身份 | 共享服务器接受的账户 |
net use |
当前上下文可见的共享连接与映射 | 其他会话的连接状态 |
cmdkey /list |
哪些目标保存了凭据 | 本次是否使用了这些凭据 |
Get-SmbConnection |
已建立的连接、凭据等属性 | 连接失败的完整过程或最终使用的身份验证协议 |
klist |
目标登录会话持有的票据 | 本次 SMB 连接实际使用的身份验证协议 |
查看 Get-SmbConnection 时,除了 UserName,也要检查 Credential。本地登录身份与连接共享所用的凭据可能不同。并排比较成功与失败时的 ServerName、ShareName、UserName 和 Credential,有助于确认比较的是否为同一连接。4
flowchart TB
accTitle: 已保存的信息与正在使用的状态
accDescr: 分别观察已保存的凭据、SMB 连接和 Kerberos 票据。
snapshot["在同一时间记录"] --> stored["已保存的凭据"]
snapshot --> connection["已建立的 SMB 连接"]
snapshot --> ticket["票据缓存"]
stored -.-> verify["结合日志确认实际使用情况"]
connection --> verify
ticket -.-> verify
图3:区分已保存的内容与问题连接实际使用的内容。
这些输出包含用户名、内部服务器名、IP 地址等信息。应限制记录的访问范围,对外提供时进行匿名化,同时保留比较所需的对应关系。无需公开密码、哈希或票据本身。
4. 先检查名称解析与 TCP 445
下面是在客户端执行的主动通信测试。请把服务器名替换为实际使用的连接名称,分别记录名称解析与 TCP 连接结果。11
$Server = 'filesrv01.corp.example.com'
Resolve-DnsName -Name $Server
Test-NetConnection -ComputerName $Server -Port 445 -InformationLevel Detailed
如果 TcpTestSucceeded 为 False,此时应优先调查身份验证之前的可达性。检查目标 IP、VPN 与路由、客户端和服务器的防火墙,以及服务器是否监听。ping 的成败不等于 TCP 445 的成败。反过来,TCP 成功也不能证明共享名、身份验证、签名和权限均无问题。11
flowchart TB
accTitle: 如何解读 TCP 连接测试
accDescr: TCP 445 失败时调查可达性,成功后继续检查 SMB 及后续阶段。
tcp["测试 TCP 445"] --> result{"是否成功"}
result -->|"否"| route["检查目标、路由与阻断"]
result -->|"是"| smb["检查 SMB、身份验证与权限"]
图4:TCP 成功不是身份验证成功,只能说明可以继续检查下一阶段。
如果名称与 IP 的行为不同,比较 RemoteAddress 和名称解析结果。短名称、FQDN、别名不一定到达同一个 IP。即使 IP 相同,下一节的身份验证条件仍需单独检查。通过换名称“修好”时,也要记录具体改变了什么。
5. 名称与 IP 结果不同时,检查 Kerberos 前提
5.1. 同一个 IP 不代表同一种身份验证
默认情况下,Windows 不会在目标名称为 IP 地址时尝试 Kerberos。虽然可以通过 TryIPSPN 和基于 IP 的 SPN 配置例外,但本文的常规处理方向是建立正确的 DNS 名称与服务身份对应关系。IP 访问成功可以帮助比较名称解析、身份验证和已有连接,却不能证明这就是长期解决方案。12
flowchart TB
accTitle: 连接名称会改变身份验证条件
accDescr: 使用主机名时检查对应的 Kerberos 服务名称条件,使用 IP 时考虑默认不尝试 Kerberos 的行为。
unc["UNC 中的目标写法"] --> name["主机名或 FQDN"]
unc --> ip["IP 地址"]
name --> spn["检查名称对应的 SPN"]
ip --> fallback["默认不尝试 Kerberos"]
图5:即使指向同一设备,连接名称改变后,身份验证条件也会改变。
Kerberos 使用称为 SPN 的服务标识请求票据。DNS 别名能够解析,与能否正确验证该别名对应的服务,是两回事。另外,并不是所有 Kerberos 失败都会回退到 NTLM。应根据实际日志区分能否回退、身份验证错误,以及 NTLM 是否受到限制。131
5.2. 区分取得票据与服务器接受票据
在 AD 环境中,管理员需要调查连接所用名称的 SPN 注册对象。以下是可查询 AD 的管理终端上的只读查询示例。执行前确认具备查询权限与所需管理工具。14
setspn -Q cifs/filesrv01.corp.example.com
setspn -Q HOST/filesrv01.corp.example.com
不能仅因没有显式注册 cifs/... 就断定缺少 SPN。对于计算机账户,HOST SPN 可以替代 cifs 等服务类。反过来,即使存在注册,也可能注册到了并非实际服务身份的账户,或者存在重复注册。应由 AD 管理员确认归属后修改,不能因为没查到就机械地添加。14
flowchart TB
accTitle: SPN 与票据检查的证明范围
accDescr: SPN 解析、取得票据以及共享服务器接受票据是三个不同的检查。
lookup["SPN 归属与 HOST 替代"] --> issue["能否取得票据"]
issue --> accept["实际 SMB 身份验证是否接受"]
accept --> logs["关联服务器端日志"]
图6:能够取得票据,不代表共享服务器一定会接受它。
必要时,保存原始状态后再尝试 klist get cifs/filesrv01.corp.example.com。这会请求新票据并改变缓存,属于主动测试。若失败,调查 DC 可达性、时间同步、名称与 SPN;即使成功,也不保证 SMB 访问成功。不要把交互式用户的票据结果套用到服务中发生的问题上。81
对于没有域的 NAS 或本地账户身份验证,应先确认共享支持的协议和账户设置,而不是先修复 AD SPN。即使环境启用了更新的身份验证功能,也应以连接记录为准,不根据产品名推测协议。
6. 文件资源管理器能打开,应用却打不开
6.1. 不能只凭用户名相同就认为条件一致
需要比较执行账户、登录会话、是否提升权限、UNC 路径及操作。服务即使配置为同一用户账户,也会在不同于交互式登录的会话中运行。驱动器号映射同样属于各自的登录会话,因此先区分 Z:\data 和 \\server\share\data。改用 UNC 是解决驱动器号问题的方法,并不会同时赋予身份验证能力或访问权限。10
flowchart TB
accTitle: 文件资源管理器与服务的区别
accDescr: 即使在同一台 PC 上,也应分别比较交互式登录和服务的会话与凭据。
pc["同一台 PC"] --> explorer["交互式登录"]
pc --> service["服务登录"]
explorer --> a["该会话的连接与权限"]
service --> b["另一会话的连接与权限"]
图7:同一台 PC、同一个用户名,不代表共享相同的连接状态。
让失败的应用记录进程 ID、执行身份、权限提升状态、实际路径、操作名、原始异常与错误码。使用模拟身份时,还应记录执行该操作的线程的有效身份。不能因为管理员 PowerShell 可以打开共享,就结束对服务的调查。
6.2. 服务账户与任务的登录方式
服务使用默认凭据时,LocalSystem 会向网络目标提供计算机凭据,LocalService 则提供匿名凭据。域环境中要允许 LocalSystem 访问共享,应关注计算机账户等实际使用身份的权限,而不是交互式用户的权限。若实现使用显式凭据或模拟身份,则需另外确认这些条件。1516
flowchart TB
accTitle: 本地权限与远程身份
accDescr: 使用默认网络凭据时,LocalSystem 与 LocalService 提供的身份不同。
service["服务的默认凭据"] --> system["LocalSystem"]
service --> local["LocalService"]
system --> machine["计算机凭据"]
local --> anonymous["匿名凭据"]
图8:本地权限很高,不代表共享服务器会把服务当成交互式用户。
在任务计划程序中,除账户名外还要检查登录方式。TASK_LOGON_S4U 不保存密码,也不提供对网络或加密文件的访问能力。不要把选择“不存储密码”的任务视为与普通交互式登录条件相同。业务处理应使用合适的服务账户、登录方式和最小权限,不应依赖每次先在文件资源管理器中打开共享。17
7. 把“无需密码即可访问”分成四种情况
没有输入提示不等于未经身份验证。连接可能使用当前登录凭据、已保存的凭据或已经建立的 SMB 会话。仅在 cmdkey /list 中看到条目,也不能证明实际使用了它。49
| 表面现象 | 需要确认的实际情况 |
|---|---|
| 没有输入密码 | 是否通过登录凭据或已保存的凭据完成了身份验证 |
| 以前验证过,这次没有再询问 | 是否复用了已有 SMB 会话 |
| 共享服务器的本地账户没有密码 | 是否适用空密码限制 |
| 共享服务器以来宾身份接受连接 | 来宾访问是否满足签名与加密条件 |
flowchart TB
accTitle: 没有密码提示意味着什么
accDescr: 不根据输入提示判断是否未经验证,而是区分凭据、已有会话、空密码账户和来宾。
prompt["没有显示密码输入界面"] --> identity["确认实际接受的身份"]
identity --> authenticated["凭据或已有会话"]
identity --> blank["空密码账户"]
identity --> guest["来宾"]
图9:界面看上去相同,背后的身份验证机制却可能完全不同。
共享服务器运行 Windows,且在该服务器上启用了“使用空密码的本地账户只允许进行控制台登录”策略时,会限制空密码本地账户的普通网络登录。这与允许来宾的设置是两回事。遇到“用户没有密码,但以前能连接”的说法,应先在服务器上核实:之前是否真的用该账户完成了身份验证。不要首先禁用限制,应考虑使用具有密码且权限合适的共享访问账户。23
如果有 Windows 共享服务器的管理权限,应在访问仍然成功时,在该服务器的管理员 PowerShell 中执行以下查询。不要混淆在客户端运行的 Get-SmbConnection 和在接受连接的服务器端运行的 Get-SmbSession。18
Get-SmbSession |
Select-Object SessionId, ClientComputerName, ClientUserName, NumOpens
根据 ClientComputerName 和尝试时间寻找目标会话,再检查 ClientUserName。这显示的是当前已建立的 SMB 会话,不能说明过去连接失败的原因,也不能判断使用的是 Kerberos 还是 NTLM。同一客户端存在多个会话时,还要关联应用操作时间和 SMB 专用记录。如果连接已经断开,转到第12节的日志检查。18
8. 1219 与更换用户后无法重新连接
错误 1219 表示到同一服务器的多个连接使用不同用户名而产生冲突。即使共享名不同,到该服务器的已有连接仍可能相关。先用 net use 和 Get-SmbConnection 检查目标服务器的连接,在更换凭据前确认打开的文件及正在使用连接的应用。1920
flowchart TB
accTitle: 不同共享之间也会发生凭据冲突
accDescr: 在同一连接上下文中,以另一用户新增到同一服务器的连接,即使共享名不同也可能冲突。
existing["已以用户 A 连接服务器"] --> new["以用户 B 连接另一共享"]
new --> conflict["凭据冲突:1219"]
conflict --> inspect["按服务器检查已有连接"]
图10:不仅要看共享名,还要看目标服务器与使用凭据的组合。
以下操作会改变连接状态。只有在停止使用目标并获得影响范围的批准后,才针对已经确认的具体连接执行断开与重连。请替换示例中的服务器名、共享名和账户名。* 表示通过交互提示输入密码,不要把密码写在命令行中。5
net use "\\filesrv01.corp.example.com\data" /delete
net use "\\filesrv01.corp.example.com\data" /user:CORP\alice * /persistent:no
断开一个共享后,同一服务器上仍可能有其他共享或其他用途的连接。再次查看列表,仅清理目标服务器上必要范围内的连接。不应默认执行 net use * /delete,也不应长期依靠别名或 IP 绕开冲突。处理后,要确认原应用能够使用预期凭据连接。
9. 重启后恢复时,追查究竟改变了什么
重启会改变多个状态,因此仅凭恢复正常的结果,无法反推出唯一原因。下表是调查时的比较维度,并不保证某项操作一定只重置表中所列范围。489
| 操作或信息 | 比较时应注意 |
|---|---|
| 重启应用 | 应用状态改变,但操作系统的共享连接可能仍然存在 |
| 断开并重连目标共享 | 检查是否重新建立连接并验证身份,以及其他连接是否仍在 |
| 注销或重启操作系统 | 会话、应用、网络等多个条件同时变化 |
| 已保存的凭据 | 与已建立的连接不同,通常不会仅因操作系统重启就被删除 |
flowchart TB
accTitle: 如何理解重启后的恢复
accDescr: 重启会同时改变多个条件,因此恢复正常本身无法确定唯一原因。
reboot["重启后恢复"] --> app["应用状态"]
reboot --> session["连接与登录状态"]
reboot --> network["网络等状态"]
app --> evidence["需要变更前后的证据"]
session --> evidence
network --> evidence
图11:重启可以是恢复手段,但不自动构成原因的证明。
例如,假设成功时已经存在以另一账户建立的 SMB 连接,而失败时需要重新验证身份。这个假设案例中,要调查的是非预期凭据与新身份验证失败的原因,而不是重启本身。对成功和失败两种情况统一记录时间、连接名、执行条件及接受的账户,下一步检查就会更明确。
即使急需通过重启恢复服务,也应尽可能先保存第3节的输出和原始错误。重启后,先在原应用中执行相同操作,不要先用文件资源管理器打开共享。中间插入其他操作,会让人难以区分究竟是重启恢复了访问,还是该操作改变了连接条件。这不是禁止重启,而是兼顾恢复与原因调查的记录步骤。
klist purge 会删除票据,是改变状态的操作。对于没有使用 Kerberos 的连接,它并不针对问题,也可能影响同一登录会话中的其他服务。不要在保存证据前“先清空再说”。8
10. 更新后或只有部分 PC 失败
10.1. 不要混淆签名、来宾与 NTLM 阻止策略
SMB 签名用于检测通信内容是否被篡改,与采用 Kerberos 还是 NTLM 的身份验证协议属于不同设置。Microsoft 的 SMB 签名专用指南说明,Windows 11 24H2 的 Pro、Enterprise、Education 默认要求入站和出站签名,Windows Server 2025 默认要求出站签名。不仅要看操作系统名称,还要确认版本和实际生效配置。7
对于 Home,该指南说明不要求签名,但 Windows 11 24H2 的变更列表又将 Home 列入默认要求签名的版本,资料之间存在差异。本文不会因为系统是 Home 就排除签名问题,而是通过下面的命令检查调查对象的实际设置。721
flowchart TB
accTitle: 分别检查 SMB 的保护条件
accDescr: 身份验证协议、SMB 签名与来宾访问不是同一设置,需要分别确认。
policy["检查实际生效的策略"] --> auth["Kerberos 与 NTLM 是否允许"]
policy --> signing["是否要求 SMB 签名"]
policy --> guest["是否允许来宾连接"]
图12:检查了一个设置,不代表其余条件也已经满足。
来宾连接不支持普通的 SMB 签名与加密。因此,只修改来宾许可,而签名要求仍然存在时,问题可能不会解决。应优先让 NAS 使用经过身份验证的账户并支持签名,不要轻率地以禁用签名或安装 SMB1 作为绕过方法。3
10.2. 看实际配置,而不是只看默认值
在客户端的管理员 PowerShell 中收集以下信息。这是在读取配置,应与交互式用户的连接状态记录分开。722
$config = Get-SmbClientConfiguration
$config | Format-List RequireSecuritySignature, EnableInsecureGuestLogons
if ($config.PSObject.Properties['BlockNTLM']) {
$config | Format-List BlockNTLM
} else {
'BlockNTLM property is not exposed on this system.'
}
RequireSecuritySignature: False 表示“不强制要求”,不能证明所有连接都不使用签名。较旧系统没有显示 BlockNTLM,也不能证明没有其他 NTLM 限制策略。SMB 客户端的 NTLM 阻止功能从 Windows 11 24H2/Windows Server 2025 起提供,也可以为单个共享连接指定。因此,除了全局设置,还要检查应用的连接选项与组织策略。722
flowchart TB
accTitle: 连接条件不只由全局设置决定
accDescr: 除了操作系统默认值,还要检查组织策略、连接选项及服务器端条件。
defaults["操作系统与版本的默认值"] --> effective["实际连接条件"]
organization["组织策略与连接选项"] --> effective
server["共享服务器的支持条件"] --> effective
effective --> log["从日志确认拒绝原因"]
图13:时间上与更新重合只是线索,应根据实际设置和拒绝日志作出判断。
“NTLM 弃用”“移除 NTLMv1”“通过策略拒绝 NTLM”并不是同一件事。协议迁移与组织级审计请参阅 NTLM 退役的审计与迁移步骤,本文集中确认本次连接被哪个条件拒绝。
11. 身份验证成功,却无法打开或保存
Windows 共享需要同时检查共享权限,以及实际文件夹和文件的权限。对于同一身份执行的同一操作,两处都必须允许。还要确认组成员身份、拒绝条目和继承关系,不能认为“添加了 Everyone 就一定全部能访问”。检查有效访问权限时,应使用服务器上的实际存储路径,以及服务器真正接受的身份。23
flowchart TB
accTitle: 身份验证与访问授权的区别
accDescr: 即使身份验证成功,共享权限和文件权限也都必须允许目标操作。
identity["已验证的身份"] --> share["共享访问权限"]
share --> file["实际文件的访问权限"]
file --> operation["执行目标操作"]
图14:确认是谁,与判断允许做什么,是两道不同的检查。
列出文件夹、读取文件、新建、覆盖、重命名和删除是不同操作。有些应用保存时先创建临时文件再替换原文件,仅证明“能够读取”是不够的。除了身份验证与权限,还应根据原始错误调查共享冲突、容量、路径或文件被删除等问题。24
.NET 的 File.Exists 在权限不足等情况下也会返回 false。检查应用显示的“文件不存在”是否仅依据该返回值生成。诊断代码同样应记录实际目标操作抛出的异常。25
$Path = '\\filesrv01.corp.example.com\data\sample.txt'
try {
Get-Item -LiteralPath $Path -ErrorAction Stop |
Select-Object FullName, Length, LastWriteTime
} catch {
$_.Exception.GetType().FullName
'HRESULT=0x{0:X8}' -f $_.Exception.HResult
$_.Exception.Message
}
这只验证能否读取元数据,并不能证明能够读取或写入文件内容。测试实际读写时,应在确认授权和影响范围后,使用测试文件复现目标操作。不要把所有错误都转换成“文件不存在”,这样也有利于下次排查。
12. 关联日志,缩小原因范围
12.1. 区分客户端、共享服务器与 DC
在客户端,检查事件查看器中的 Microsoft-Windows-SMBClient/Connectivity 与 Microsoft-Windows-SMBClient/Security。在 Windows 共享服务器上,如果已启用审计,Security 日志的 4624(登录成功)和 4625(登录失败)可提供线索。对于 SMB 网络登录,检查登录类型 3。NAS 则使用产品自己的身份验证与共享日志。262728
事件 4624 的登录类型 3 并非 SMB 专用。即使时间、来源和账户一致,该事件本身也不能标识共享名或 SMB 会话。应结合 Get-SmbConnection、SMB 专用日志,以及必要时的跟踪记录进行关联。27426
flowchart TB
accTitle: 关联三个位置的日志
accDescr: 按时间与连接信息关联客户端、共享服务器,以及必要时的 DC 日志。
client["客户端:SMBClient 日志"] --> match["关联时间、来源与账户"]
server["共享服务器:身份验证日志"] --> match
dc["DC:票据与凭据验证"] --> match
match --> result["作为同一次尝试的证据读取"]
图15:不对齐位置与时间,容易把另一条连接的日志误认为故障原因。
以下示例应在 Windows 共享服务器上,以有权读取 Security 日志的身份执行。在目标尝试前记录时间,并请管理员确认所需的成功与失败审计已经启用。示例提取最近十分钟的记录,通过 XML 字段名取值,而不是依赖已翻译的消息文本或字段位置。2728
$Start = (Get-Date).AddMinutes(-10)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'; Id = 4624, 4625; StartTime = $Start
} -ErrorAction Stop | ForEach-Object {
$event = $_
$xml = [xml]$event.ToXml()
$fields = @{}
foreach ($item in $xml.Event.EventData.Data) {
$fields[$item.Name] = [string]$item.'#text'
}
if ($fields['LogonType'] -eq '3') {
[pscustomobject]@{
Time = $event.TimeCreated
EventId = $event.Id
User = $fields['TargetUserName']
Domain = $fields['TargetDomainName']
SourceIp = $fields['IpAddress']
Authentication = $fields['AuthenticationPackageName']
Status = $fields['Status']
SubStatus = $fields['SubStatus']
LogonId = $fields['TargetLogonId']
}
}
} | Format-List
对于 4624,应读取新登录的目标账户,不要与报告该事件的 Subject 混淆。4625 中的目标用户名是尝试使用的名称,不是已经接受的身份。结合 Status 与 SubStatus 判断失败原因。如果 AuthenticationPackageName 只显示 Negotiate,不能仅凭这一项确定使用了 Kerberos 还是 NTLM。2728
12.2. 没有日志,或只有票据时怎么办
找不到事件并不能证明没有发生身份验证。应检查是否启用审计、是否有读取权限、时钟是否一致、是否查看了正确服务器、是否复用已有会话,以及是否在身份验证前就失败。复用已有 SMB 连接时,并不会每打开一次文件就生成一条新的 4624。274
flowchart TB
accTitle: 没有日志时如何判断
accDescr: 事件缺失时应检查收集条件和已有会话,不要立即判断为没有身份验证。
absent["没有匹配的事件"] --> collection["审计、权限、时间与目标"]
absent --> reuse["复用已有会话"]
absent --> before["在身份验证前失败"]
图16:没有记录,与该操作从未发生,不是同一回事。
在 AD 环境中,DC 的 4769 可用于确认 Kerberos 服务票据请求,4776 可用于确认 NTLM 凭据验证。但签发票据不能证明共享服务器使用或接受了它,仅有 4776 也不能确定目标服务就是 SMB。需要关联时间、来源、目标账户与共享服务器记录;若仍有不明确之处,再由管理员进行范围受控的跟踪采集。2930
13. 处理后,确认能够稳定运行
每次只做一项处理,并记录变更理由及前后证据。名称错误就修正名称与目标;凭据不同就统一为预期账户;不支持签名就完善共享服务器的支持。没有查明原因便批量禁用保护功能,并不能建立可靠的运行方式。
flowchart TB
accTitle: 从单次成功到验证是否复发
accDescr: 完成一项处理后,按原来的失败条件以及重新连接条件验证结果。
evidence["能说明原因的记录"] --> change["一项针对性处理"]
change --> original["验证原应用与原操作"]
original --> reconnect["重连与重启后再次验证"]
reconnect --> record["保留前后差异与结果"]
图17:应验证原来的失败条件已经成功,而不是只确认文件资源管理器曾打开过一次。
| 调查记录 | 应保留的内容 |
|---|---|
| 环境 | 客户端与共享服务器的操作系统、版本、内部版本号,以及 AD 或 NAS 自有身份验证 |
| 复现条件 | 时间与时区、UNC、目标 IP、应用、身份、权限提升状态、操作 |
| 证据 | 原始错误、已有连接、使用的凭据、相关事件 |
| 处理 | 一项变更、理由、影响范围、回退方法 |
| 验证 | 相同操作的结果,以及必要时注销、重启、VPN 重连后的结果 |
本文无法唯一确定所有实现或网络配置的故障原因。不过,只要知道在哪个阶段失败、哪些条件与成功时不同,以及哪些信息仍未核实,下一步调查就能具体起来。不要停留在“重启就好了”,而要确认预期身份确实能通过预期路径连接。
参考链接
-
Microsoft Learn, Kerberos authentication troubleshooting guidance. 检查名称、时间、DC 和错误。 ↩ ↩2 ↩3
-
Microsoft Learn, Accounts: Limit local account use of blank passwords to console logon only. 限制空密码本地账户的策略。 ↩ ↩2
-
Microsoft Learn, Insecure guest logons in SMB2 and SMB3. 来宾连接及签名、加密的限制。 ↩ ↩2 ↩3
-
Microsoft Learn, Get-SmbConnection. 查询已建立的 SMB 连接与凭据。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn, SMB troubleshooting guidance. SMB 通信与故障调查的入口。 ↩
-
Microsoft Learn, Control SMB signing behavior. 各操作系统及版本的默认值与签名要求。 ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Services and Redirected Drives / Mapped drives are not available from an elevated prompt. 服务及提升权限时的登录会话与驱动器映射。 ↩ ↩2
-
Microsoft Learn, Test-NetConnection. 诊断 TCP 端口与连接目标。 ↩ ↩2
-
Microsoft Learn, Configuring Kerberos over IP. IP 目标的默认行为与例外配置。 ↩
-
Microsoft Learn, Service principal names. 用于标识服务的 SPN。 ↩
-
Microsoft Learn, LocalSystem Account. 向远程服务器提供计算机凭据。 ↩
-
Microsoft Learn, LocalService Account. 网络上的匿名凭据。 ↩
-
Microsoft Learn, TASK_LOGON_TYPE enumeration. S4U 登录的网络访问限制。 ↩
-
Microsoft Learn, Get-SmbSession. 在共享服务器上查询已建立的 SMB 会话与客户端账户。 ↩ ↩2
-
Microsoft Learn, System Error Codes (1000–1299). ERROR_SESSION_CREDENTIAL_CONFLICT 的定义。 ↩
-
Microsoft Learn, Cannot use different credentials for a network share. 使用不同凭据连接同一服务器的问题。 ↩
-
Microsoft Learn, What’s new in Windows 11, version 24H2 for IT pros. SMB 签名默认要求的变更列表。注意其中关于 Home 的说明与 SMB 签名专用指南存在差异。 ↩
-
Microsoft Learn, Block NTLM connections on SMB. 全局与单个连接的 NTLM 阻止设置。 ↩ ↩2
-
Microsoft Learn, Access control overview. 身份、访问权限、继承与有效访问权限。 Microsoft Learn, SMB share and NTFS permissions. ↩
-
Microsoft Learn, File Security and Access Rights. 不同文件操作所需的访问权限。 ↩
-
Microsoft Learn, File.Exists. 访问失败时也可能返回 false 的行为。 ↩
-
Microsoft Learn, SMB troubleshooting guidance. SMB 事件日志与进一步调查。 ↩ ↩2
-
Microsoft Learn, 4624: An account was successfully logged on. 新登录与身份验证包的记录。 ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, 4625: An account failed to log on. 尝试使用的账户、Status 与 SubStatus。 ↩ ↩2 ↩3
-
Microsoft Learn, 4769: A Kerberos service ticket was requested. DC 上的服务票据请求记录。 ↩
-
Microsoft Learn, 4776: The computer attempted to validate the credentials for an account. NTLM 凭据验证记录。 ↩
相关文章
共享相同标签的最新文章。可以围绕相近的主题进一步加深理解。
SMB 签名与 LDAP 通道绑定 ── 用实务收紧 NTLM 对策的「另一半」
在停用 NTLM 之前,用来抑制中继攻击损害的防御手段就是 SMB 签名与 LDAP 签名・通道绑定。本文从实务角度整理各操作系统的默认值、审核事件的解读方法、推进到强制的步骤,直至业务应用与设备的修复方法。
图解 NTLM 与 Kerberos ── 为什么认证会「回退」到 NTLM
本文通过图解整理 NTLM 与 Kerberos 的区别,涵盖挑战/响应机制、TGT 与服务票据、SPN 无法解析时 Negotiate 回退到 NTLM 的条件、中继攻击与 Pass-the-Hash 得以成立的原因,直至 NTLMv1 被移除,并附有官方文档依据。
NTLM 停用会导致业务应用停止运行吗 ── 审核日志的获取方法与消除依赖的顺序
围绕 NTLM 停用,本文整理了排查自身 Windows 环境与业务应用在何处依赖 NTLM 的步骤。内容涵盖审核策略、NTLM/Operational 日志中事件 8001~8004 的追踪方法、回退到 NTLM 的典型模式及修复方式,直至 SMB 的 NTLM 拦截功能。
Windows 名称解析的顺序 ── hosts、DNS 缓存、LLMNR/mDNS 与 DoH
「解析不了名称」「只有部分电脑连不上」,结果取决于是 hosts、DNS 缓存、DNS 服务器还是 LLMNR/mDNS 给出的答案。本文从机制上梳理 Windows 名称解析的顺序与 DoH 改变了什么,并讲解按层排查的步骤。
从睡眠恢复后损坏的应用 ── Windows 电源事件机制与扛得住恢复的业务应用
打开笔记本后业务应用的连接全断了——原因是设计从未考虑睡眠。本文根据一手资料整理 WM_POWERBROADCAST 通知流程、Modern Standby 行为、断开/重连设计、睡眠抑制与调查命令。
相关主题
与本文相近的主题页面。以本文为起点,可以进一步了解相关服务和其他文章。
Windows 技术主题
汇整 KomuraSoft LLC 关于 Windows 开发、故障调查与既有资产活用文章的主题中心。
常见问题
汇总了咨询这一主题时常见的问题。
- 重启后能访问共享文件夹了,是否说明原因就是缓存?
- 仅凭这一点无法确定。重启会同时改变应用、登录会话、SMB 连接和网络状态等条件。重启前应记录目标、执行身份、已有连接、票据和错误,再与成功时比较。已保存的凭据和已建立的 SMB 连接不是同一回事。
- 为什么用 IP 地址能打开共享,用服务器名却不行?
- 先确认两种写法是否到达同一个目标 IP。即使 IP 相同,身份验证条件也不同:默认情况下,Windows 不会对 IP 地址目标尝试 Kerberos。应分别排查名称解析、SPN 和身份验证问题,不能把通过 IP 访问成功直接当作长期解决方案。
- 为什么文件资源管理器能打开共享,应用却打不开?
- 执行账户、登录会话、权限提升状态、使用的凭据或执行的操作可能不同。服务与交互式登录运行在不同会话中。用户名相同并不代表条件相同,应检查失败进程本身的信息以及服务器端的身份验证记录。
- 访问共享时没有输入密码,是否就是来宾连接?
- 仅凭没有密码提示无法判断。连接可能使用当前登录凭据、已保存的凭据或已有 SMB 连接。空密码本地账户与来宾连接也不是同一回事,需要确认共享服务器实际接受了哪个账户。
- klist 中存在 cifs 票据,就能说明 SMB 使用了 Kerberos 吗?
- 持有票据与在当前 SMB 连接中使用该票据是两回事。需要按连接时间、来源和账户关联服务器日志。klist get 会发起新的票据请求,并不是只观察原有状态的命令。