gpt4 book ai didi

Powershell 捕获调用命令输出

转载 作者:行者123 更新时间:2023-12-05 09:27:18 25 4
gpt4 key购买 nike

我遇到了一个我似乎无法弄清楚的问题。我有这段代码,它完全符合我的要求。它搜索已安装并具有特定 UpdateID 的 Windows 更新。

param(
$updateId = $false,
$hostName = $false
)


if(($updateId -eq $false) -or ($hostName -eq $false))
{
Write-Host "checkUpdateInstalled.ps1 -updateId <updateIdValue> -hostName <Remote Host Name>"
exit
}


Invoke-Command -ComputerName $hostName -ScriptBlock {
$searcher = New-Object -ComObject Microsoft.Update.Searcher
$searcher.Search("IsInstalled=1 AND UpdateID='$Using:updateId'")
$tmp.Updates| ForEach-Object {
$i++
Write-Host "UpdateInfo Update No. $i"
Write-Host "Title: `t`t" $_.Title
Write-Host "Description: `t`t " $_.Description
Write-Host "UpdateID: `t`t " $_.Identity.UpdateID
Write-Host "RevisionNumber: `t`t " $_.Identity.RevisionNumber
Write-Host "KBArticleIDs: `t`t " $_.KBArticleIDs
Write-Host "==============================================="
}
}

使用此解决方案,我无法在 Invoke-Command 之外使用 $tmp.Updates,但我尝试使用 ForEach-Object 收集信息 循环工作正常。在这种情况下打印 $tmp.Updates 会提供有关特定更新的信息。

所以我尝试了以下方法来访问 $tmp:

## Same top part


$tmp = Invoke-Command -ComputerName $hostName -ScriptBlock {
$searcher = New-Object -ComObject Microsoft.Update.Searcher
$searcher.Search("IsInstalled=1 AND UpdateID='$Using:updateId'")
}

$tmp.Updates| ForEach-Object {
$i++
Write-Host "UpdateInfo Update No. $i"
Write-Host "Title: `t`t" $_.Title
Write-Host "Description: `t`t " $_.Description
Write-Host "UpdateID: `t`t " $_.Identity.UpdateID
Write-Host "RevisionNumber: `t`t " $_.Identity.RevisionNumber
Write-Host "KBArticleIDs: `t`t " $_.KBArticleIDs
Write-Host "==============================================="
}

通过这种尝试,循环不会打印信息。如果我尝试打印 $tmp.Updates,我只会得到 System.__ComObject

任何人都可以联系吗?

最佳答案

根据设计,您将通过 Invoke-Command 获得这种行为。

Invoke-Command 不从远程 session 返回对象。相反,它返回确实经过多个过程的对象的表示。

首先,它在远程环境中被序列化,然后在本地环境中被反序列化。

那是所有被传输的东西。有一些原始类型,在序列化方面,直接反序列化为“事件”对象,例如:

  • 字节,S字节,字节[]
  • Int16、Int32、Int64、UInt16、UInt32、Uint64
  • 十进制、单精度、 double
  • 时间跨度、日期时间、进度记录
  • 字符、字符串、XmlDocument、安全字符串
  • bool 值、Guid、Uri、版本

那么您将拥有未完全保真反序列化的类型,但在大多数实际用途中表现为原始类型。

这包括枚举,它们被反序列化为一个基础整数。同样,反序列化器将保留列表的内容,但可能会更改容器的实际类型。 (例如:List 反序列化为 ArrayList,Dictionaries 反序列化为 Hashtables 等...)

最后,您还有一些物体会再水化成它们的活体对应物。例如,IP 地址对象被序列化,然后反序列化为 Deserialized.System.Net.IPAddress 并通过“再水化”再次转换为其原始类型,这是指示反序列化类型应如何处理的过程再次转换。

某些 PowerShell 类型有一些内置的补液功能……:

  • PSPrimitiveDictionary
  • 开关参数
  • PSList修改器
  • PSCredential

以及来自基类库的一些类型:

  • IP 地址、邮件地址
  • 文化信息
  • X509Certificate2, X500DistinguishedName
  • 目录安全、文件安全、注册表安全

因此,要执行您想要的操作,您将需要返回可序列化的对象。您需要深入研究 COM 对象并返回所需的属性值。您可以使用 Get-Member 来确定可用的属性,然后从那里返回您想要的内容。

您还可以在远程对象上使用 ConvertTo-Json 以返回它的 json 表示并将其转换回本地的 PSObject。在类型方面,您也不会得到准确的表示,但您可能会更好地了解属性/值。如果需要,请不要忘记将 -Depth 参数设置为更高的数字,因为默认值为 4 层深。

引用

Microsoft Dev-blogs - How objects are sent to and from remote address .

关于Powershell 捕获调用命令输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72700091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com