2016-10-10 64 views
0

我用下面的代碼SCCM PowerShell腳本從文件夾層次獲取目標位置

Function Get-SCCMObjectLocation { 

    param(
     [Parameter(Mandatory=$true, 
       ValueFromPipeline=$true, 
       ValueFromPipelineByPropertyName=$true, 
       Position=0)][string]$SMSId, 
     [string]$SiteCode = (Get-CMSite).SiteCode, 
     [string]$SiteServerName = (Get-CMSite).ServerName) 

    #Find the container directly containing the item 
    $ContainerItem = Get-WmiObject -Namespace root/SMS/site_$($SiteCode) -ComputerName $SiteServerName -Query "select * from SMS_ObjectContainerItem where InstanceKey = '$($SMSId)'" 
    If (!$ContainerItem) { 
     $ObjectName = Get-WmiObject -Namespace root/SMS/site_$($SiteCode) -ComputerName $SiteServerName -Query "select * from SMS_ObjectName where ObjectKey = '$($SMSId)'" 
     If (!$ObjectName) { 
      Write-Warning "No object or containers found for $SMSId" 
      break; 
     } 
     Else 
     { 
      Return "root\$(($ObjectName).Name)" 
      break; 
     } 
    } 

    If ($ContainerItem -is [array]) { 
     Write-Warning "Multiple objects with ID: $SMSId" 
     Foreach ($Item In $ContainerItem) { 
      $tempOutputString = Get-SCCMContainerHierarchy -ContainerNodeId $Item.ContainerNodeID -ObjectType $Item.ObjectType -ObjectTypename $Item.ObjectTypeName -SiteCode $SiteCode -SiteServerName $SiteServerName 
      $OutputString = "$OutputString`nroot\$tempOutputString" 
     } 
     Return "$OutputString" 
    } 
    Else { 
     #One object found 
     $OutputString = Get-SCCMContainerHierarchy -ContainerNodeId ($ContainerItem).ContainerNodeID -SiteCode $SiteCode -SiteServerName $SiteServerName 
     Return "root\$OutputString" 
    } 


} 

Function Get-SCCMContainerHierarchy { 
    param(
     [Parameter(Mandatory=$true, 
       Position=0)][string]$ContainerNodeId, 
     [Parameter(Mandatory=$true, 
       Position=1)][string]$SiteCode = (Get-CMSite).SiteCode, 
     [Parameter(Mandatory=$true, 
       Position=2)][string]$SiteServerName = (Get-CMSite).ServerName, 
     [Parameter(Mandatory=$false)]$ObjectType = ($ContainerItem).ObjectType, 
     [Parameter(Mandatory=$false)]$ObjectTypeName = ($ContainerItem).ObjectTypeName) 

    Switch ($ObjectType) { 
     2  {$ObjectTypeText = $ObjectTypeName; $ObjectName = (Get-CMPackage -ID $SMSId).Name} # Package 
     14  {$ObjectTypeText = $ObjectTypeName; $ObjectName = (Get-CMOperatingSystemInstaller -ID $SMSId).Name} # OS Install Package 
     18  {$ObjectTypeText = $ObjectTypeName; $ObjectName = (Get-CMOperatingSystemImage -ID $SMSId).Name} # OS Image 
     20  {$ObjectTypeText = $ObjectTypeName; $ObjectName = (Get-CMTaskSequence -ID $SMSId).Name} # Task Sequence 
     23  {$ObjectTypeText = $ObjectTypeName; $ObjectName = (Get-CMDriverPackage -ID $SMSId).Name} # Driver Package 
     19  {$ObjectTypeText = $ObjectTypeName; $ObjectName = (Get-CMBootImage -ID $SMSId).Name} # Boot Image 
     5000 {$ObjectTypeText = $ObjectTypeName; $ObjectName = (Get-CMDeviceCollection -Id $SMSId).Name} # Device Collection 
     5001 {$ObjectTypeText = $ObjectTypeName; $ObjectName = (Get-CMUserCollection -Id $SMSId).Name} # User Collection 
     default {$ObjectTypeText = "unknown object type: '$($ObjectTypeName)' = $($ObjectType)"; $ObjectName = "unknown object name ($SMSId)"} 
    } 

    $OutputString = "$ObjectName `t[$ObjectTypeText]" 
    #ContainerNodeID of 0 is the root 
    While ($ContainerNodeId -ne 0) { 
     #Find details of that container 
     $ContainerNode = Get-WmiObject -Namespace root/SMS/site_$($SiteCode) -ComputerName $SiteServerName -Query "select * from SMS_ObjectContainerNode where ContainerNodeID = '$($ContainerNodeId)'" 
     $ContainerName = ($ContainerNode).Name 
     $ContainerNodeId = ($ContainerNode).ParentContainerNodeID 
     $OutputString = "$ContainerName\$OutputString" 
    } 
    Return $OutputString 
} 
Get-SCCMObjectLocation -SMSId "PS1022EB" -SiteCode PS1 -SiteServerName xxyyzz.com 

,但得到下面的錯誤 - 你我我提供錯誤的參數

enter image description here

回答

1

一般來說,防火牆設置可能導致此錯誤(0x800706BA)。

如果在目標計算機上啓用了防火牆,則可以在「Windows管理工具(WMI)」組中對防火牆規則進行檢查(防火牆操作爲「允許」)。

如果未啓用它,您可以手動啓用它們或運行以下命令:

netsh advfirewall firewall set rule group="Windows Management Instrumentation (WMI)" new enable=yes 

此外,錯誤意味着用命令「獲取-WmiObject可以」附帶的錯誤。爲了縮小範圍,你可以單獨運行下面的命令(只要改變幾個變量,如$($ SITECODE)$ SiteServerNameSITECODESiteServerName的環境中的實際價值):

Get-WmiObject -Namespace root/SMS/site_$($SiteCode) -ComputerName $SiteServerName -Query "select * from SMS_ObjectContainerItem" 
相關問題