上下文:我使用 NTLMv2 身份验证在 Windows 中映射 cifs 共享,因为旧服务器不支持 kerberos。系统未提示我登录:
net use S: \\server.domain.com\share /persistent:yes
The command completed successfully.
在我更改密码之前,这都没问题。即使在多次注销并重新登录或重新启动后,Windows 似乎仍会继续尝试使用旧凭据进行连接。我发现唯一有效的方法是使用不同的主机名进行连接:
:: After changing password, restarting, and logging in with updated password
net use S: \\server.domain.com\share /persistent:yes
Enter the user name for 'server.domain.com'
:: running credentials failed, 'access denied' message logged on server
:: Manually entering credentials works:
net use S: \\server.domain.com\share /persistent:yes
Enter the user name for 'server.domain.com': DomainUser
Enter the password for 'DomainUser' to connect to 'server.domain.com':
The command completed successfully.
:: Using a different host name works
net use S: \\192.168.100.100\share /persistent:yes
The command completed successfully.
问题最终“消失”,但我认为该设备的 NTLM 令牌/会话/密钥在某个时候会过期,Windows 被迫创建一个新的。或者也许还有其他解释?我已经看过以下内容:
- 我发现有关 NTLMv2 的所有内容都表明重启后不会保留任何内容
- SMB 允许缓存文件,但我还没有找到一种方法来清除它,除非在注册表中禁用它
- 我仔细检查了
Kerberos 令牌Credential Manager 中的任何内容klist
以及 net
仅当您指定时才保存凭据/SaveCred
,并且无论如何都会被删除/delete
。
我想了解哪个函数可能导致此行为,或者将其缩小到某种错误。有什么想法吗?
编辑:经过对 wireshark 的一番摆弄后,我发现它是由字符串连接在一起的:
- 该服务器宣称它支持 Kerberos(尽管正常情况下不会创建 Kerberos 票证)。
- 客户端实际上尝试获取 kerberos 票证,但由于不支持加密类型而失败。它退回到 ntlm 并且成功了...
- 由于某些我还没有弄清楚的原因,尝试使用过期的凭据进行连接会导致客户端开始成功获取 kerberos 令牌,这是不正确的。
- 服务器无法使用令牌验证用户身份,因此拒绝访问。
答案1
凭证可能存储在凭证管理器,删除旧的凭据,Windows 将再次询问密码(或者直接在凭据管理器中编辑凭据并提供新密码)。
答案2
在 Powershell 中运行 net use * /delete 拯救了我,让我摆脱了类似的困境。我之前尝试过其他命令,但都无济于事。
答案3
我遇到了类似的问题,并使用不存在的用户名强制 Windows 10 忘记缓存的密码。以下是名为 server.local 的服务器的一些伪代码。根据您的情况,许多步骤可能不需要:
- 清除显式缓存的凭据:
cmdkey /delete:server.local- 删除所有网络连接:
net use /d \server.local- 检查是否没有其他连接:
net use- 强制 Windows 使用无效用户名和 CTRL-C 连接,当它卡住时:
net use \server.local\share /user:garbageuser- 再次使用正确的用户连接。cmdkey
/add:server.local /pass /user:correctuser
net use \server.local\share- 现在 Windows 文件资源管理器将能够再次连接。