New-PSDrive同一凭据映射部分路径报密码错误的原因与解决
我使用以下PowerShell脚本映射网络驱动器:
New-PSDrive -Name X -PSProvider FileSystem -Root "$DeployLocation" -Credential $credentials New-PSDrive -Name K -PSProvider FileSystem -Root "$autobuildSourceFiles" -Credential $credentials
执行时X盘映射成功,但K盘映射失败,报错:
InvalidOperation: The specified network password is not correct
令人困惑的是两次调用使用的是完全相同的$credentials对象,既然一次成功,密码理论上不应存在错误。
相关变量定义如下:
$DeployLocation = "\\dev-server\DevFiles\Technical\MyProjectNameHere" $autobuildSourceFiles = "\\mainshare\build`$\Technical\MyProjectNameHere\1.0.0.94"
$credentials对应的用户对$DeployLocation拥有读写权限,对$autobuildSourceFiles拥有只读权限,权限差异应该不会导致密码错误提示。
我已尝试以下操作:
- 调换命令调用顺序,结果仍为K盘映射失败;
- 更换驱动器盘符(尝试过Y盘);
- 将成功的命令替换为失败的路径,依旧失败。
注:使用的是Windows系统上的PowerShell 5.1.14393.5127版本。
请问该错误的原因是什么,如何解决?
原因分析
这个问题的核心是Windows身份验证上下文的复用规则:当你第一次用$credentials访问\\dev-server后,Windows会将该凭据缓存到对应服务器的身份验证上下文里。而第二个路径\\mainshare属于另一台服务器,此时系统可能尝试复用之前的凭据缓存,但由于两台服务器的身份验证环境差异(比如分属不同域/工作组,或SPN配置不一致),导致凭据无法跨服务器复用,进而抛出了“密码不正确”的误导性提示。
另外,路径中的build$是隐藏共享,Windows处理隐藏共享的身份验证流程存在细微差异,叠加跨服务器凭据缓存冲突,最终触发了这个错误。
解决方法
使用完整的用户名格式
确保$credentials中的用户名采用UPN格式(如user@domain.com)或域\用户名格式(如DOMAIN\user),若为本地用户则用服务器名\用户名格式,避免系统对不同服务器的身份解析出现歧义。清除缓存凭据后重新映射
先清除已缓存的服务器凭据,再执行映射命令:# 清除dev-server的凭据缓存 cmdkey /delete:dev-server # 清除mainshare的凭据缓存 cmdkey /delete:mainshare # 重新执行映射 New-PSDrive -Name X -PSProvider FileSystem -Root "$DeployLocation" -Credential $credentials New-PSDrive -Name K -PSProvider FileSystem -Root "$autobuildSourceFiles" -Credential $credentials改用New-SmbMapping命令
New-SmbMapping是专门针对SMB共享的映射cmdlet,在处理跨服务器身份验证时比New-PSDrive更稳定:New-SmbMapping -LocalPath "X:" -RemotePath "$DeployLocation" -Credential $credentials New-SmbMapping -LocalPath "K:" -RemotePath "$autobuildSourceFiles" -Credential $credentials检查域服务器SPN配置
若处于域环境,确认mainshare服务器的SPN(服务主体名称)配置正确,避免Kerberos身份验证失败。可使用以下命令检查:setspn -L mainshare确保结果包含
cifs/mainshare和cifs/mainshare.domain.com(替换为实际域名)。
内容的提问来源于stack exchange,提问作者Vaccano

