Freigeben über


Problembehandlung bei der Inhaltsverteilung

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

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

Beispielproblem

Angenommen, Sie haben ein Paket an einen Verteilungspunkt verteilt, aber das Paket befindet sich entweder im Status "Fehlgeschlagen " oder "In Bearbeitung " für den DP.

  1. Überprüfen Sie zunächst DistMgr.log auf dem Standort (primär/sekundär), auf dem sich die DP befindet.

    1. Suchen Sie nach ~Verarbeitung von Paketeinträgen im Protokoll, und identifizieren Sie den Paketverarbeitungsthread für die betreffende Paket-ID. Filtern Sie DistMgr.log nach der von Ihnen identifizierten Thread-ID. Überprüfen Sie Schritt 4 in " Verteilen eines Pakets an Standard-DP ", um Protokollauszüge anzuzeigen.
    2. Überprüfen Sie das gefilterte Protokoll, und überprüfen Sie, ob für den betreffenden DP-Thread ein DP-Thread 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 auf dem Standort (primär/sekundär), an dem sich der DP befindet.

    1. Suchen Sie nach " Gefundene Sendeanforderung" mit ID-Einträgen im Protokoll und identifizieren Sie den Sendethread für die betroffene DP/Paket-Kombination. Filtert PkgXferMgr.log nach der identifizierten Thread-ID. Überprüfen Sie Schritt 6 in " 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. Für Standard-DPs kopiert PkgXferMgr die Inhaltsdatei(n) in das DP, weist er den DP-WMI-Anbieter an, die Datei durch Aufrufen von WMI-Methoden zur Inhaltsbibliothek hinzuzufügen. Überprüfen Sie SMSDPProv.log auf dem DP, um sicherzustellen, dass inhalte der Inhaltsbibliothek hinzugefügt wurden. Überprüfen Sie Schritt 7 in "Verteilen eines Pakets an Standard-DP ", um Protokollauszüge anzuzeigen.

    Bei Pull-DPs benachrichtigt PkgXferMgr pull DP, um den Inhaltsdownload zu initiieren. Überprüfen Sie die Schritte 8-16 in "Verteilen eines Pakets", um den Ablauf und die Überprüfung PullDP.log und DataTransferService.log zu verstehen, um sicherzustellen, dass Inhalte erfolgreich heruntergeladen wurden.

  4. Für Standard-DPs sendet PkgXferMgr eine Statusmeldung an DistMgr. Überprüfen Sie DistMgr.log , um zu überprüfen, ob die Statusmeldung erfolgreich verarbeitet wurde. Überprüfen Sie Schritt 8 in "Verteilen eines Pakets an Standard-DP ", um Protokollauszüge anzuzeigen.

    Bei Pull-DPs sendet Pull-DP eine Statusmeldung, um den Erfolg anzuzeigen. Überprüfen Sie die Schritte 16-22 in "Verteilen eines Pakets", um den Fluss zu verstehen und die relevanten Protokolle zu überprüfen, um sicherzustellen, dass statusmeldungen erfolgreich verarbeitet werden.

  5. Wenn mehrere Standorte beteiligt sind, stellen Sie sicher, dass die Datenbankreplikation funktioniert und die Datenbankverbindungen zwischen den 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 zu einer anderen übertragen wird. Überprüfen Sie die Sender/Despooler-Protokolle, um sicherzustellen, dass keine Probleme mit der Websitekommunikation auftreten. Wenn während der Websitekommunikation Fehler angezeigt werden (Scheduler -Sender ->>Despooler), konzentrieren Sie sich auf die Behebung dieser Fehler, bevor Sie die obige Meldung in DistMgr.log beheben. Überprüfen Sie "Verteilen eines Pakets an DP" über Websites hinweg, um den Protokollfluss zu verstehen.

    Wenn keine Fehler vorhanden sind, kann es erforderlich sein, die übergeordnete Website zu erzwingen, das Paket erneut an die betroffene Website zu senden. Weitere Informationen finden Sie unter "Erneut komprimierte Kopie eines Pakets an eine Website" .

  • DistMgr.log können zeigen, dass es mit der Verarbeitung anderer Pakete beschäftigt ist und alle verfügbaren Threads für die Paketverarbeitung verwendet.

    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 geblieben sind. Sie können auch die Registrierungswerte für die Paketverarbeitungswarteschlange und die verarbeiteten Pakete 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 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 viele Pakete in der Warteschlange vorhanden sind, die Warteschlange jedoch verschoben wird, kann es erforderlich sein, die Threadkonfiguration zu überprüfen und zu ändern.

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

    PKN-Dateien werden vom Hauptthread DistMgr verarbeitet, daher ist es in diesen Fällen hilfreich, die Hauptthread-ID von DistMgr zu identifizieren, indem sie nach der SMS_EXECUTIVE gestarteten SMS_DISTRIBUTION_MANAGER Protokolleintrags suchen und dann die DistMgr.log nach der identifizierten Thread-ID filtern.

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

    Wenn der gefilterte DistMgr.log keine Hinweise liefert, erfassen Sie ein Prozessabbild SMSExec.exe im Problemzustand zur Überprüfung.

Allgemeine PkgXferMgr-Probleme

  • 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 das DP kopiert hat, führt sie WMI-Methoden aus, um die Remote-DP anzuweisen, die Datei der Inhaltsbibliothek hinzuzufügen. Wenn die Remote-DP die Datei der Inhaltsbibliothek nicht hinzufügen kann, wird in PkgXferMgr.log ein allgemeiner 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, warum die DP die Datei der Inhaltsbibliothek nicht hinzugefügt hat. Wenn in SMSDPProv.log Datei/Pfad keine Fehler gefunden werden, müssen Sie eine Prozessüberwachungsablaufverfolgung erfassen, um den Grund 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 zeigt, dass "nur eine Verbindung zulässig" mit dem DP ist, bedeutet dies, dass der DP für die Bandbreitendrosselung konfiguriert ist. Wenn dies der Fall ist, kann PkgXferMgr nur einen Thread für die DP verwenden und daher nur jeweils ein Paket an den DP senden. Weitere Informationen finden Sie unter Bandbreitensteuerung und Threads .

  • PkgXferMgr.log zeigt, 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 sich der DP unter bandbreitensteuerung befindet und die Adresse an den DP geschlossen ist, während die Inhaltsübertragung ausgeführt wurde. Im obigen Beispiel wurde der DP-Zeitplan für "Hohe Priorität zulassen" nur während 8:00 Bis 10:00 Uhr konfiguriert. Daher hat PkgXferMgr das Senden von Inhalten um 8:00 Uhr beendet und das Paket/DP in einem fehlerhaften Zustand markiert.

  • PkgXferMgr.log zeigt mehrere Threads an, die gleichzeitig für denselben Auftrag beginnen:

    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. Wenn jedoch 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 verschiedenen Zeitzonen befinden. Die hier aufgeführte Lösung besteht darin, sicherzustellen, dass der Standortserver und die Websitedatenbank die gleiche Zeitzone festgelegt haben.

Häufige Pull-DP-Probleme

  • PkgXferMgr.log zeigt, dass der Pull DP im Kapazitätsraum 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, sendet sie keine weiteren Aufträge an den Pull-DP.

    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 Tabelle entfernt, wenn pull DistributionJobs DP eine Erfolgsstatusmeldung sendet oder wenn die Statusabfragung 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 Instanzenanzahl 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 sich in einem Fehlerzustand befinden, und PullDP.log überprüfen sowie DataTransferService.log, um die Fehler zu untersuchen.

  • SignatureDownload Der Auftrag beim Pull-DP schlägt mit HTTP 404-Fehler fehl.

    SignatureDownload DTS Auftrag {JOBID} für paket C010000D.28, Inhalts-ID ContentID erstellt. 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 einer Quell-DP vorhanden sind, die auf einem Standortserver zugeordnet ist. Dieses Problem tritt nur auf, wenn die Verteilungsaktion nicht rotiert wird.

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

    • Erneutes Verteilen des Pakets (Umverteilung des Pakets erfordert kein Herunterladen von Signaturen, da der vollständige Inhalt heruntergeladen wird).
    • Konfigurieren Sie den Pull-DP so, dass er eine Quell-DP verwendet, die nicht auf dem Standortserver zugeordnet ist.
  • DataTransferService.log zeigt 0x800706D9 beim Versuch, Inhalte aus der 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 keine weiteren Endpunkte aus der Endpunktzuordnung verfügbar sind. Dieses Problem kann aufgrund von RPC-Portzuweisungsfehlern auftreten, die durch die Firewall verursacht werden. Er kann auch auftreten, wenn der Windows-Firewalldienst deaktiviert ist.

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

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

    In einigen Fällen (normalerweise nach der Installation eines neuen Pull-DP, wenn alle Inhalte an den Pull-DP gesendet werden), kann zu viele Auftragsfehler auf dem Pull-DP die Verarbeitung der Aufträge beenden. Obwohl die meisten dieser Probleme in den letzten Versionen des Produkts (Configuration Manager Version 1810) behoben wurden, können einige Umgebungsfaktoren dazu führen, dass pull DP keine Verarbeitungsaufträge verarbeitet. In diesem Fall würden Sie wahrscheinlich Tausende von DTS-Aufträgen in ROOT\ccm\DataTransferService:CCM_DTS_JobEx der WMI-Klasse und ~50 (oder mehr) BITS-Aufträgen im Status "Fehlgeschlagen " sehen. In diesem Szenario kann es von Vorteil sein, alle auftragsspezifischen Elemente von WMI auf dem Pull-DP zu entfernen und den Inhalt erneut auf kontrollierte Weise an das 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 für Hilfe):

    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 zeigt "Auf der Pull-DP installiert" , aber DIE URL und URLSubPath für den Pull-DP werden nicht aufgefüllt ContentDPMap. Dies führt zu Problemen mit Paketen, die SMB Access aktiviert haben.

    Wenn der Pull-DP den Inhalt erfolgreich installiert hat, sendet er eine Statusmeldung, die die daten enthält, die zum Aktualisieren der URL/URLSubPath Werte ContentDPMaperforderlich sind. Dies geschieht, wenn die Pull-DP-Antwort verarbeitet wird. Überprüfen Sie die Schritte 16-22 in "Verteilen eines Pakets", um den Fluss zu verstehen und die relevanten Protokolle zu überprüfen, um zu untersuchen, warum die Statusmeldung nicht verarbeitet wird. Die wahrscheinlichste Ursache für dieses Problem ist entweder ein Backlog von Statusmeldungen im \MP\outboxes\StateMsg.box Verwaltungspunkt, oder MPFDM kann aufgrund von Berechtigungsproblemen nicht auf den Websiteserver kopiert werden.

Fehlende Inhaltsdateien in der Inhaltsbibliothek

Es gibt Zeiten, in denen Sie feststellen würden, dass Inhalte in der Inhaltsbibliothek fehlen. Dies kann aufgrund früherer Probleme mit der Inhaltsverteilung oder versehentliches Löschen von Dateien aus der Inhaltsbibliothek auftreten. Um zu bestätigen, dass der Inhalt in der Inhaltsbibliothek fehlt, identifizieren Sie ein betroffenes Paket, und verfolgen Sie den Paketinhalt von PkgLib zu FileLib.

Nachdem Sie bestätigt haben, dass der erforderliche Inhalt für ein Paket in der Inhaltsbibliothek fehlt, finden Sie unter Erneut komprimierte Kopie eines Pakets an eine Website, um Informationen zum erneuten Auffüllen des Inhalts zu erhalten.

Allgemeine Probleme

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

    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 Nicht gefundenen Datei-/Pfadfehlern liegt das Problem wahrscheinlich daran, dass die Inhaltsbibliothek auf dem Websiteserver Inhaltsdateien für das Paket fehlt. Daher kann PkgXferMgr die Dateien nicht an die DP senden.

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

    Wenn die Website, auf der Inhalte in der Inhaltsbibliothek fehlen, die Paketquellwebsite ist, muss das Paket so aktualisiert werden, dass die Paketquellversion erhöht wird, sodass DistMgr eine Momentaufnahme des Inhalts aus dem Paketquellverzeichnis erstellt und den fehlenden Inhalt erneut auffüllt.

    Wenn die Website, die den Inhalt in der Inhaltsbibliothek fehlt, von der Paketquellwebsite unterscheidet, können Sie erzwingen, dass die Paketquellwebsite die komprimierte Kopie des Pakets an die betroffene Website erneut sendet. Weitere Informationen finden Sie unter "Erneut komprimierte 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 angezeigt wird. Testen Sie nach der Identifizierung Folgendes:

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

    Wenn die obigen Tests erfolgreich sind, erfassen Sie eine Netzwerkablaufverfolgung (vom Standortserver und den betroffenen Server), während Sie den Fehler zur Überprüfung wiedergeben.

  • DistMgr/PkgXferMgr-Protokoll zeigt einen Fehler beim 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 Fehlern im Zusammenhang mit Berechtigungen das Protokoll, und identifizieren Sie den Pfad, auf den Sie zugreifen möchten, wenn der Fehler angezeigt wird. 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 Websiteservercomputerkonto über Berechtigungen für den Zugriff auf den Pfad?
    3. Können Sie auf den betroffenen Pfad mithilfe der FQDN/NetBIOS/IP-Adresse zugreifen, wenn Sie das SYSTEM-Konto vom Standortserver verwenden?
    4. Können Sie auf den betroffenen Pfad mithilfe der FQDN/NetBIOS/IP-Adresse zugreifen, wenn Sie das Konto des angemeldeten Benutzers vom Standortserver aus verwenden?
    5. Gibt es eine Firewall zwischen dem Standortserver und dem betroffenen Server? Sind relevante Ports (RPC/SMB) geöffnet?

    Wenn die obigen Tests erfolgreich sind, erfassen Sie eine Prozessüberwachungsablaufverfolgung vom Standortserver, während sie den Fehler zur Überprüfung wiedergibt.

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

    Dies ist auf ein bekanntes Problem im Tool für die Inhaltsbibliothekübertragung zurückzuführen.