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, das Paket befindet sich jedoch entweder im Status "Fehler" oder "In Bearbeitung" für die Dp.

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

    1. Suchen Sie im Protokoll nach ~Processing-Paketeinträgen, und identifizieren Sie den Paketverarbeitungsthread für die paket-ID. Filtern Sie "DistMgr.log" nach der thread-ID, die Sie identifiziert haben. Überprüfen Sie Schritt 4 in "Verteilen eines Pakets an Standard-DP", um Protokollauszüge zu sehen.
    2. Überprüfen Sie das gefilterte Protokoll, und überprüfen Sie, ob ein DP-Thread für das in Frage gestellte 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 Auftrag für PkgXferMgr erstellt wurde.
  2. Überprüfen Sie "PkgXferMgr.log" auf dem Standort (primär/sekundär), auf dem sich das Dp befindet.

    1. Suchen Sie nach einer gefundenen Sendeanforderung mit ID-Einträgen im Protokoll, und identifizieren Sie den sendenden Thread für die betroffene DP/Paket-Kombination. Filtern Sie PkgXferMgr.log nach der identifizierten Thread-ID. Überprüfen Sie Schritt 6 in "Verteilen eines Pakets an Standard-DP", um Protokollauszüge zu sehen.
    2. Überprüfen Sie das gefilterte Protokoll, um zu überprüfen, ob der Inhalt erfolgreich an das Dp übertragen wurde oder ob ein Fehler aufgetreten ist.
  3. Bei Standard-DPs kopiert PkgXferMgr die Inhaltsdatei(en) in die Dp und fordert den DP-WMI-Anbieter auf, die Datei der Inhaltsbibliothek durch Aufrufen von WMI-Methoden hinzuzufügen. Überprüfen Sie "SMSDPProv.log" auf dem Dp, um sicherzustellen, dass der Inhaltsbibliothek Inhalte hinzugefügt wurden. Überprüfen Sie Schritt 7 in "Verteilen eines Pakets an Standard-DP", um Protokollauszüge zu sehen.

    Bei Pull-DPs benachrichtigt PkgXferMgr Pull DP, um den Inhaltsdownload zu initiieren. Überprüfen Sie die Schritte 8 bis 16 in "Verteilen eines Pakets", um DP zu ziehen, 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 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 zu sehen.

    Für Pull-DPs sendet Pull DP eine Statusmeldung, um den Erfolg anzuzeigen. Überprüfen Sie die Schritte 16 bis 22 in "Verteilen eines Pakets", um DP zu ziehen, um den Ablauf zu verstehen, und überprüfen Sie die relevanten Protokolle, um sicherzustellen, dass die Statusmeldung erfolgreich verarbeitet wird.

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

Häufige Probleme mit DistMgr

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

    SMS_DISTRIBUTION_MANAGER 2732 (0xaac) ~Der Inhalt des Pakets ist noch nicht von Website CS1 angekommen, wird später <PackageID> erneut versuchen.

    Dies geschieht in der Regel vorübergehend während der Übertragung des Inhalts von einer Website zu einer anderen. Überprüfen Sie die Sender/Despooler-Protokolle, um sicherzustellen, dass keine Probleme mit der Standortkommunikation auftreten. Wenn während der Kommunikation zwischen Standort und Standort 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 das Verteilen eines Pakets an DP auf websitesübergreifend, um den Protokollablauf zu verstehen.

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

  • DistMgr.log kann zeigen, dass die Verarbeitung anderer Pakete ausgelastet ist und alle verfügbaren Threads für die Paketverarbeitung verwendet.

    SMS_DISTRIBUTION_MANAGER 4824 (0x12d8) ~Derzeit werden 3 von 3 zulässigen Paketverarbeitungsthreads verwendet.

    Wenn dies angezeigt wird, überprüfen Sie die aktuellen Paketverarbeitungsthreads in "DistMgr.log", um zu prüfen, 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 nicht mehr reagiert. Erfassen Sie in diesem Fall ein Prozessabbild SMSExec.exe Überprüfung.

    Wenn sich viele Pakete in der Warteschlange befinden, die Warteschlange jedoch in Bewegung ist, kann es erforderlich sein, die Threadkonfiguration zu überprüfen und zu ändern.

  • DistMgr.log verarbeitet die eingehenden #A0 nicht, und als Ergebnis werden keine Pakete verarbeitet. Dies führt zu einem Backlog von #A0 im Posteingang von DistMgr.

    #A0 werden vom Hauptthread "DistMgr" verarbeitet. In diesen Fällen ist es hilfreich, die Haupt-DistMgr-Thread-ID zu identifizieren, indem Sie nach dem SMS_EXECUTIVE gestarteten SMS_DISTRIBUTION_MANAGER-Protokolleintrag suchen und dann "DistMgr.log" nach der identifizierten Thread-ID filtern.

    In den meisten Fällen tritt dieses Problem auf, wenn der Haupt-DistMgr-Thread einen WMI-Aufruf an eine Remote-DP führt, WMI auf der DP jedoch nicht reagiert, was dazu führt, dass DistMgr unbegrenzt darauf wartet. Das Filtern von "DistMgr.log" für den Hauptthread "DistMgr" kann Hinweise zu dem Dp liefern, mit dem er kommunizieren soll. Überprüfen Sie nach dem Identifizieren, ob das Dp antwortet und WMI auf dem Dp funktioniert. Starten Sie bei Bedarf den Dp neu, um zu sehen, ob dies hilft.

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

Häufige PkgXferMgr-Probleme

  • "PkgXferMgr.log" zeigt einen Fehler beim Hinzufügen von Dateien zur Inhaltsbibliothek auf der Dp an:

    SMS_PACKAGE_TRANSFER_MANAGER 5744 (0x1670) ~Sending completed [D:\SCCMContentLib\FileLib\B53B6F96ECC3FB2AF59D02C84A2D31434904BACF2F9C90D80107B6602860BCFD]
    SMS_PACKAGE_TRANSFER_MANAGER 5744 (0x1670) ~ExecStaticMethod failed (80041001)
    SMS_DistributionPoint, AddFile
    SMS_PACKAGE_TRANSFER_MANAGER 5744 (0x1670) CSendFileAction::AddFile fehlgeschlagen; 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) ~ Senden fehlgeschlagen. Fehleranzahl = 1, Neustartzeit = 4.12.2014 6:14:27 Uhr Eastern StandardZeit

    Nachdem PkgXferMgr die Inhaltsdatei in das Dp kopiert hat, werden die WMI-Methoden ausgeführt, um die Remote-DP anweisen, die Datei der Inhaltsbibliothek hinzuzufügen. Wenn die Remote-DP die Datei nicht zur Inhaltsbibliothek hinzufügen kann, wird ein allgemeiner WMI-Fehler (0x80041001 = WBEM_E_FAILED) in PkgXferMgr.log angezeigt.

    In diesem Fall ist es erforderlich, "SMSDPProv.log" auf dem Dp zu überprüfen, um den Grund zu identifizieren, warum das Dp die Datei nicht zur Inhaltsbibliothek hinzugefügt hat. Wenn In SMSDPProv.log Fehler "Datei/Pfad nicht gefunden" angezeigt wird, müssen Sie eine Ablaufverfolgung der Prozessüberwachung erfassen, um die Ursache für den Fehler zu ermitteln.

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

    SMS_PACKAGE_TRANSFER_MANAGER 21216 (0x52e0) ~Address to DPNAME. CONTOSO.COM ist derzeit unter Bandbreitensteuerung, daher ist nur eine Verbindung zulässig und gibt die Sendeanforderung an den Pool zurück.

    oder

    SMS_PACKAGE_TRANSFER_MANAGER 21216 (0x52e0) ~Address to DPNAME. CONTOSO.COM sich derzeit im Impulsenmodus befindet, ist daher nur eine Verbindung zulässig.

    Wenn PkgXferMgr.log zeigt, dass nur eine Verbindung mit dem Dp zulässig ist, bedeutet dies, dass die Dp für Bandbreiteneinschränkungen konfiguriert ist. In diesem Fall kann PkgXferMgr nur einen Thread für die Dp verwenden und daher immer nur ein Paket an das 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) Löschen der Remotedatei \ \DPNAME. CONTOSO.COM\SMS_DP$ \ <PackageID> .6-2F0819F959E788CF843F42E9CA7B44E258B8B4BA37BB63902DB39ACF747BE7DA
    SMS_PACKAGE_TRANSFER_MANAGER 7156 (0x1BF4) CSendFileAction::SendFiles failed; 0x80004005
    SMS_PACKAGE_TRANSFER_MANAGER 7156 (0x1BF4) Senden fehlgeschlagen. Fehleranzahl = 1, Neustartzeit = 15.03.2016 08:30:08 Uhr Sommerzeit in Mountain

    Wenn dies im Protokoll angezeigt wird, bedeutet dies, dass sich das Dp unter Bandbreitensteuerung befindet und die Adresse an das Dp geschlossen wurde, während die Inhaltsübertragung ausgeführt wurde. Im obigen Beispiel wurde der Zeitplan für den Datenschutz nur von 8:00 Uhr bis 10:00 Uhr für "Hohe Priorität zulassen" konfiguriert. Aus diesem Grund hat PkgXferMgr das Senden von Inhalten um 8:00 Uhr beendet und das Paket bzw. die Dp als fehlgeschlagen markiert.

  • PkgXferMgr.log zeigt mehrere Threads an, die 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) Sendethread ab Auftrag: 12771, Paket: <PackageID> , Version: 8, Priorität: 2, Server: DPNAME. CONTOSO.COM, DPPriority: 200
    SMS_PACKAGE_TRANSFER_MANAGER 4244 (0x1094) Sendethread ab Auftrag: 12771, Paket: <PackageID> , Version: 8, Priorität: 2, Server: DPNAME. CONTOSO.COM, DPPriority: 200
    SMS_PACKAGE_TRANSFER_MANAGER 8348 (0x209c) Sendethread, beginnend mit Auftrag: 12771, Paket: <PackageID> , Version: 8, Priorität: 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 von Fehlerfehlern 0x80070020 (ERROR_SHARING_VIOLATION) fehlstarten. Dies geschieht, wenn sich der Standortserver und die Standortdatenbankserver in unterschiedlichen Zeitzonen befinden. Hier soll sichergestellt werden, dass auf den Standortservern und den Standortdatenbankservern die gleiche Zeitzone festgelegt ist.

Häufige Pull-DP-Probleme

  • "PkgXferMgr.log" zeigt an, dass die Pull-DP die Kapazitätsgrenze hat und keine weiteren Aufträge an die Pull-DP gesendet werden:

    SMS_PACKAGE_TRANSFER_MANAGER 4712 (0x1268) PullDP ["Display= \ \P01PDP1. CONTOSO.COM \ "]MSWNET:["SMS_SITE=P01"] \ \P01PDP1. CONTOSO.COM maximale \ Kapazität 50 erreicht
    SMS_PACKAGE_TRANSFER_MANAGER 4712 (0x1268) ~ PullDP hat keine Kapazität. Neustartzeit = 10.01.2019 13:16:33 Uhr Eastern Standard Time

    PkgXferMgr führt die folgende Abfrage aus, um zu überprüfen, wie viele Aufträge sich derzeit auf der Pull-DP in einem noch nicht abgeschlossenen Zustand befinden. Wenn die Abfrage mehr als 50 Aufträge zurückgibt, werden keine weiteren Aufträge an die 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 Tabelle entfernt, wenn Pull DP eine Erfolgsstatusmeldung sendet oder wenn das Statusabfragen beendet wird (basierend auf DistributionJobs konfigurierten Werten). Zum Anzeigen der Aufträge auf der Pull-DP können Sie wbemtest oder den WMI-Explorer verwenden, um die Instanzanzahl für die Klasse SMS_PullDPNotification zu überprüfen. Sie können auch die Instanzen der WMI-Klasse auf der Pull-DP überprüfen, um Pakete zu identifizieren, die sich im Fehlerstatus befinden, und ROOT\SCCMDP:SMS_PullDPState PullDP.log sowie DataTransferService.log überprüfen, um die Fehler zu untersuchen.

  • SignatureDownload Job on Pull DP fails with HTTP 404 error.

    #A0 {JOBID} für paket C010000D.28, content id ContentID erstellt. JobState = NotStarted
    #A0 für C010000D.28, Inhaltsauftrag {JOBID}, 0x80070002 : BITS-Fehler: 'HTTP-Status 404: Die angeforderte URL ist auf dem Server nicht vorhanden.

    This is a known issue because the signature files are not present on a Source DP that is colocated on a site server. Dieses Problem tritt nur auf, wenn die Verteilungsaktion nicht redistiert wird.

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

    • Verteilen Des Pakets (zum Verteilen des Pakets sind keine Downloadsignaturen erforderlich, da der vollständige Inhalt heruntergeladen wird).
    • Konfigurieren Sie die Pull-DP so, dass ein Quell-DP verwendet wird, das nicht auf dem Standortserver gemeinsam zugewiesen ist.
  • "DataTransferService.log" 0x800706D9 beim Herunterladen von Inhalten aus der Quell-DP angezeigt:

    DataTransferService 4864 (0x1300) CDTSJob::HandleErrors: #A0 '{5285F8B3-C426-4882-85F2-AD5331DD4179}' #A1 '{D53BA625-24AA-41FA-A357-6EB1B7D7E701}' unter Benutzer 'S-1-5-18' OldErrorCount 29 NewErrorCount 30 ErrorCode

    0x800706D9 bedeutet, dass in der Endpunktzuordnung keine weiteren Endpunkte verfügbar sind. This issue may occur due to RPC port allocation failures caused by firewall. Er kann auch auftreten, wenn der Windows-Firewall-Dienst deaktiviert ist.

    Überprüfen Sie, ob zwischen dem Standortserver und dem betroffenen Server eine Firewall vorhanden ist, und stellen Sie heraus, ob die RPC-Ports geöffnet sind. Sie können auch eine Netzwerkverfolgung (aus dem Pull-DP- und dem Quell-DP-Server) erfassen und den Fehler zur Überprüfung nachführen.

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

    In einigen Fällen (normalerweise nach der Installation einer neuen Pull-DP, wenn alle Inhalte an die Pull-DP gesendet werden), können zu viele Auftragsfehler auf der Pull-DP dazu führen, dass die Auftragsverarbeitung nicht mehr verarbeitet wird. Obwohl die meisten dieser Probleme in den aktuellen Produktversionen (Configuration Manager, Version 1810) behoben wurden, können einige Umgebungsfaktoren dazu führen, dass Aufträge von Pull DP nicht verarbeitet werden. In diesem Fall werden Wahrscheinlichkeit nach Tausende von #A0 in der #A1 und ROOT\ccm\DataTransferService:CCM_DTS_JobEx ~50 (oder mehr) #A2 im Fehlerstatus zu sehen sein. In diesem Szenario kann es von Vorteil sein, alle auftragsspezifischen Elemente aus WMI auf der Pull-DP zu entfernen und den Inhalt wieder kontrolliert an die Pull-DP zu verteilen und Fehler zu untersuchen.

    Um alle auftragsspezifischen Elemente aus WMI auf der 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 ""
    
  • Inhalt wird auf der Pull-DP installiert, URL und URLSubPath für die Pull-DP werden jedoch nicht aufgefüllt, was zu Problemen mit Paketen führt, für die ContentDPMap SMB Access aktiviert ist.

    Wenn die Pull-DP den Inhalt erfolgreich installiert hat, wird eine Statusmeldung gesendet, die die daten enthält, die zum Aktualisieren der URL/URLSubPath Werte in erforderlich ContentDPMap sind. Dies geschieht, wenn die Pull-DP-Antwort verarbeitet wird. Überprüfen Sie die Schritte 16 bis 22 in "Verteilen eines Pakets", um DP zu ziehen, um den Ablauf 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 Rückstau von Statusmeldungen im Verwaltungspunkt oder MPFDM, der aufgrund von Berechtigungsproblemen Dateien nicht auf den Standortserver kopieren \MP\outboxes\StateMsg.box kann.

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 bei der Inhaltsverteilung oder aufgrund eines versehentlichen Löschens 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 .

Sobald Sie sich vergewissern, dass der erforderliche Inhalt für ein Paket in der Inhaltsbibliothek fehlt, finden Sie unter "Erneutes Senden einer komprimierten Kopie eines Pakets an eine Website" Weitere Informationen zum erneuten Auffüllen des Inhalts.

Allgemeine Probleme

  • Im Protokoll "DistMgr" oder "PkgXferMgr" wird ein Fehler "Datei/Pfad nicht gefunden" angezeigt:

    SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) CContentDefinition::TotalFileSizes failed; 0x80070003 SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) Senden von Inhalten 000f8a0a-825c-457b-a15b-57ade145a09b für Paket <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 in der Inhaltsbibliothek auf dem Websiteserver Inhaltsdateien für das Paket fehlen. Aus diesem Grund kann PkgXferMgr die Dateien nicht an das Dp senden.

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

    Wenn es sich bei der Website, auf der Inhalte in der Inhaltsbibliothek fehlen, um die Paketquellenwebsite handelt, muss das Paket so aktualisiert werden, dass die Paketquellenversion erhöht wird, sodass DistMgr eine Momentaufnahme des Inhalts aus dem Paketquellenverzeichnis erstellt und den fehlenden Inhalt erneut auffüllt.

    Wenn die Website, auf der der Inhalt in der Inhaltsbibliothek fehlt, von der Paketquellenwebsite abhing, können Sie erzwingen, dass die Paketquellenwebsite die komprimierte Kopie des Pakets erneut an die betroffene Website senden kann. Weitere Informationen finden Sie unter "Erneutes Senden einer komprimierten Kopie eines Pakets an eine Website".

  • Im Protokoll "DistMgr/PkgXferMgr" wird ein Netzwerkfehler angezeigt:

    SMS_DISTRIBUTION_MANAGER 5112 (0x13f8) Konnte keine Netzwerkverbindung mit \ \DPNAME herstellen. CONTOSO.COM\ADMIN$ (0x35).~
    SMS_DISTRIBUTION_MANAGER 5112 (0x13f8) ~Cannot establish connection to ["Display= \ \DPNAME. CONTOSO.COM \ "]MSWNET:["SMS_SITE=PS1"] \ \DPNAME. CONTOSO.COM \ . Fehler = 53 SMS_DISTRIBUTION_MANAGER 5112 (0x13f8) Fehler aufgetreten. Ausführen der Fehlerbereinigung vor der Rückgabe.

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

    Überprüfen Sie das Protokoll auf Netzwerkfehler, und identifizieren Sie den Server, mit dem Sie kommunizieren möchten, wenn sie den Fehler erhalten. Nachdem Sie identifiziert wurden, testen Sie Folgendes:

    1. Können Sie den betroffenen SERVERNAMEN mit dem FQDN/NetBIOS/IP-Adresse pingen?
    2. Können Sie über den FQDN/NetBIOS/die IP-Adresse über das Systemkonto vom Websiteserver aus auf die Freigabe \ "\SERVERNAME\admin$" zugreifen?
    3. Können Sie über den FQDN/NetBIOS/die IP-Adresse mithilfe des Kontos des angemeldeten Benutzers vom Websiteserver aus auf \ "\SERVERNAME\admin$" zugreifen?
    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 Netzwerkverfolgung (vom Standortserver und vom betroffenen Server), während Sie den Fehler zur Überprüfung erneut ausprobieren.

  • Im Protokoll "DistMgr/PkgXferMgr" wird ein Fehler angezeigt, bei dem der Zugriff verweigert wurde:

    SMS_DISTRIBUTION_MANAGER 7076 (0x1ba4) Erstellen einer Paketmomentaufnahme für das Paket aus der Quelle <PackageID> \ \PS1SITE\PKGSOURCE\DummyPackage SMS_DISTRIBUTION_MANAGER 7076 (0x1ba4) ~Das Quellverzeichnis \PS1SITE\PKGSOURCE\DummyPackage ist nicht vorhanden, oder der #A0 kann nicht darauf \ zugreifen. Win32 last error = 5 SMS_DISTRIBUTION_MANAGER 7076 (0x1ba4) ~Failed to take snapshot of package <PackageID>

    Häufige Fehlercodes: 5, 0x80070005.

    Überprüfen Sie das Protokoll auf Berechtigungsfehler, und identifizieren Sie den Pfad, auf den Sie zugreifen möchten, wenn Sie den Fehler erhalten. Nachdem Sie identifiziert wurden, testen Sie Folgendes:

    1. Können Sie den betroffenen SERVERNAME pingen, wenn es sich bei dem Pfad um einen UNC-Pfad handelt?
    2. Verfügt das Computerkonto des Standortservers über Berechtigungen für den Zugriff auf den Pfad?
    3. Können Sie mit dem FQDN/NetBIOS/IP-Adresse auf den betroffenen Pfad zugreifen, wenn Sie das Systemkonto vom Standortserver aus verwenden?
    4. Können Sie mit dem FQDN/NetBIOS/IP-Adresse auf den betroffenen Pfad 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 oben genannten Tests erfolgreich sind, erfassen Sie eine Ablaufverfolgung der Prozessüberwachung vom Standortserver, während Sie den Fehler zur Überprüfung nachführen.

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

    Dies liegt an einem bekannten Problem im Inhaltsbibliotheksübertragungstool.