Risolvere i problemi di distribuzione del contenuto

Questo articolo illustra come risolvere i problemi comuni di distribuzione del contenuto.

Versione originale del prodotto: Configuration Manager current branch, Microsoft System Center 2012 Configuration Manager, Microsoft System Center 2012 R2 Configuration Manager

Problema di esempio

Per questo esempio, si supponga di aver distribuito un pacchetto a un punto di distribuzione, ma il pacchetto è in uno stato Failed o In Progress per il DP.

  1. Esaminare prima di tutto DistMgr.log nel sito (primario/secondario) in cui risiede il DP.

    1. Cercare ~Elaborazione delle voci del pacchetto nel log e identificare il thread di elaborazione del pacchetto per l'ID pacchetto in questione. Filtrare DistMgr.log per l'ID thread identificato. Vedere il passaggio 4 in Distribuire un pacchetto in DP standard per visualizzare gli estratti di log.
    2. Esaminare il log filtrato e verificare se è stato creato un thread DP per il DP in questione. Filtrare DistMgr.log per l'ID thread per semplificare questa operazione.
    3. Esaminare il log filtrato e verificare se è stato creato un processo PkgXferMgr.
  2. Esaminare PkgXferMgr.log nel sito (primario/secondario) in cui risiede il DP.

    1. Cercare La richiesta di invio trovata con le voci ID nel log e identificare il thread di invio per la combinazione DP/pacchetto interessata. Filtrare PkgXferMgr.log per l'ID thread identificato. Esaminare il passaggio 6 in Distribuire un pacchetto in DP standard per visualizzare gli estratti di log.
    2. Esaminare il log filtrato per verificare se il contenuto è stato trasferito correttamente in DP o se si è verificato un errore.
  3. Per i provider di servizi di dominio standard, PkgXferMgr copia i file di contenuto in DP e indica al provider WMI DP di aggiungere il file alla libreria di contenuto chiamando i metodi WMI. Esaminare SMSDPProv.log nel DP per assicurarsi che il contenuto sia stato aggiunto alla raccolta contenuto. Vedere il passaggio 7 in Distribuire un pacchetto in DP standard per visualizzare gli estratti di log.

    Per i provider di servizi di dominio pull, PkgXferMgr notifica il pull DP per avviare il download del contenuto. Esaminare i passaggi da 8 a 16 in Distribuire un pacchetto per eseguire il pull di DP per comprendere il flusso ed esaminare PullDP.log e DataTransferService.log per verificare che il contenuto sia stato scaricato correttamente.

  4. Per i criteri di dominio standard, PkgXferMgr invia un messaggio di stato a DistMgr. Esaminare DistMgr.log per verificare se il messaggio di stato è stato elaborato correttamente. Esaminare il passaggio 8 in Distribuire un pacchetto in DP standard per visualizzare gli estratti di log.

    Per i provider di servizi di dominio pull, pull DP invia un messaggio di stato per indicare l'esito positivo. Esaminare i passaggi da 16 a 22 in Distribuire un pacchetto per eseguire il pull di DP per comprendere il flusso ed esaminare i log pertinenti per verificare che il messaggio di stato venga elaborato correttamente.

  5. Se sono coinvolti più siti, assicurarsi che la replica del database funzioni e che i collegamenti di database tra i siti pertinenti siano attivi.

Problemi comuni di DistMgr

  • DistMgr.log mostra la voce seguente per l'ID pacchetto in questione:

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

    Ciò si verifica in genere temporaneamente mentre il contenuto è in transito da un sito a un altro. Esaminare i log mittente/despooler per assicurarsi che non si verifichino problemi con le comunicazioni del sito. Se vengono visualizzati errori durante la comunicazione da sito a sito (Utilità di pianificazione ->Mittente ->Despooler), concentrarsi sulla risoluzione degli errori prima di risolvere il messaggio precedente in DistMgr.log. Per informazioni sul flusso di log, vedere Distribuire un pacchetto a DP tra siti .

    Se non si verificano errori, potrebbe essere necessario forzare il sito padre a inviare nuovamente il pacchetto al sito interessato. Per altre informazioni, vedere Inviare nuovamente una copia compressa di un pacchetto a un sito .

  • DistMgr.log può mostrare che è occupato l'elaborazione di altri pacchetti e usa tutti i thread disponibili per l'elaborazione dei pacchetti.

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

    Se viene visualizzato, esaminare i thread di elaborazione del pacchetto correnti in DistMgr.log per verificare se sono bloccati. È anche possibile esaminare i valori della coda di elaborazione pacchetti e dei pacchetti elaborati del Registro di sistema nella chiave del Registro di sistema seguente per visualizzare il numero di pacchetti attualmente presenti nella coda di elaborazione:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Components\SMS_DISTRIBUTION_MANAGER

    Se i valori dei pacchetti elaborati non cambiano e sono bloccati per un lungo periodo di tempo, è possibile che DistMgr sia bloccato o bloccato. In questo caso, acquisire un dump del processo di SMSExec.exe per la revisione.

    Se nella coda sono presenti molti pacchetti, ma la coda è in movimento, potrebbe essere necessario esaminare e modificare la configurazione del thread.

  • DistMgr.log non elabora i file PKN in ingresso e di conseguenza i pacchetti non vengono elaborati. Ciò comporta un backlog di file PKN nella posta in arrivo di DistMgr.

    I file PKN vengono elaborati dal thread principale di DistMgr, quindi in questi casi è utile identificare l'ID thread di DistMgr principale cercando il SMS_EXECUTIVE avviato SMS_DISTRIBUTION_MANAGER voce di log, quindi filtrare il DistMgr.log per l'ID thread identificato.

    Nella maggior parte dei casi, questo problema si verifica quando il thread di DistMgr principale effettua una chiamata WMI a un DP remoto, ma WMI nel DP non risponde, causando un'attesa illimitata di DistMgr. Filtrare il DistMgr.log per il thread principale di DistMgr può fornire indizi sul DP con cui sta tentando di comunicare. Una volta identificato, controllare se il DP risponde e WMI funziona in DP. Se necessario, riavviare il DP per verificare se è utile.

    Se il DistMgr.log filtrato non fornisce alcun indizio, acquisire un dump del processo di SMSExec.exe mentre si è in stato di problema per la revisione.

Problemi comuni di PkgXferMgr

  • PkgXferMgr.log viene visualizzato un errore durante l'aggiunta di file alla raccolta contenuto in DP:

    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
    

    Dopo che PkgXferMgr copia il file di contenuto in DP, esegue i metodi WMI per indicare al DP remoto di aggiungere il file alla raccolta contenuto. Se il DP remoto non riesce ad aggiungere il file alla raccolta contenuto, verrà visualizzato un errore WMI generico (0x80041001 = WBEM_E_FAILED) in PkgXferMgr.log.

    In questo caso, è necessario esaminare SMSDPProv.log in DP per identificare il motivo per cui il DP non è riuscito ad aggiungere il file alla raccolta contenuto. Se vengono visualizzati errori file /percorso non trovati in SMSDPProv.log, è necessario acquisire una traccia di Monitoraggio processi per determinare il motivo dell'errore.

  • PkgXferMgr.log mostra che al DP è consentita una sola connessione:

    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.
    

    oppure

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

    Se PkgXferMgr.log indica che "è consentita una sola connessione" al DP, significa che il DP è configurato per la limitazione della larghezza di banda. In questo caso, PkgXferMgr può usare un solo thread per DP e, di conseguenza, inviare un solo pacchetto al DP alla volta. Per altre informazioni , vedere Controllo della larghezza di banda e thread .

  • PkgXferMgr.log mostra che l'indirizzo è chiuso:

    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
    

    Se viene visualizzato nel log, significa che il DP è sotto il controllo della larghezza di banda e che l'indirizzo al DP è stato chiuso mentre era in corso il trasferimento del contenuto. Nell'esempio precedente, la pianificazione DP è stata configurata per Consenti priorità elevata solo durante le 8:00 alle 10:00. Di conseguenza, PkgXferMgr ha smesso di inviare contenuto alle 8:00 e ha contrassegnato il pacchetto/DP in uno stato non riuscito.

  • PkgXferMgr.log mostra più thread che iniziano contemporaneamente per lo stesso processo:

    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 genere, PkgXferMgr usa un thread per un processo, ma se usa più thread per lo stesso processo, il trasferimento del contenuto potrebbe iniziare a non riuscire a causa dell'errore 0x80070020 (ERROR_SHARING_VIOLATION). Ciò si verifica se il server del sito e i server di database del sito si trovano in fusi orari diversi. La soluzione consiste nel garantire che il server del sito e i server di database del sito abbiano lo stesso fuso orario impostato.

Problemi comuni del pull DP

  • PkgXferMgr.log mostra che pull DP è alla capacità e non vengono inviati altri processi al DP pull:

    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 esegue la query seguente per controllare il numero di processi attualmente incompiuti nel DP di pull. Se la query restituisce più di 50 processi, non invierà altri processi al DP di pull.

    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, '') <> '')
    

    Questi processi vengono rimossi dalla DistributionJobs tabella quando DP pull invia un messaggio di stato Operazione riuscita o quando il polling dello stato si arresta (in base ai valori configurati). Per visualizzare i processi nel DP pull, è possibile usare wbemtest o Esplora WMI per esaminare il conteggio delle istanze per SMS_PullDPNotification la classe. È anche possibile esaminare le istanze della ROOT\SCCMDP:SMS_PullDPState classe WMI nel DP pull per identificare i pacchetti che si trovano in uno stato Non riuscito ed esaminare PullDP.log e DataTransferService.log per analizzare gli errori.

  • SignatureDownload job on pull DP fails with HTTP 404 error.job on pull DP fails with HTTP 404 error.job on pull DP fails with HTTP 404 error.

    Firma creataDownload del processo DTS {JOBID} per il pacchetto C010000D.28, id contenuto ContentID. JobState = NotStarted
    Messaggio di errore DTS ricevuto per C010000D.28, processo di contenuto {JOBID}, 0x80070002: errore BITS: 'STATO HTTP 404: L'URL richiesto non esiste nel server.

    Si tratta di un problema noto perché i file di firma non sono presenti in un DP di origine che viene collegato in un server del sito. Questo problema si verifica solo quando l'azione di distribuzione non è ridistribuita.

    Per ovviare a questo problema, utilizzare uno dei seguenti metodi:

    • Ridistribuire il pacchetto . La ridistribuzione del pacchetto non richiede il download di firme poiché viene scaricato il contenuto completo.
    • Configurare il DP pull per l'uso di un DP di origine non collegato nel server del sito.
  • DataTransferService.log mostra 0x800706D9 quando si tenta di scaricare contenuto dal DP di origine:

    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 significa che non sono più disponibili endpoint dal mapper degli endpoint. Questo problema può verificarsi a causa di errori di allocazione delle porte RPC causati dal firewall. Può verificarsi anche quando il servizio Windows Firewall è disabilitato.

    Verificare se è presente un firewall tra il server del sito e il server interessato e verificare se le porte RPC sono aperte. È anche possibile acquisire una traccia di rete (dal DP pull e dal server DP di origine) durante la riproduzione dell'errore per la revisione.

  • Pull DP mostra che dispone di un numero elevato di processi, ma i processi non vengono elaborati.

    In alcuni casi ( in genere dopo l'installazione di un nuovo DP pull quando tutto il contenuto viene inviato al DP pull), un numero eccessivo di errori di processo nel DP pull può finire per bloccare l'elaborazione dei processi. Anche se la maggior parte di questi problemi sono risolti nelle versioni recenti del prodotto (Configuration Manager versione 1810), alcuni fattori ambientali possono comportare il pull di DP non elaborando i processi. In questo caso, è probabile che migliaia di processi DTS nella ROOT\ccm\DataTransferService:CCM_DTS_JobEx classe WMI e ~50 (o più) processi BITS siano in stato non riuscito . In questo scenario, può essere utile rimuovere tutti gli elementi specifici del processo da WMI in DP pull e distribuire di nuovo il contenuto al DP pull in modo controllato e analizzare gli errori.

    Per rimuovere tutti gli elementi specifici del processo da WMI in Pull DP, è possibile usare lo script di PowerShell seguente (esaminare i commenti dello script per ottenere assistenza):

    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 ""
    
  • Il contenuto mostra Installato nel DP pull, ma URL e URLSubPath per il DP pull non vengono popolati in ContentDPMap, il che causa problemi con i pacchetti con accesso SMB abilitato.

    Quando il DP pull ha installato correttamente il contenuto, invia un messaggio di stato che contiene i dati necessari per aggiornare i URL/URLSubPath valori in ContentDPMap. Ciò si verifica quando viene elaborata la risposta pull DP. Esaminare i passaggi da 16 a 22 in Distribuire un pacchetto per eseguire il pull di DP per comprendere il flusso ed esaminare i log pertinenti per esaminare il motivo per cui il messaggio di stato non viene elaborato. Molto probabilmente la causa di questo problema è un backlog di messaggi di stato nel \MP\outboxes\StateMsg.box punto di gestione o MPFDM non riesce a copiare i file nel server del sito a causa di problemi di autorizzazione.

File di contenuto mancanti nella raccolta contenuto

In alcuni casi si noterà che il contenuto non è presente nella raccolta contenuto. Ciò potrebbe verificarsi a causa di problemi di distribuzione del contenuto precedenti o di un utente o qualcosa che elimina accidentalmente i file dalla raccolta contenuto. Per verificare che il contenuto non sia presente nella raccolta contenuto, identificare un pacchetto interessato e tenere traccia del contenuto del pacchetto da PkgLib a FileLib.

Dopo aver verificato che il contenuto necessario per un pacchetto non sia presente nella raccolta contenuto, vedere Inviare nuovamente una copia compressa di un pacchetto a un sito per informazioni su come popolare nuovamente il contenuto.

Problemi generici

  • Il log di DistMgr o PkgXferMgr mostra un errore di file/percorso non trovato:

    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\~
    

    oppure

    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
    

    Codici di errore comuni: 0x80070002, 0x80070003.

    Per gli errori di file/percorso non trovati, il problema è probabilmente dovuto al fatto che la raccolta contenuto nel server del sito manca di file di contenuto per il pacchetto. Di conseguenza, PkgXferMgr non è in grado di inviare i file al DP.

    In questi casi, è possibile identificare l'ID contenuto dal log e tenere traccia del contenuto da PkgLib a FileLib per assicurarsi che i file esistano. È anche possibile usare Esplora raccolta contenuto per verificare se i file di contenuto del pacchetto sono disponibili nella raccolta contenuto, tuttavia Il caricamento di Esplora raccolta contenuto può richiedere del tempo e potrebbe essere più semplice tenere traccia manualmente del contenuto da PkgLib a FileLib. In alternativa, è possibile acquisire una traccia di Monitoraggio processi per verificare se i file necessari sono mancanti nella raccolta contenuto nel server del sito.

    Se il sito che manca contenuto nella raccolta contenuto è il sito di origine del pacchetto, è necessario aggiornare il pacchetto per incrementare la versione origine pacchetto in modo che DistMgr prenda di nuovo uno snapshot del contenuto dalla directory di origine del pacchetto e popola nuovamente il contenuto mancante.

    Se il sito in cui manca il contenuto nella raccolta contenuto è diverso dal sito di origine del pacchetto, è possibile forzare il sito di origine del pacchetto a inviare nuovamente la copia compressa del pacchetto al sito interessato. Per altre informazioni, vedere Inviare nuovamente una copia compressa di un pacchetto a un sito .

  • Il log di DistMgr/PkgXferMgr mostra un errore di rete:

    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.
    

    Codici di errore comuni: 2, 3, 53, 64.

    Per gli errori correlati alla rete, esaminare il log e identificare il server con cui si sta tentando di comunicare quando si riceve l'errore. Una volta identificato, testare quanto segue:

    1. È possibile effettuare il ping di SERVERNAME interessato usando l'indirizzo FQDN/NetBIOS/IP?
    2. È possibile accedere alla condivisione \\SERVERNAME\admin$ usando l'indirizzo FQDN/NetBIOS/IP usando l'account SYSTEM dal server del sito?
    3. È possibile accedere alla condivisione \\SERVERNAME\admin$ usando l'indirizzo FQDN/NetBIOS/IP usando l'account utente connesso dal server del sito?
    4. Esiste un firewall tra il server del sito e il server interessato? Le porte rilevanti (RPC/SMB) sono aperte?

    Se i test precedenti hanno esito positivo, acquisire una traccia di rete (dal server del sito e dal server interessato) durante la riproduzione dell'errore per la revisione.

  • Il log di DistMgr/PkgXferMgr mostra un errore di accesso negato:

    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>
    

    Codici di errore comuni: 5, 0x80070005.

    Per gli errori correlati alle autorizzazioni, esaminare il log e identificare il percorso a cui si sta tentando di accedere quando si riceve l'errore. Una volta identificato, testare quanto segue:

    1. È possibile effettuare il ping di SERVERNAME interessato se il percorso è un percorso UNC?
    2. L'account computer del server del sito dispone delle autorizzazioni per accedere al percorso?
    3. È possibile accedere al percorso interessato usando l'indirizzo FQDN/NetBIOS/IP quando si usa l'account SYSTEM dal server del sito?
    4. È possibile accedere al percorso interessato usando l'indirizzo FQDN/NetBIOS/IP quando si usa l'account utente connesso dal server del sito?
    5. Esiste un firewall tra il server del sito e il server interessato? Le porte rilevanti (RPC/SMB) sono aperte?

    Se i test precedenti hanno esito positivo, acquisire una traccia di Monitoraggio processi dal server del sito durante la riproduzione dell'errore per la revisione.

  • DistMgr/PkgXferMgr cerca il contenuto nella \bin\x64\FileLib directory anziché il percorso effettivo della raccolta contenuto.

    Ciò è dovuto a un problema noto nello strumento di trasferimento della raccolta contenuto.