我经常使用 PowerShell 远程会话来远程管理 Windows 服务器,通常使用以下命令,但对于任何远程 powershell 命令,以下内容均适用,例如Invoke-Command
:
Enter-PSSession Server01
这对于该服务器本地的几乎所有内容都有效,但绝不允许您访问外部,例如:
PS C:\> Enter-PSSession Server01
[Server01]: PS C:\> Get-Item '\\Server02\Share\File'
get-item : Access is denied
进行这样的第二跳最简单、最安全的方法是什么?我有几个答案要补充,但它们通常都有警告。
答案1
使用Kerberos 约束委派为了让 Server01 能够向 Server02 验证您的身份:
Set-ADComputer 'Server02' -PrincipalsAllowedToDelegateToAccount (Get-ADComputer 'Server01')
以下是来自链接的 Microsoft 文档和我自己的一些优点/缺点:
优点
- 凭证未被存储。
- 单行设置。
- 无限期地保持配置。
- 一个清理命令:
Set-ADComputer -Identity 'Server02' -PrincipalsAllowedToDelegateToAccount $null
- AD 管理员可以代表其他人进行配置。
缺点
- 需要 Windows Server(和域级)2012 或更高版本。
- 不支持 WinRM 的第二跳。
- 需要权限才能更新 Active Directory 中的对象和服务主体名称 (SPN)。
- 由于 AD 复制时间或 KDC 缓存,可能不会立即生效(参见链接)。
- 始终适用于所有用户。
要查找现有委派(或您忘记删除的委派),请运行此命令以返回列表:
Get-ADComputer -Filter 'msDS-AllowedToActOnBehalfOfOtherIdentity -like "*"' -Properties msDS-AllowedToActOnBehalfOfOtherIdentity | Select Name,@{l='AllowedFrom';e={$_.'msDS-AllowedToActOnBehalfOfOtherIdentity'.Access.IdentityReference.Value}}
答案2
PSSessionConfiguration
使用以下命令将凭证保存到对象:
Invoke-Command -ComputerName 'Server01' -ScriptBlock {
Register-PSSessionConfiguration -Name 'MyUser' -RunAsCredential 'MyDomain\MyUser'
}
然后使用该配置进行连接和跳转:
PS C:\> Enter-PSSession -ComputerName Server01 -ConfigurationName MyUser
[Server01] PS C:\> Get-Item '\\Server01\Share\File'
# Successful
优点:
- 从技术上讲,只需一行即可设置
- 完成后还可以用一行完全清理:
Invoke-Command -ComputerName Server01 -ScriptBlock {Unregister-PSSessionConfiguration 'MyUser'}
- 凭证已加密
缺点:
- 凭证以可逆格式存储在远程计算机上,并且可能被盗由具有管理员权限的人员执行。
- 更改密码后,此配置将停止工作。(无论如何,您都不应该将凭证留在周围)
- 设置新配置需要重新启动 WinRM 服务才能使用,这会结束所有现有会话。(这可以通过将标志添加
-Force
到 来自动完成Register-PSSessionConfiguration
)
答案3
通过远程变量传递凭证对象:
$cred = Get-Credential
Invoke-Command -ComputerName Server01 -Credential $cred -ScriptBlock {
Invoke-Command -ComputerName Server02 -Credential $Using:cred -ScriptBlock {hostname}
}
优点:
- 无需提前设置。
- 远程服务器上未保存任何内容。
缺点:
$Using
变量仅在 中可用Invoke-Command
,而不在 PowerShell 会话中可用。- 需要带有标志的 cmdlet
-credentials
。Copy-Item
没有,但是Start-BitsTransfer
有,所以可能需要一些挖掘。