首页 > 解决方案 > 远程会话上的 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

标签: powershellformattingpowershell-5.0winrminvoke-command

解决方案


通过管道将其传输到 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>

推荐阅读