我遇到了一個我似乎無法弄清楚的問題。我有這段代碼正是我想要的。它搜索已安裝并具有特定 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 "==============================================="
}
}
使用此解決方案,我無法$tmp.Updates在外部使用,Invoke-Command但我嘗試使用ForEach-ObjectLoop 收集的資訊作業正常。在這種情況下列印$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 "==============================================="
}
通過這種嘗試,Loop 不會列印資訊。如果我嘗試列印$tmp.Updates,我會得到System.__ComObject.
任何人都可以聯系嗎?
uj5u.com熱心網友回復:
Invoke-Command這就是您將通過設計獲得的那種行為。
Invoke-Command不要從遠程會話回傳物件。相反,它回傳經過多個程序的物件的表示。
首先,它在遠程環境中被序列化,然后在本地環境中反序列化。
這適用于所有被傳輸的東西。有一些原始型別,序列化方式,可以直接反序列化為“活動”物件,例如:
- 位元組,SByte,位元組[]
- Int16、Int32、Int64、UInt16、UInt32、Uint64
- 十進制,單,雙
- 時間跨度、日期時間、進度記錄
- 字符、字串、XmlDocument、SecureString
- 布林值、Guid、Uri、版本
然后,您的型別沒有完全保真地反序列化,但在大多數實際用途中表現為原始型別。
這包括列舉,它們被反序列化為基礎整數。同樣,反序列化器將保留串列的內容,但可能會更改容器的實際型別。(例如:串列反序列化為 ArrayList,字典反序列化為 Hashtable 等...)
最后,您還有一些物件可以再水化為它們的活物件。例如,IP 地址物件被序列化,然后反序列化為 aDeserialized.System.Net.IPAddress并通過“再水化”再次轉換為其原始型別,這是指示如何再次轉換反序列化型別的程序。
某些 PowerShell 型別有一些內置的補液功能……:
- PSPrimitive字典
- 開關引數
- PSListModifier
- PS憑證
以及來自基類別庫的某些型別:
- IP 地址、郵件地址
- 文化資訊
- X509Certificate2, X500DistinguishedName
- 目錄安全、檔案安全、注冊表安全
因此,要執行您所尋求的,您將需要回傳可序列化的物件。您需要深入研究 COM 物件并回傳所需的屬性值。您可以使用Get-Member來確定可用的屬性,并從那里回傳您想要的。
您還可以ConvertTo-Json在遠程物件上使用它來回傳它的 json 表示并將其轉換回本地的 PSObject。在型別方面,您也不會得到準確的表示,但您可能會更好地了解屬性/值。如果需要,不要忘記將-Depth引數設定為更高的數字,因為默認值為 4 層深。
參考
Microsoft Dev-blogs - 如何將物件發送到遠程地址和從遠程地址發送。
uj5u.com熱心網友回復:
回傳的序列化物件的深度似乎有限制(無方法)。這對我有用,直接回傳更新子屬性。否則,“updates”會變成一個字串陣列。雖然我會改用“get-ciminstance win32_quickfixengineering”。
$tmp = Invoke-Command localhost { # elevated
$searcher = New-Object -ComObject Microsoft.Update.Searcher
$searcher.Search('IsInstalled=1')
}
$tmp.Updates
System.__ComObject
System.__ComObject
System.__ComObject
...
$tmp.Updates[0].gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
$tmp = Invoke-Command localhost { # elevated
$searcher = New-Object -ComObject Microsoft.Update.Searcher
$searcher.Search('IsInstalled=1').updates
}
$tmp | % title
MSXML 6.0 RTM Security Update (925673)
Update for Microsoft Report Viewer Redistributable 2010 Service Pack 1 (KB2549864)
Security Update for Microsoft Visual C 2005 Service Pack 1 Redistributable Package (KB2538242)
...
回傳你想要的屬性...
Invoke-Command localhost { # elevated
$searcher = New-Object -ComObject Microsoft.Update.Searcher
$searcher.Search('IsInstalled=1').updates | select title, description,
@{n='UpdateID'; e={$_.Identity.UpdateID}},
@{n='RevisionNumber';e={$_.Identity.RevisionNumber}}, KBArticleIDs
}
Title : Update for Windows Defender Antivirus antimalware platform - KB4052623 (Version 4.18.2001.10)
Description : This package will update Windows Defender Antivirus antimalware platform’s components on the user machine.
UpdateID : c01629fc-64ea-45f3-b7cb-cabc7d566933
RevisionNumber : 200
KBArticleIDs : {4052623}
PSComputerName : localhost
RunspaceId : 57b3ae43-6ee6-4e0c-add1-d9d82aba3f61
invoke-command localhost { get-ciminstance win32_quickfixengineering }
Source Description HotFixID InstalledBy InstalledOn PSComputerName
------ ----------- -------- ----------- ----------- --------------
Update KB5013887 NT AUTHORITY\SYSTEM 6/18/2022 12:00:00 AM localhost
Update KB4562830 NT AUTHORITY\SYSTEM 2/1/2021 12:00:00 AM localhost
Update KB4577586 NT AUTHORITY\SYSTEM 5/24/2021 12:00:00 AM localhost
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/495231.html
上一篇:統計字串輸出的實體
