Problembehandlung bei der Inhaltsverteilung

In diesem Artikel wird erläutert, wie Sie häufige Probleme bei der Inhaltsverteilung beheben.

Ursprüngliche Produktversion: Configuration Manager current branch, Microsoft System Center 2012 Configuration Manager, Microsoft System Center 2012 R2 Configuration Manager

Beispielproblem

In diesem Beispiel nehmen wir an, dass Sie ein Paket an einen Verteilungspunkt verteilt haben, sich das Paket jedoch entweder im Status Fehler oder In Bearbeitung für den DP befindet.

  1. Überprüfen Sie zunächst DistMgr.log am Standort (primär/sekundär), an dem sich der Dp befindet.

    1. Suchen Sie im Protokoll nach ~Verarbeitungspaketeinträgen , und identifizieren Sie den Paketverarbeitungsthread für die betreffende Paket-ID. Filtern Sie DistMgr.log nach der von Ihnen identifizierten Thread-ID. Lesen Sie Schritt 4 unter Verteilen eines Pakets an standard-DP , um Protokollauszüge anzuzeigen.
    2. Überprüfen Sie das gefilterte Protokoll, und überprüfen Sie, ob ein DP-Thread für den betreffenden DP erstellt wurde. Filtern Sie DistMgr.log nach der Thread-ID, um dies zu vereinfachen.
    3. Überprüfen Sie das gefilterte Protokoll, und überprüfen Sie, ob ein PkgXferMgr-Auftrag erstellt wurde.
  2. Überprüfen Sie PkgXferMgr.log am Standort (primär/sekundär), an dem sich der DP befindet.

    1. Suchen Sie im Protokoll nach Gefundene Sendeanforderung mit ID-Einträgen , und identifizieren Sie den sendenden Thread für die betroffene DP/Paket-Kombination. Filtern Sie PkgXferMgr.log nach der angegebenen Thread-ID. Lesen Sie Schritt 6 unter Verteilen eines Pakets an standard-DP , um Protokollauszüge anzuzeigen.
    2. Überprüfen Sie das gefilterte Protokoll, um festzustellen, ob der Inhalt erfolgreich an den DP übertragen wurde oder ob ein Fehler aufgetreten ist.
  3. Bei Standard-DPs kopiert PkgXferMgr die Inhaltsdatei(en) in den DP, und es weist den DP-WMI-Anbieter an, die Datei der Inhaltsbibliothek hinzuzufügen, indem WMI-Methoden aufgerufen werden. Überprüfen Sie SMSDPProv.log auf dem DP, um sicherzustellen, dass der Inhaltsbibliothek Inhalte hinzugefügt wurden. Lesen Sie Schritt 7 unter Verteilen eines Pakets an standard-DP , um Protokollauszüge anzuzeigen.

    Bei Pull-DPs benachrichtigt PkgXferMgr pull DP, den Download von Inhalten zu initiieren. Lesen Sie die Schritte 8 bis 16 unter Verteilen eines Pakets zum Pullen von DP , um den Ablauf zu verstehen, und überprüfen Sie PullDP.log und DataTransferService.log , um sicherzustellen, dass Inhalte erfolgreich heruntergeladen wurden.

  4. Bei Standard-DPs sendet PkgXferMgr eine status Nachricht an DistMgr. Überprüfen Sie DistMgr.log, um zu überprüfen, ob die status Nachricht erfolgreich verarbeitet wurde. Lesen Sie Schritt 8 unter Verteilen eines Pakets an standard-DP , um Protokollauszüge anzuzeigen.

    Für Pull-DPs sendet Pull-DP eine Statusmeldung, um den Erfolg anzuzeigen. Überprüfen Sie die Schritte 16 bis 22 unter Verteilen eines Pakets zum Pullen von DP , um den Fluss zu verstehen, und überprüfen Sie die relevanten Protokolle, um sicherzustellen, dass die Zustandsmeldung erfolgreich verarbeitet wird.

  5. Wenn mehrere Standorte beteiligt sind, stellen Sie sicher, dass die Datenbankreplikation funktioniert und die Datenbankverbindungen zwischen relevanten Standorten aktiv sind.

Häufige DistMgr-Probleme

  • DistMgr.log zeigt den folgenden Eintrag für die betreffende Paket-ID an:

    SMS_DISTRIBUTION_MANAGER 2732 (0xaac) ~The contents for the package \<PackageID> hasn't arrived from site CS1 yet, will retry later.
    

    Dies geschieht in der Regel vorübergehend, während der Inhalt von einer Website zur anderen übertragen wird. Überprüfen Sie die Sender/Despooler-Protokolle, um sicherzustellen, dass keine Probleme mit der Standortkommunikation vorliegen. Wenn während der Kommunikation zwischen Standorten Fehler auftreten (Scheduler ->Sender ->Despooler), konzentrieren Sie sich auf die Behebung dieser Fehler, bevor Sie die obige Meldung in DistMgr.log beheben. Informationen zum Protokollfluss finden Sie unter Verteilen eines Pakets an dp über mehrere Standorte hinweg .

    Wenn keine Fehler auftreten, kann es erforderlich sein, die übergeordnete Website zu erzwingen, das Paket erneut an den betroffenen Standort zu senden. Weitere Informationen finden Sie unter Erneutes Senden einer komprimierten Kopie eines Pakets an eine Website .

  • DistMgr.log zeigt möglicherweise, dass die Verarbeitung anderer Pakete ausgelastet ist und alle verfügbaren Threads für die Paketverarbeitung verwendet werden.

    SMS_DISTRIBUTION_MANAGER 4824 (0x12d8) ~Currently using 3 out of 3 allowed package processing threads.
    

    Wenn dies angezeigt wird, überprüfen Sie die aktuellen Paketverarbeitungsthreads in DistMgr.log , um festzustellen, ob sie hängen bleiben. Sie können auch die Registrierungswerte Package Processing Queue und Packages Being Processed unter dem folgenden Registrierungsschlüssel überprüfen, um zu sehen, wie viele Pakete sich derzeit in der Verarbeitungswarteschlange befinden:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Components\SMS_DISTRIBUTION_MANAGER

    Wenn sich die Werte der verarbeiteten Pakete nicht ändern und über einen längeren Zeitraum hängen bleiben, ist es möglich, dass DistMgr hängen bleibt. Erfassen Sie in diesem Fall ein Prozessabbild von SMSExec.exe zur Überprüfung.

    Wenn sich viele Pakete in der Warteschlange befinden, die Warteschlange jedoch verschoben wird, ist es möglicherweise erforderlich, die Threadkonfiguration zu überprüfen und zu ändern.

  • DistMgr.log verarbeitet die eingehenden PKN-Dateien nicht, und daher werden pakete nicht verarbeitet. Dies führt zu einem Backlog von PKN-Dateien im DistMgr-Posteingang.

    PKN-Dateien werden vom Standard DistMgr-Thread verarbeitet. Daher ist es in diesen Fällen hilfreich, die Standard DistMgr-Thread-ID zu identifizieren, indem Sie nach der SMS_EXECUTIVE suchen, die SMS_DISTRIBUTION_MANAGER Protokolleintrag gestartet wurde, und dann die DistMgr.log für die identifizierte Thread-ID filtern.

    In den meisten Fällen tritt dieses Problem auf, wenn der Standard DistMgr-Thread einen WMI-Aufruf an einen Remote-DP vornimmt, aber WMI auf der DP nicht reagiert, was dazu führt, dass DistMgr unbegrenzt darauf wartet. Das Filtern der DistMgr.log für den Standard DistMgr-Thread kann Hinweise auf den DP geben, mit dem er zu kommunizieren versucht. Überprüfen Sie nach der Identifizierung, ob der DP antwortet und WMI auf dem DP funktionsfähig ist. Starten Sie bei Bedarf den DP neu, um festzustellen, ob dies hilfreich ist.

    Wenn die gefilterte DistMgr.log keine Hinweise liefert, erfassen Sie ein Prozessabbild von SMSExec.exe, während sie sich im Problemzustand befinden, zur Überprüfung.

Häufige Probleme mit PkgXferMgr

  • PkgXferMgr.log zeigt einen Fehler beim Hinzufügen von Dateien zur Inhaltsbibliothek auf dem DP an:

    SMS_PACKAGE_TRANSFER_MANAGER 5744 (0x1670) ~Sending completed  
    [D:\SCCMContentLib\FileLib\B53B\B53B6F96ECC3FB2AF59D02C84A2D31434904BACF2F9C90D80107B6602860BCFD]  
    SMS_PACKAGE_TRANSFER_MANAGER 5744 (0x1670) ~ExecStaticMethod failed (80041001)  
    SMS_DistributionPoint, AddFile  
    SMS_PACKAGE_TRANSFER_MANAGER 5744 (0x1670) CSendFileAction::AddFile failed; 0x80041001  
    SMS_PACKAGE_TRANSFER_MANAGER 5744 (0x1670) ~Deleting remote file  
    \\DPNAME.CONTOSO.COM\SMS_DP$\Content_b034813c-bc60-4a16-b471-7a0dc3d9662b.1-B53B6F96ECC3FB2AF59D02C84A2D31434904BACF2F9C90D80107B6602860BCFD  
    SMS_PACKAGE_TRANSFER_MANAGER 5744 (0x1670) ~ Sending failed. Failure count = 1, Restart time = 12/4/2014 6:14:27 AM Eastern Standard Time
    

    Nachdem PkgXferMgr die Inhaltsdatei in den DP kopiert hat, führt es WMI-Methoden aus, um den Remote-DP anzuweisen, die Datei der Inhaltsbibliothek hinzuzufügen. Wenn der Remote-DP die Datei nicht zur Inhaltsbibliothek hinzufügen kann, wird in PkgXferMgr.log ein generischer WMI-Fehler (0x80041001 = WBEM_E_FAILED) angezeigt.

    In diesem Fall ist es erforderlich, SMSDPProv.log auf dem DP zu überprüfen, um den Grund zu ermitteln, aus dem die Datei nicht zur Inhaltsbibliothek hinzugefügt werden konnte. Wenn in SMSDPProv.log Fehler Datei/Pfad nicht gefunden angezeigt werden, müssen Sie eine Prozessmonitor-Ablaufverfolgung erfassen, um die Ursache für den Fehler zu ermitteln.

  • PkgXferMgr.log zeigt, dass nur eine Verbindung mit dem DP zulässig ist:

    SMS_PACKAGE_TRANSFER_MANAGER 21216 (0x52e0) ~Address to DPNAME.CONTOSO.COM is currently under bandwidth control, therefore only one connection is allowed, returning send request to the pool.
    

    oder

    SMS_PACKAGE_TRANSFER_MANAGER 21216 (0x52e0) ~Address to DPNAME.CONTOSO.COM is currently in pulse mode, therefore only one connection is allowed.
    

    Wenn PkgXferMgr.log anzeigt, dass "nur eine Verbindung" mit dem DP zulässig ist, bedeutet dies, dass der DP für die Bandbreitendrosselung konfiguriert ist. Wenn dies der Fall ist, kann PkgXferMgr nur einen Thread für den DP verwenden und daher jeweils nur ein Paket an den DP senden. Weitere Informationen finden Sie unter Bandbreitensteuerung und Threads .

  • PkgXferMgr.log zeigt an, dass die Adresse geschlossen ist:

    SMS_PACKAGE_TRANSFER_MANAGER 7156 (0x1BF4) Address is closed for priority 2 jobs, stop sending[E:\SCCMContentLib\FileLib\2F08\2F0819F959E788CF843F42E9CA7B44E258B8B4BA37BB63902DB39ACF747BE7DA]  
    SMS_PACKAGE_TRANSFER_MANAGER 7156 (0x1BF4) Deleting remote file \\DPNAME.CONTOSO.COM\SMS_DP$\<PackageID>.6-2F0819F959E788CF843F42E9CA7B44E258B8B4BA37BB63902DB39ACF747BE7DA  
    SMS_PACKAGE_TRANSFER_MANAGER 7156 (0x1BF4) CSendFileAction::SendFiles failed; 0x80004005  
    SMS_PACKAGE_TRANSFER_MANAGER 7156 (0x1BF4) Sending failed. Failure count = 1, Restart time = 3/15/2016 8:30:08 AM Mountain Daylight Time
    

    Wenn dies im Protokoll angezeigt wird, bedeutet dies, dass der DP unter Der Bandbreitenkontrolle steht und die Adresse des DP geschlossen wird, während die Inhaltsübertragung ausgeführt wurde. Im obigen Beispiel wurde der DP-Zeitplan für Hohe Priorität nur von 8:00 bis 10:00 Uhr zulassen konfiguriert. Daher hat PkgXferMgr das Senden von Inhalten um 8:00 Uhr beendet und das Paket/DP als fehlerhaft markiert.

  • PkgXferMgr.log zeigt, dass mehrere Threads gleichzeitig für denselben Auftrag gestartet werden:

    SMS_PACKAGE_TRANSFER_MANAGER 8360 (0x20a8) Sending thread starting for Job: 12771, package: <PackageID>, Version: 8, Priority: 2, server: DPNAME.CONTOSO.COM, DPPriority: 200  
    SMS_PACKAGE_TRANSFER_MANAGER 10752 (0x2a00) Sending thread starting for Job: 12771, package: <PackageID>, Version: 8, Priority: 2, server: DPNAME.CONTOSO.COM, DPPriority: 200  
    SMS_PACKAGE_TRANSFER_MANAGER 12208 (0x2fb0) Sending thread starting for Job: 12771, package: <PackageID>, Version: 8, Priority: 2, server: DPNAME.CONTOSO.COM, DPPriority: 200  
    SMS_PACKAGE_TRANSFER_MANAGER 4244 (0x1094) Sending thread starting for Job: 12771, package: <PackageID>, Version: 8, Priority: 2, server: DPNAME.CONTOSO.COM, DPPriority: 200  
    SMS_PACKAGE_TRANSFER_MANAGER 8348 (0x209c) Sending thread starting for Job: 12771, package: <PackageID>, Version: 8, Priority: 2, server: DPNAME.CONTOSO.COM, DPPriority: 200
    

    In der Regel verwendet PkgXferMgr einen Thread für einen Auftrag, aber wenn mehrere Threads für denselben Auftrag verwendet werden, kann die Inhaltsübertragung aufgrund eines Fehlers 0x80070020 (ERROR_SHARING_VIOLATION) fehlschlagen. Dies geschieht, wenn sich der Standortserver und die Standortdatenbankserver in unterschiedlichen Zeitzonen befinden. Die Lösung besteht hier darin, sicherzustellen, dass auf dem Standortserver und den Standortdatenbankservern dieselbe Zeitzone festgelegt ist.

Häufige Probleme beim Pull-DP

  • PkgXferMgr.log zeigt, dass der Pull-DP ausgelastet ist und keine weiteren Aufträge an den Pull-DP gesendet werden:

    SMS_PACKAGE_TRANSFER_MANAGER 4712 (0x1268) PullDP ["Display=\\P01PDP1.CONTOSO.COM\"]MSWNET:["SMS_SITE=P01"]\\P01PDP1.CONTOSO.COM\ has reached maximum capacity 50  
    SMS_PACKAGE_TRANSFER_MANAGER 4712 (0x1268) ~ PullDP has no capacity. Restart time = 1/10/2019 1:16:33 PM Eastern Standard Time
    

    PkgXferMgr führt die folgende Abfrage aus, um zu überprüfen, wie viele Aufträge sich derzeit in einem nicht abgeschlossenen Zustand auf dem Pull-DP befinden. Wenn die Abfrage mehr als 50 Aufträge zurückgibt, werden keine weiteren Aufträge an den Pull-DP gesendet.

    SELECT COUNT(*) FROM DistributionJobs job
    JOIN DistributionPoints dp ON dp.DPID=job.DPID AND dp.NALPath='["Display=\\P01PDP1.CONTOSO.COM\"]MSWNET:["SMS_SITE=P01"]\\P01PDP1.CONTOSO.COM\'
    WHERE job.State in (2, 3, 4) AND (job.Action<>5) AND (ISNULL(job.SendAction, '') <> '')
    

    Diese Aufträge werden aus der DistributionJobs Tabelle entfernt, wenn pull DP eine Erfolgsstatusmeldung sendet oder wenn die status Abruf beendet wird (basierend auf konfigurierten Werten). Um die Aufträge auf dem Pull-DP anzuzeigen, können Sie wbemtest oder WMI Explorer verwenden, um die anzahl der instance für SMS_PullDPNotification die Klasse zu überprüfen. Sie können auch die Instanzen der ROOT\SCCMDP:SMS_PullDPState WMI-Klasse auf dem Pull-DP überprüfen, um Pakete zu identifizieren, die den Status Fehler aufweisen, und PullDP.log sowie DataTransferService.log überprüfen, um die Fehler zu untersuchen.

  • SignatureDownload Bei auftrag on pull DP schlägt der HTTP 404-Fehler fehl.

    Signature Herunterladen des DTS-Auftrags {JOBID} für Paket C010000D.28 erstellt, Inhalts-ID ContentID. JobState = NotStarted
    DTS-Fehlermeldung für C010000D.28, Inhaltsauftrag {JOBID}, 0x80070002 : BITS-Fehler: 'HTTP status 404: Die angeforderte URL ist auf dem Server nicht vorhanden.

    Dies ist ein bekanntes Problem, da die Signaturdateien nicht auf einem Quell-DP vorhanden sind, der sich auf einem Standortserver befindet. Dieses Problem tritt nur auf, wenn die Verteilungsaktion nicht wiederholt wird.

    Wenden Sie eine der folgenden Methoden an, um dieses Problem zu umgehen:

    • Verteilen Sie das Paket neu (für die Neuverteilung des Pakets ist kein Herunterladen von Signaturen erforderlich, da der vollständige Inhalt heruntergeladen wurde).
    • Konfigurieren Sie den Pull-DP so, dass ein Quell-DP verwendet wird, der nicht auf dem Standortserver zugeordnet ist.
  • DataTransferService.log zeigt 0x800706D9 an, wenn Sie versuchen, Inhalte vom Quell-DP herunterzuladen:

    DataTransferService 4864 (0x1300) CDTSJob::HandleErrors: DTS Job '{5285F8B3-C426-4882-85F2-AD5331DD4179}' BITS Job '{D53BA625-24AA-41FA-A357-6EB1B7D7E701}' under user 'S-1-5-18' OldErrorCount 29 NewErrorCount 30 ErrorCode
    

    0x800706D9 bedeutet, dass in der Endpunktzuordnung keine weiteren Endpunkte verfügbar sind. Dieses Problem kann aufgrund von RPC-Portzuordnungsfehlern auftreten, die durch die Firewall verursacht werden. Dies kann auch auftreten, wenn der Windows-Firewalldienst deaktiviert ist.

    Überprüfen Sie, ob zwischen dem Standortserver und dem betroffenen Server eine Firewall vorhanden ist, und ermitteln Sie, ob RPC-Ports geöffnet sind. Sie können auch eine Netzwerkablaufverfolgung (sowohl vom Pull-DP als auch vom Quell-DP-Server) erfassen, während Sie den Fehler zur Überprüfung reproduzieren.

  • Pull DP zeigt, dass es über eine große Anzahl von Aufträgen verfügt, aber die Aufträge nicht verarbeitet werden.

    In einigen Fällen (normalerweise nach der Installation eines neuen Pull-DP, wenn der gesamte Inhalt an den Pull-DP gesendet wird) können zu viele Auftragsfehler auf dem Pull-DP zu einer verzögerten Verarbeitung der Aufträge führen. Obwohl die meisten dieser Probleme in den neuesten Versionen des Produkts (Configuration Manager Version 1810) behoben wurden, können einige Umgebungsfaktoren dazu führen, dass Pull-DP-Aufträge nicht verarbeitet werden. In diesem Fall werden wahrscheinlich Tausende von DTS-Aufträgen in der ROOT\ccm\DataTransferService:CCM_DTS_JobEx WMI-Klasse und ca. 50 (oder mehr) BITS-Aufträge im Status "Fehler " angezeigt. In diesem Szenario kann es von Vorteil sein, alle auftragsspezifischen Elemente aus WMI auf dem Pull-DP zu entfernen und den Inhalt auf kontrollierte Weise erneut an den Pull-DP zu verteilen und Fehler zu untersuchen.

    Um alle auftragsspezifischen Elemente aus WMI auf dem Pull-DP zu entfernen, können Sie das folgende PowerShell-Skript verwenden (lesen Sie die Skriptkommentare, um Hilfe zu erhalten):

    Reset-PullDPState.ps1

    <#
    
    .SYNOPSIS  
    Resets the state of the Pull DP and deletes data from various WMI classes related to Pull DP. You need to run this script as Administrator.
    
    .DESCRIPTION
    This script deletes the data from following WMI classes:
    - CCM_DTS_JobEx
    - CCM_DTS_JobItemEx
    - SMS_PullDPState
    - SMS_PullDPContentState
    - SMS_PullDPNotification (optional)
    
    The script also checks and reports the count of BITS Jobs.
    
    .PARAMETER ComputerName
    (Optional) Name of the Pull DP. You can leave this blank for local machine.
    
    .PARAMETER DeletePullDPNotifications
    (Optional) Use this switch if you want to delete the job notifications from SMS_PullDPNotification class.
    
    .PARAMETER KeepBITSJobs
    (Optional) Use this switch if you don't want the script to delete ALL BITS Jobs. If this switch is not used, ALL BITS jobs are deleted (even the ones that are not created by ConfigMgr)
    
    .PARAMETER NotifyPullDP
    (Optional) Use this switch if you want the script to execute NotifyPullDP method against SMS_DistributionPoint class. This is only useful when there aren't a lot of notifications in WMI and -DeletePullDPNotifications switch was not used.
    
    .PARAMETER WhatIf
    (Optional) Use this switch to see how many instances will be deleted.
    
    .EXAMPLE
    Reset-PullDPState -WhatIf
    This command checks how many Pull PD jobs will get deleted when running the script
    
    .EXAMPLE
    Reset-PullDPState
    This command resets the Pull DP related WMI classes except the Pull DP job Notification XML's
    
    .EXAMPLE
    Reset-PullDPState -DeletePullDPNotifications
    This command resets the Pull DP related WMI classes along with the Pull DP job Notification XML's. If you do this, you would need to distribute/redistribute these packages to the Pull DP again.
    
    .NOTES
    07/28/2016 - Version 1.0 - Initial Version of the script
    01/09/2019 - Version 2.0 - Added batch size for instance removal to prevent WMI Quota issues. Also added removal of BITS jobs (can be disabled by using -KeepBITSJobs switch) and restart of CcmExec service.
    
    #>
    
    [CmdletBinding()]
    Param(
      [Parameter(Mandatory=$false)]
       [string]$ComputerName = $env:COMPUTERNAME,
    
       [Parameter(Mandatory=$false)]
       [switch]$DeletePullDPNotifications,
    
       [Parameter(Mandatory=$false)]
       [switch]$KeepBITSJobs,
    
       [Parameter(Mandatory=$false)]
       [switch]$NotifyPullDP,
    
       [Parameter(Mandatory=$false)]
       [switch]$WhatIf
    )
    
    $LogFile = Join-Path (Split-Path $SCRIPT:MyInvocation.MyCommand.Path -Parent) "Reset-PullDPState.log"
    $ErrorActionPreference = "SilentlyContinue"
    
    Function Write-Log {
        Param(
          [string] $text,
          [switch] $NoWriteHost,
          [switch] $IsErrorMessage,
          [switch] $IsWarning,
          [switch] $WhatIfMode
        )
    
        $timestamp = Get-Date -Format "MM-dd-yyyy HH:mm:ss"
        "$timestamp $text" | Out-File -FilePath $LogFile -Append
    
        if ($WhatIfMode) {
            Write-Host $text -ForegroundColor Yellow
            return
        }
    
        if (-not $NoWriteHost) {
            if ($IsErrorMessage) {
                Write-Host $text -ForegroundColor Red
            }
            elseif ($IsWarning) {
                Write-Host $text -ForegroundColor Yellow
            }
            else {
                Write-Host $text -ForegroundColor Cyan
            }
        }
    }
    
    Function Delete-WmiInstances {
        Param(
            [string] $Namespace,
            [string] $ClassName,
            [string] $Filter = $null,
            [string] $Property1,
            [string] $Property2 = "",
            [string] $Property3 = "",
            [int] $BatchSize = 10000
        )
    
        $success = 0
        $totalfailed = 0
        $counter = 0
        $total = 0
    
        Write-Host ""
        Write-Log "$ClassName - Connecting to WMI Class on $ComputerName"
    
        do {
    
            if ($Filter -eq $null) {
                $Instances = Get-WmiObject -ComputerName $ComputerName -Namespace $Namespace -Class $ClassName -ErrorVariable WmiError -ErrorAction SilentlyContinue | Select -First $BatchSize
            }
            else {
                $Instances = Get-WmiObject -ComputerName $ComputerName -Namespace $Namespace -Class $ClassName -Filter $Filter -ErrorVariable WmiError -ErrorAction SilentlyContinue | Select -First $BatchSize
            }
    
            if ($WmiError.Count -ne 0) {
                Write-Log "    Failed to connect. Error: $($WmiError[0].Exception.Message)" -IsErrorMessage
                $WmiError.Clear()
                return
            }
    
            $currentfailed = 0
            $current = ($Instances | Measure-Object).Count
            if ($current -gt 0) {$script:serviceRestartRequired = $true}
            if ($WhatIf) { break }
    
            if ($current -ne $null -and $current -gt 0) {
                Write-Log "    Found $total total instances (Batch size $BatchSize)"
    
                foreach($instance in $Instances) {
    
                    $instanceText = "$Property1 $($instance.$Property1)"
    
                    if ($Property2 -ne "") {
                        $instanceText += ", $Property2 $($instance.$Property2)"
                    }
    
                    if ($Property3 -ne "") {
                        $instanceText += ", $Property3 $($instance.$Property3)"
                    }
    
                    Write-Log "    Deleting instance for $instanceText" -NoWriteHost
                    $counter += 1
    
                    $percentComplete = "{0:N2}" -f (($counter/$total) * 100)
                    Write-Progress -Activity "Deleting instances from $ClassName" -Status "Deleting instance #$counter/$total - $instanceText" -PercentComplete $percentComplete -CurrentOperation "$($percentComplete)% complete"
    
                    Remove-WmiObject -InputObject $instance -ErrorVariable DeleteError -ErrorAction SilentlyContinue
                    if ($DeleteError.Count -ne 0) {
                        Write-Log "    Failed to delete instance. Error: $($DeleteError[0].Exception.Message)" -NoWriteHost -IsErrorMessage
                        $DeleteError.Clear()
                        $currentfailed += 1
                    }
                    else {
                        $success += 1
                    }
                }
    
                $totalfailed += $currentfailed
    
                if ($currentfailed -eq $current) {
                    # Every instance in current batch failed. Break to avoid infinite while loop
                    break
                }
            }
    
        } while (($Instances | Measure-Object).Count -ne 0)
    
        if ($WhatIf) {
            if ($total -eq $BatchSize) {
                Write-Log "    (What-If Mode) Found more than $BatchSize instances which will be deleted" -WhatIfMode
            }
            else {
                Write-Log "    (What-If Mode) $total instances will be deleted" -WhatIfMode
            }
        }
        else {
            if ($total -gt 0) {
                # $totalfailed is likely not the accurate count here as it could include duplicate failures due to batching
                Write-Log "    Deleted $success instances. Failed to delete $totalfailed instances."
            }
            else {
                Write-Log "    Found 0 instances."
            }
        }
    }
    
    Function Check-BITSJobs {
    
        $DisplayName = "BITS Jobs"
    
        Write-Host ""
        Write-Log "$DisplayName - Gettting jobs on $ComputerName"
        Import-Module BitsTransfer
        $Instances = Get-BitsTransfer -AllUsers -Verbose -ErrorVariable BitsError -ErrorAction SilentlyContinue | Where-Object {$_.DisplayName -eq 'CCMDTS Job'}
    
        if ($BitsError.Count -ne 0) {
            Write-Log "    $DisplayName - Failed to get jobs. Error: $($BitsError[0].Exception.Message)" -IsErrorMessage
            $BitsError.Clear()
        }
        else {
            $total = ($Instances | Measure-Object).Count
            Write-Log "    $DisplayName - Found $total jobs"
    
            if ($KeepBITSJobs) {
                Write-Log "    BITS Jobs will not be removed because KeepBITSJobs is true." -WhatIfMode
            }
            else {
                if ($WhatIf) {
                    Write-Log "    (What-If Mode) ALL BITS jobs will be removed since KeepBITSJobs is NOT specified." -WhatIfMode
                }
                else {
                    if ($total -gt 0) {
                        Write-Log "    Removing ALL jobs since KeepBITSJobs is NOT specified."
                        Remove-BITSJobs
                    }
                    else {
                        Write-Log "    There are no jobs to delete."
                    }
                }
            }
        }
    }
    
    Function Remove-BITSJobs {
    
        try {
            Stop-Service BITS
            Rename-Item "$($env:ALLUSERSPROFILE)\Microsoft\Network\Downloader" -NewName "Downloader.OLD.$([Guid]::NewGuid().Guid.Substring(0,8))"
            Start-Service BITS
            $script:serviceRestartRequired = $true
            Write-Log "    Removed ALL BITS Jobs successfully."
        } catch {
            Write-Log "    Failed to delete the BITS jobs."
            Write-Log "    If necessary, run 'bitsadmin /reset /allusers' command under SYSTEM account (using psexec.exe) to delete the BITS Jobs."
            Write-Log "    Additionally, you can delete these jobs by stopping BITS service, renaming %allusersprofile%\Microsoft\Network\Downloader folder, and starting BITS service."
        }
    }
    
    Function Restart-CcmExec {
    
        $DisplayName = "SMS Agent Host"
    
        Write-Host ""
        Write-Log "$DisplayName - Checking if service restart is required."
        if ($script:serviceRestartRequired) {
    
            if ($WhatIf) {
                Write-Log "    (What-If Mode) Service Restart will be required." -WhatIfMode
                if ($NotifyPullDP) {
                    Write-Log "    (What-If Mode) NotifyPullDP method will be executed." -WhatIfMode
                }
                else {
                    Write-Log "    (What-If Mode) NotifyPullDP method will NOT be executed because -NotifyPullDP switch was NOT used." -WhatIfMode
                }
                return
            }
    
            try {
                Write-Host ""
                Write-Log "### Restarting CCMEXEC service... ###"
                Restart-Service CcmExec
                Write-Log "### Success! ###"
            } catch {
                Write-Log "### ERROR! Restart CcmExec Manually in order to recreate BITS jobs for content transfer! ###"
            }
    
            if (-not $DeletePullDPNotifications -and $NotifyPullDP) {
                # Only do this if notifications were not deleted. If they were deleted, NotifyPullDP will not do anything.
                try {
                    Write-Host ""
                    Write-Log "### Invoking NotifyPullDP WMI method against the SMS_DistributionPoint class in $DPNamespace."
                    Invoke-WmiMethod -Namespace root\SCCMDP -Class SMS_DistributionPoint -Name NotifyPullDP | Out-Null
                    Write-Log "### Success! ###"
                } catch {
                    Write-Log "### ERROR! Failed to invoke NotifyPullDP method! You can use wbemtest or WMI Explorer to invoke the method manually. ###"
                }
            }
            else {
                if (-not $NotifyPullDP) {
                    Write-Log "### Skipped invoking NotifyPullDP WMI method because -NotifyPullDP was NOT specified" -IsWarning
                    Write-Log "### You can use wbemtest or WMI Explorer to invoke the method manually, if necessary. ###"
                }
    
                if ($DeletePullDPNotifications) {
                    Write-Log "### Skipped invoking NotifyPullDP WMI method because -DeletePullDPNotifications was specified" -IsWarning
                    Write-Log "### Executing NotifyPullDP when there are no notifications does not do anything." -IsWarning
                }
    
            }
        }
        else {
            Write-Log "    Service Restart is NOT required. " -WhatIfMode
            if ($NotifyPullDP) {
                Write-Log "    NotifyPullDP method skipped. " -WhatIfMode
            }
        }
    }
    
    Write-Host ""
    Write-Log "### Script Started ###"
    $script:serviceRestartRequired = $false
    
    if ($WhatIf) {
        Write-Host ""
        Write-Log "*** Running in What-If Mode" -WhatIfMode
    }
    
    $DPNamespace = "root\SCCMDP"
    $DTSNamespace = "root\CCM\DataTransferService"
    
    Delete-WmiInstances -Namespace $DTSNamespace -ClassName "CCM_DTS_JobEx" -Filter "NotifyEndpoint like '%PullDP%'" -Property1 "ID"
    Delete-WmiInstances -Namespace $DTSNamespace -ClassName "CCM_DTS_JobItemEx" -Property1 "JobID"
    Delete-WmiInstances -Namespace $DPNamespace -ClassName "SMS_PullDPState" -Property1 "PackageID" -Property2 "PackageVersion" -Property3 "PackageState"
    Delete-WmiInstances -Namespace $DPNamespace -ClassName "SMS_PullDPContentState" -Property1 "PackageKey" -Property2 "ContentId" -Property3 "ContentState"
    
    if ($DeletePullDPNotifications) {
        Delete-WmiInstances -Namespace $DPNamespace -ClassName "SMS_PullDPNotification" -Property1 "PackageID" -Property2 "PackageVersion"
    }
    else {
        Write-Host ""
        Write-Log "SMS_PullDPNotification - Connecting to WMI Class on $ComputerName"
    
        $temp = Get-WmiObject -ComputerName $ComputerName -Namespace $DPNamespace -Class "SMS_PullDPNotification" -ErrorVariable WmiError -ErrorAction SilentlyContinue
    
        if ($WmiError.Count -ne 0) {
            Write-Log "    SMS_PullDPNotification - Failed to connect. Error: $($WmiError[0].Exception.Message)" -IsErrorMessage
            $WmiError.Clear()
        }
        else {
            Write-Log "    Found $(($temp | Measure-Object).Count) instances."
            Write-Log "    Skipped because DeletePullDPNotifications switch was NOT used." -IsWarning
        }
    }
    
    if ($ComputerName -eq $env:COMPUTERNAME) {
        Check-BITSJobs
    }
    else {
        Write-Host ""
        Write-Log "BITS Jobs"
        Write-Log "    Skipped because script is running against a remote computer." -IsWarning
    }
    
    Restart-CcmExec
    
    Write-Host ""
    Write-Log "### Script Ended ###"
    Write-Host "### Check $LogFile for more details. ###" -ForegroundColor Cyan
    #if (-not $WhatIf -and $serviceRestartRequired) {Write-Log "### Please restart the WMI service (which also restarts CcmExec). ###" -IsWarning}
    Write-Host ""
    
  • Der Inhalt wird auf dem Pull-DP installiert angezeigt, aber URL und URLSubPath für den Pull-DP werden in ContentDPMapnicht aufgefüllt, was Probleme mit Paketen verursacht, bei denen SMB-Zugriff aktiviert ist.

    Wenn der Inhalt des Pull-DP erfolgreich installiert wurde, sendet er eine Zustandsmeldung, die die daten enthält, die zum Aktualisieren der URL/URLSubPath Werte in ContentDPMaperforderlich sind. Dies geschieht, wenn die Pull-DP-Antwort verarbeitet wird. Lesen Sie die Schritte 16 bis 22 unter Verteilen eines Pakets zum Pullen von DP , um den Fluss zu verstehen, und überprüfen Sie die relevanten Protokolle, um zu untersuchen, warum die Statusmeldung nicht verarbeitet wird. Die wahrscheinlichste Ursache für dieses Problem ist entweder ein Backlog von Zustandsmeldungen in der \MP\outboxes\StateMsg.box auf dem Verwaltungspunkt oder MPFDM kann Dateien aufgrund von Berechtigungsproblemen nicht auf den Standortserver kopieren.

Fehlende Inhaltsdateien in der Inhaltsbibliothek

Es gibt Situationen, in denen Sie feststellen würden, dass Inhalte in der Inhaltsbibliothek fehlen. Dies kann auf vorherige Probleme bei der Inhaltsverteilung oder auf das versehentliche Löschen von Dateien aus der Inhaltsbibliothek zurückzuführen sein. Um zu bestätigen, dass der Inhalt in der Inhaltsbibliothek fehlt, identifizieren Sie ein betroffenes Paket, und verfolgen Sie den Paketinhalt von PkgLib bis nach FileLib.

Nachdem Sie bestätigt haben, dass der erforderliche Inhalt für ein Paket in der Inhaltsbibliothek fehlt, finden Sie informationen zum erneuten Auffüllen des Inhalts unter Erneutes Senden einer komprimierten Kopie eines Pakets an eine Website .

Allgemeine Probleme

  • Das DistMgr- oder PkgXferMgr-Protokoll zeigt einen Datei-/Pfadfehler nicht gefunden an:

    SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) CContentDefinition::TotalFileSizes failed; 0x80070003
    SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) Sending content 000f8a0a-825c-457b-a15b-57ade145a09b for package \<PackageID>
    SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) CSendFileAction::SendFiles failed; 0x80070003
    SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) CSendFileAction::SendContent failed; 0x80070003
    SMS_PACKAGE_TRANSFER_MANAGER 648 (0x288) Sent status to the distribution manager for pkg <PackageID>, version 14, status 4 and distribution point ["Display=\\DPNAME.CONTOSO.COM\"]MSWNET:["SMS_SITE=S01"]\\DPNAME.CONTOSO.COM\~
    

    oder

    SMS_PACKAGE_TRANSFER_MANAGER 11228 (0x2bdc) Sending legacy content P0100053.2 for package <PackageID>  
    SMS_PACKAGE_TRANSFER_MANAGER 11228 (0x2bdc) CContentDefinition::TotalFileSizes failed; 0x80070003  
    SMS_PACKAGE_TRANSFER_MANAGER 11228 (0x2bdc) CSendFileAction::SendFiles failed; 0x80070003
    

    Häufige Fehlercodes: 0x80070002, 0x80070003.

    Bei Datei-/Pfadfehlern nicht gefunden liegt das Problem wahrscheinlich daran, dass in der Inhaltsbibliothek auf dem Standortserver Inhaltsdateien für das Paket fehlen. Daher kann PkgXferMgr die Dateien nicht an den DP senden.

    In diesen Fällen können Sie die Inhalts-ID aus dem Protokoll identifizieren und den Inhalt von PkgLib bis FileLib nachverfolgen, um sicherzustellen, dass die Dateien vorhanden sind. Sie können auch die Inhaltsbibliothek Explorer verwenden, um zu überprüfen, ob die Paketinhaltsdateien in der Inhaltsbibliothek verfügbar sind. Das Laden der Explorer der Inhaltsbibliothek kann jedoch einige Zeit in Anspruch nehmen, und es kann einfacher sein, den Inhalt manuell von PkgLib bis zu FileLibzu verfolgen. Alternativ können Sie eine Prozessmonitor-Ablaufverfolgung erfassen, um zu überprüfen, ob die erforderlichen Dateien in der Inhaltsbibliothek auf dem Standortserver fehlen.

    Wenn die Website, auf der Inhalt in der Inhaltsbibliothek fehlt, die Paketquellwebsite ist, muss das Paket so aktualisiert werden, dass die Paketquellversion inkrementiert wird, damit DistMgr eine Momentaufnahme des Inhalts aus dem Paketquellverzeichnis wieder übernimmt und den fehlenden Inhalt erneut auffüllt.

    Wenn sich der Inhalt der Website in der Inhaltsbibliothek von der Paketquellwebsite unterscheidet, können Sie erzwingen, dass der Paketquellstandort die komprimierte Kopie des Pakets erneut an die betroffene Website senden muss. Weitere Informationen finden Sie unter Erneutes Senden einer komprimierten Kopie eines Pakets an eine Website .

  • DistMgr/PkgXferMgr-Protokoll zeigt einen Netzwerkfehler an:

    SMS_DISTRIBUTION_MANAGER 5112 (0x13f8) Failed to make a network connection to \\DPNAME.CONTOSO.COM\ADMIN$ (0x35).~  
    SMS_DISTRIBUTION_MANAGER 5112 (0x13f8) ~Cannot establish connection to ["Display=\\DPNAME.CONTOSO.COM\"]MSWNET:["SMS_SITE=PS1"]\\DPNAME.CONTOSO.COM\. Error = 53
    SMS_DISTRIBUTION_MANAGER 5112 (0x13f8) Error occurred. Performing error cleanup prior to returning.
    

    Häufige Fehlercodes: 2, 3, 53, 64.

    Überprüfen Sie bei Netzwerkfehlern das Protokoll, und identifizieren Sie den Server, mit dem Sie kommunizieren möchten, wenn der Fehler auftritt. Testen Sie nach der Identifizierung Folgendes:

    1. Können Sie den betroffenen SERVERNAME mithilfe der FQDN/NetBIOS/IP-Adresse pingen?
    2. Können Sie auf die Freigabe "\\SERVERNAME\admin$" zugreifen, indem Sie den FQDN/NetBIOS/IP-Adresse über das SYSTEM-Konto vom Standortserver verwenden?
    3. Können Sie auf die Freigabe \\SERVERNAME\admin$ mit dem FQDN/NetBIOS/IP-Adresse zugreifen, indem Sie das Konto des angemeldeten Benutzers vom Standortserver verwenden?
    4. Gibt es eine Firewall zwischen dem Standortserver und dem betroffenen Server? Sind relevante Ports (RPC/SMB) geöffnet?

    Wenn die oben genannten Tests erfolgreich sind, erfassen Sie eine Netzwerkablaufverfolgung (sowohl vom Standortserver als auch vom betroffenen Server), während Sie den Fehler zur Überprüfung reproduzieren.

  • DistMgr/PkgXferMgr-Protokoll zeigt einen Fehler vom Typ "Zugriff verweigert" an:

    SMS_DISTRIBUTION_MANAGER    7076 (0x1ba4)    Taking package snapshot for package <PackageID> from source \\PS1SITE\PKGSOURCE\DummyPackage
    SMS_DISTRIBUTION_MANAGER    7076 (0x1ba4)    ~The source directory \\PS1SITE\PKGSOURCE\DummyPackage doesn't exist or the SMS service cannot access it, Win32 last error = 5
    SMS_DISTRIBUTION_MANAGER    7076 (0x1ba4)    ~Failed to take snapshot of package <PackageID>
    

    Häufige Fehlercodes: 5, 0x80070005.

    Überprüfen Sie bei Berechtigungsfehlern das Protokoll, und identifizieren Sie den Pfad, auf den Sie zugreifen möchten, wenn sie den Fehler erhalten. Testen Sie nach der Identifizierung Folgendes:

    1. Können Sie den betroffenen SERVERNAME pingen, wenn der Pfad ein UNC-Pfad ist?
    2. Verfügt das Computerkonto des Standortservers über Berechtigungen für den Zugriff auf den Pfad?
    3. Können Sie auf den betroffenen Pfad mit dem FQDN/NetBIOS/IP-Adresse zugreifen, wenn Sie das SYSTEM-Konto vom Standortserver verwenden?
    4. Können Sie über den FQDN/NetBIOS/IP-Adresse auf den betroffenen Pfad zugreifen, wenn Sie das Konto des angemeldeten Benutzers vom Standortserver verwenden?
    5. Gibt es eine Firewall zwischen dem Standortserver und dem betroffenen Server? Sind relevante Ports (RPC/SMB) geöffnet?

    Wenn die oben genannten Tests erfolgreich sind, erfassen Sie eine Prozessmonitor-Ablaufverfolgung vom Standortserver, während Sie den Fehler zur Überprüfung reproduzieren.

  • DistMgr/PkgXferMgr sucht nach Inhalten im \bin\x64\FileLib Verzeichnis anstelle des tatsächlichen Speicherorts der Inhaltsbibliothek.

    Dies ist auf ein bekanntes Problem im Inhaltsbibliotheksübertragungstool zurückzuführen.