当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] PowerShell 之谜

作者:精品下载站 日期:2024-12-14 07:52:46 浏览:15 分类:玩电脑

PowerShell 之谜


前几天,我正在为即将召开的 PowerShell + DevOps 全球峰会的会议做准备。正如我通常所做的那样,当我构建连接到远程计算机的演示时,我经常使用本地计算机作为占位符。这应该总是有效吧?所以想象一下当这个命令给我一个错误时我的惊讶:

[玩转系统] PowerShell 之谜

但是在没有计算机名称的情况下运行 Get-CimInstance 效果很好。使用 Get-WmiObject 连接到本地主机也没有出现任何问题。这很好,因为我的第一个想法是损坏的 CIM 存储库。但结果却是我们通常不会想到的其他事情,因为通常它只是有效的。

由于 Get-WmiObject 可以正常工作并且 Get-CimInstance 在没有远程连接的情况下也可以正常工作,因此我非常确定我的 WMI 设置没有问题。即使远程连接回本地主机,我查询其他任何内容也没有问题。这使得 WSMan 成为嫌疑人。当您使用 CIM cmdlet 查询 WMI 并建立远程连接时,即使“远程”计算机是本地主机,PowerShell 也会创建 WSMan 连接。所以我的第一步是收集更多信息。

我打开了事件查看器,并在“应用程序和服务日志\Microsoft\Windows\Windows 远程管理”下启用了分析日志。完成故障排除后,不要忘记禁用它。

然后我重新运行我的命令。

Get-CimInstance Win32_ComputerSystem -ComputerName $env:Computername

现在来看日志。我逐步了解了这些事件并了解了网络设置以及身份验证过程。最终我看到了 WMI 枚举的开头。

[玩转系统] PowerShell 之谜

滚动浏览更多事件后,我遇到了此错误:

[玩转系统] PowerShell 之谜

有趣的。 WMI 希望发送回近 3MB 的数据作为响应。 WSMan 不喜欢这一点,这一点将在下一次活动中得到证实。

[玩转系统] PowerShell 之谜

最终我得到了无效的 XML 错误。这一切都是有道理的,因为当您使用 WSMan 时,结果会被序列化为 XML 并传输回给您。在我的场景中,我相信 PowerShell 收到了部分响应,但随后该过程被中止,因此 XML 永远不会完成,从而变得无效。

为了最终验证 WSMan 是罪魁祸首,我尝试使用命令行 winrm 实用程序。

[玩转系统] PowerShell 之谜

显然,我的 WSMan 配置失败了,因此我检查了 WSMan PSDrive 中的设置。

[玩转系统] PowerShell 之谜

MaxEnvelopeSizeKB 可能是罪魁祸首,所以我提出了它。

Set-Item -Path WSMan:\localhost\maxEnvelopeSizeKB -Value 5000

现在重新运行我的 Get-CimInstance 表达式可以按预期工作。

此时我应该感到满意了,但我想知道为什么我在这门课上获得了这么多数据。我重新尝试了 winrm enum 命令,虽然它没有立即给我一个错误,但它也没有立即给我一个响应。最终命令完成,当我再次检查窗口时,它充满了字节值。幸运的是,我能够向上滚动并看到 OEMLogoBitmap 属性负责。有趣的。

[玩转系统] PowerShell 之谜

我将 MaxEnvelopeSizeKB 重置回默认值 500,并尝试使用 Get-CimInstance 进行更具选择性的查询。

Get-CimInstance Win32_ComputerSystem -ComputerName $env:Computername -Property Name,Model,TotalPhysicalMemory

这正如预期的那样。但是当我尝试仅获取 OEMLogoBitmap 属性时,我遇到了相同的错误。重置 WSMan 以便获取所有数据,我测量了数组的大小,发现它只有 43KB。序列化必须增加一些开销。事实上我尝试模拟这个过程。

$r = Get-CimInstance win32_computersystem -ComputerName $env:Computername
[xml]$logo = $r.OEMLogoBitmap | convertto-xml
$logo.save("c:\work\logo.xml")

我确信还有比这更多的事情。尽管如此,我最终还是得到了一个大小为 1.8MB 的文件,当默认限制为 500KB 时,这是一个问题。

那么这让我在哪里呢?目前,我将 MaxEnvelopeSizeKB 设置为较高的设置没有问题。我不认为这是一个错误。我也不会将任何责任归咎于决定填充 WMI 属性的供应商。这就是它存在的原因。仅在通过 WSMan 查询类时才会出现问题。当使用 DCOM 连接时,一切正常。我应该指出,即使默认值较低,如果我更有选择性,我也不会有任何问题。

[玩转系统] PowerShell 之谜

但像你们许多人一样,我可能有点太懒了。尽管将 WMI 查询限制为仅需要的属性绝对是推荐的最佳实践。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯