众所周知,为了避免Powershell 第二跳问题当使用 Powershell Remoting 时,需要设置 CredSSP 客户端和服务器设置。
例如
# On the client, a.k.a the First Hop Server
Enable-WSManCredSSP -Role "Client" -DelegateComputer "secondhop.example.com"
# On the server, a.k.a the Second Hop Server
Enable-WSManCredSSP -Role "Server"
现在我可以通过 PSRemote 连接到“客户端”服务器并从那里访问“服务器”服务器上的资源。一切都很好。
然而,环境很大,我想知道“客户端委托计算机”在大量机器上的效果.我该如何实现这个目标?
我知道我可以(Get-WSManCredSSP)[0]
获取客户端 DelegateComputers 列表。但这显示为一个丑陋、笨拙的字符串,我会非常不喜欢解析,因为这是 Powershell 并且我喜欢面向对象的方法。
我认为我已经wsman:/
使用Get-Item
和到处搜索过Get-WSManInstance
,并且用 Google 搜索过所有 Google 内容。
这似乎令人难以想象,这太难以捉摸了,我一定是错过了一些令人尴尬的简单的事情。
因此 ServerFault,如何通过本机 Powershell 或直接使用 .NET 调用获得一个呈现良好的 CredSSP Client DelegateComputers 数组或类似数组在给定的主机上?
我可以运行 Win2008r2 和 Win2012r2 上可用的任何版本的 .NET Framework 和 Powershell。
答案1
事实证明,谷歌实际上多了一个页面,答案就在这里。
客户端 DelegateComputer 列表存储在 Windows 注册表中的以下位置:
HKLM:\software\policies\microsoft\windows\CredentialsDelegation\AllowFreshCredentials
阅读这个关键并不好看,但比其他选择要好。
因此,Victor Vogelpoel,这位享有世间一切荣耀的人,想出了以下妙语:
((Get-ItemProperty HKLM:\software\policies\microsoft\windows\CredentialsDelegation\AllowFreshCredentials).psobject.Properties | where { $_.Name -match "\d+" } | select -expand value | foreach { if ($_ -like "wsman/*") { $_.substring(6) } else { $_ } })