[英]PowerShell WMI/WQL to get information from SCCM - optimisation
在這種情況下,我所擁有的功能可以正常工作,但是我不禁感到必須有一種更快的方法來做到這一點。 我在這里懷疑我的結構。 您是否看到一種更快的方法? foreach
需要一段時間,因為它必須查詢很多次。 目的是要有一個數組來顯示計算機的( $poste
)集合(名稱和對象路徑)。
$poste = "p1234"
$SiteCode = "PRX"
$SiteServer = "SSX"
$ResourceID = Get-WmiObject -Namespace root\sms\site_$SiteCode -Computer $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'" |
Select-Object -ExpandProperty ResourceID
$CollectionIDs = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class sms_fullcollectionmembership -Filter "ResourceID ='$resourceID'" |
Select-Object -expand CollectionID
foreach ($CollectionID in $CollectionIDs) {
$query = @"
SELECT * FROM SMS_Collection
WHERE SMS_Collection.CollectionID='$CollectionID'
"@
[array]$CollectionNamesPath += Get-WmiObject -Namespace root\sms\site_$SiteCode -Computer $SiteServer -Query $query |
Select-Object name,ObjectPath |
Sort-Object -Property Name
}
$CollectionNamesPath | Out-GridView
這可能是您現有代碼的最干凈版本:
$poste = "p1234"
$SiteCode = "PRX"
$SiteServer = "SSX"
$ResourceID = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'" -Property ResourceID | Select-Object -ExpandProperty ResourceID
$CollectionIDs = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class sms_fullcollectionmembership -Filter "ResourceID='$resourceID'" -Property CollectionID | Select-Object -ExpandProperty CollectionID
$CollectionNamesPath = foreach ($CollectionID in $CollectionIDs) {
$Query = "Select Name, ObjectPath From SMS_Collection Where SMS_Collection.CollectionID='$CollectionID'"
Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Query $Query | Select-Object Name, ObjectPath | Sort-Object -Property Name
}
$CollectionNamesPath | Out-GridView
您也可以嘗試一下,盡管我不確定WQL是否支持它:
$poste = "p1234"
$SiteCode = "PRX"
$SiteServer = "SSX"
$ResourceID = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'" -Property ResourceID | Select-Object -ExpandProperty ResourceID
$CollectionIDs = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class sms_fullcollectionmembership -Filter "ResourceID='$resourceID'" -Property CollectionID | Select-Object -ExpandProperty CollectionID
$Query = "Select CollectionID, Name, ObjectPath From SMS_Collection Where" + $($($CollectionIDs | ForEach-Object { " SMS_Collection.CollectionID='$_' " }) -join 'or')
$CollectionNamesPath = Get-WmiObject -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Query $Query |
Sort-Object -Property CollectionID, Name |
Select-Object Name, ObjectPath
$CollectionNamesPath | Out-GridView
您可能可以執行以下操作:
Get-CimInstance -Namespace root\sms\site_$SiteCode -ComputerName $SiteServer -Class SMS_R_SYSTEM -Filter "Name='$poste'" -KeyOnly |
Get-CimAssociatedInstance -ComputerName $SiteServer -ResultClassName sms_fullcollectionmembership -KeyOnly |
Get-CimAssociatedInstance -ComputerName $SiteServer -ResultClassName SMS_Collection |
Sort-Object -Property CollectionID, Name |
Select-Object Name, ObjectPath
當它起作用時,這太棒了。 但是,以我的經驗,使用Get-CimAssociatedInstance
是一種不平衡的體驗,在遠程計算機上工作時,這種感覺加倍了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.