在我们公司,我们有一个文件服务器,我想从那里运行脚本来更新远程计算机。
所有计算机都在一个域中。
当我在计算机上执行(PowerShell 是否以管理员身份运行)
Set-Location -Path "\\fileserver.company.org\scripts_folder\"
有用
当我在远程计算机(同一子网)上时,同一用户上述相同的命令有效。
但当我这样做
Enter-PSSession -ComputerName PC-NAME -Credential my_username
Set-Location -Path "\\fileserver.company.org\scripts_folder\"
Set-Location 返回
Set-Location : Access is denied
+ CategoryInfo : PermissionDenied: (\\fileserver.company.org\scripts_folder\:String) [Set-Location], Unauthoriz
edAccessException
+ FullyQualifiedErrorId : ItemExistsUnauthorizedAccessError,Microsoft.PowerShell.Commands.SetLocationCommand
为什么访问被拒绝?当我使用 PowerShell 时,它在哪个用户下运行Enter-PSSession
?
答案1
对我来说这看起来像double hop
或second hop problem
“第二跳问题”是指如下的情况:
- 您已登录到服务器A。
- 从 ServerA,启动远程 PowerShell 会话以连接到 ServerB。
- 通过 PowerShell 远程会话在 ServerB 上运行的命令尝试访问 ServerC 上的资源。
- 对 ServerC 上的资源的访问被拒绝,因为用于创建 PowerShell 远程会话的凭据未从 ServerB 传递到 ServerC。
在您的例子中,您的计算机是 ServerA,您进入会话的计算机是 ServerB,文件服务器是 ServerC
如果您的计算机使用的是 WMF 3.0 或更高版本,您可以创建一个PSSessionConfiguration
绑定了凭据的计算机。然后,您可以在 ServerB 上创建远程会话时使用此配置
要创建配置,请在 ServerB 上的提升的 PowerShell 中运行此命令,并使用有权访问 ServerC 上的资源的凭据
Register-PSSessionConfiguration -Name AdminCredConfig -RunAsCredential 'domain\mydomainaccount' -Force
PSSessionConfiguration
然后你可以在进入Session时指定创建的
Enter-PSSession -ComputerName ServerB -Credential my_username -ConfigurationName AdminCredConfig
Set-Location -Path "\\fileserver.company.org\scripts_folder\"
在我看来,这是解决你的问题最简单的方法。但是,有多种不同的方法可以解决第二跳问题,例如 CredSSP。你可以在微软文档
对于未使用 WMF 3.0 或更高版本的计算机,您必须在 Invoke-Command 脚本块中传递凭据,这也很容易实现,但不是很优雅,并且需要尴尬的编码。
或者,寻找一种甚至不需要担心第二跳问题的方法。
答案2
我找到了问题的根源。它被称为“第二跳问题”
“第二跳问题”是指如下的情况:
您已登录到服务器A。
从 ServerA,启动远程 PowerShell 会话以连接到 ServerB。
通过 PowerShell 远程会话在 ServerB 上运行的命令尝试访问 ServerC 上的资源。
对 ServerC 上的资源的访问被拒绝,因为用于创建 PowerShell 远程会话的凭据未从 ServerB 传递到 ServerC。