powershell - 远程会话上的 Invoke-Command 返回本地值
问题描述
问题
的脚本块是否应该在Invoke-Command
使用 PSSession 运行时始终在远程计算机上运行?
语境
我针对服务器列表运行了以下 powershell:
Clear-Host
$cred = get-credential 'myDomain\myUsername'
$psSessions = New-PSSession -ComputerName @(1..10 | %{'myServer{0:00}' -f $_}) -Credential $cred
Invoke-Command -Session $psSessions -ScriptBlock {
Get-Item -Path 'HKLM:\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters'
} | Sort-Object PSComputerName
# $psSessions | Remove-PSSession
这返回:
Hive: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos
Name Property PSComputerName
---- -------- --------------
Parameters MaxPacketSize : 1 myServer01
MaxTokenSize : 65535
Parameters MaxPacketSize : 1 myServer02
MaxTokenSize : 65535
Parameters MaxPacketSize : 1 myServer03
MaxTokenSize : 65535
Parameters MaxPacketSize : 1 myServer04
MaxTokenSize : 65535
Parameters MaxPacketSize : 1 myServer05
MaxTokenSize : 65535
Parameters MaxPacketSize : 1 myServer06
MaxTokenSize : 65535
Parameters MaxPacketSize : 1 myServer07
MaxTokenSize : 65535
Parameters MaxPacketSize : 1 myServer08
MaxTokenSize : 65535
Parameters MaxPacketSize : 1 myServer09
MaxTokenSize : 65535
Parameters MaxPacketSize : 1 myServer10
MaxTokenSize : 65535
一切看起来都不错;只是我没想到会看到这些值/在这些服务器上设置值之前,我将其作为快速感知检查运行,以确保我没有覆盖任何内容。
我使用 regedit 快速浏览了其中一台服务器;MaxTokenSize
并发现它MaxPacketSize
并不存在。
然后我修改了使用的命令,Get-ItemProperty
而不是Get-Item
:
Invoke-Command -Session $psSessions -ScriptBlock {
Get-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters' -Name 'MaxTokenSize'
} | Sort-Object PSComputerName
这次我遇到了 10 个错误:
Property MaxTokenSize does not exist at path HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters.
+ CategoryInfo : InvalidArgument: (MaxTokenSize:String) [Get-ItemProperty], PSArgumentException
+ FullyQualifiedErrorId : System.Management.Automation.PSArgumentException,Microsoft.PowerShell.Commands.GetItemPropertyCommand
+ PSComputerName : myServer01
# ... (and the same for the other 9 servers, with only PSComputerName changing)
关于返回的值来自哪里......它们来自我的本地机器。修改我的本地注册表项并重新运行原始命令显示所有“服务器”都具有新值。
我猜这是一个错误;但是因为到目前为止我还没有玩过s ,所以我想在这里检查一下,以防我对这些命令的理解/使用有问题,或者在使用sPSSession
时是否有需要注意的已知问题。PSSession
解决方案
通过管道将其传输到 fl * 或 ft *,因此它不使用格式文件来显示注册表项。格式文件在本地运行 get-itemproperty 以尝试显示属性。
从 $PSHOME\Registry.format.ps1xml 的底部输入 Microsoft.Win32.RegistryKey:
<ScriptBlock>
$result = (Get-ItemProperty -LiteralPath $_.PSPath |
Select * -Exclude PSPath,PSParentPath,PSChildName,PSDrive,PsProvider |
Format-List | Out-String | Sort).Trim()
$result = $result.Substring(0, [Math]::Min($result.Length, 5000) )
if($result.Length -eq 5000) { $result += "..." }
$result
</ScriptBlock>
推荐阅读
- python - 如果输入是浮点数,如何不计算字符串的长度?
- javascript - 如何在 android webview 上使用 mediadevices.getusermedia 运行网页
- android - 有什么方法可以简单地在 android studio 中使用 google mediapipe 框架进行手部跟踪?
- c# - 如何将鼠标键绑定到 HoverTrack?
- python - 如何在 raspbian lite 中将 omxPlayer 放在 Kivy 应用程序之上?
- html - 卡片头的引导垂直对齐
- javascript - 如何禁用列拖动并保持分组功能
- c++ - 为什么 const int 对 char 大括号 init 很好?
- amazon-web-services - 如何在 serverless.yml 中将 DynamoDB 流引用为 Lambda 函数触发事件?
- r - RSelenium - remDr$switchToWindow() 没有按预期工作(不切换窗口)