Condividi tramite


Risolvere i problemi di distribuzione del contenuto

Questo articolo illustra come risolvere i problemi comuni relativi alla 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 che il pacchetto si trovi in uno stato Non riuscito o In corso per il dp.

  1. Prima di tutto, esaminare 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 al servizio Device Provisioning standard per visualizzare gli estratti dei 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 Trovato richiesta di invio con voci ID nel log e identificare il thread di invio per la combinazione di DP/package interessata. Filtrare PkgXferMgr.log per l'ID del thread identificato. Vedere il passaggio 6 in Distribuire un pacchetto al dp standard per visualizzare gli estratti dei log.
    2. Esaminare il log filtrato per verificare se il contenuto è stato trasferito correttamente al dp o se si è verificato un errore.
  3. Per i provider di servizi di dominio Standard, PkgXferMgr copia i file di contenuto nel dp, indica al provider WMI DP di aggiungere il file alla raccolta contenuto chiamando metodi WMI WMI. Esaminare SMSDPProv.log sul dp per assicurarsi che il contenuto sia stato aggiunto alla raccolta contenuto. Vedere il passaggio 7 in Distribuire un pacchetto al dp standard per visualizzare gli estratti dei log.

    Per i provider di dati pull, PkgXferMgr invia una notifica al dp pull per avviare il download del contenuto. Esaminare i passaggi da 8 a 16 in Distribuire un pacchetto per eseguire il pull del dp per comprendere il flusso ed esaminare PullDP.log e DataTransferService.log per assicurarsi che il contenuto sia stato scaricato correttamente.

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

    Per i provider di dominio pull, il 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 del dp per comprendere il flusso ed esaminare i log pertinenti per assicurarsi 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.
    

    Questo in genere si verifica temporaneamente mentre il contenuto è in transito da un sito a un altro. Esaminare i log sender/despooler per assicurarsi che non siano presenti problemi con le comunicazioni del sito. Se vengono visualizzati errori durante la comunicazione da sito a sito (Utilità di pianificazione ->Sender ->Despooler), concentrarsi sulla risoluzione di tali errori prima di risolvere il messaggio precedente in DistMgr.log. Per informazioni sul flusso di log, vedere Distribuire un pacchetto a Dp in più siti .

    Se non sono presenti 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 in un sito .

  • DistMgr.log può indicare che è occupato nell'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 questo problema, esaminare i thread di elaborazione dei pacchetti correnti in DistMgr.log per verificare se sono bloccati. È anche possibile esaminare i valori del Registro di sistema code di elaborazione pacchetti e pacchetti elaborati nella chiave del Registro di sistema seguente per verificare il numero di pacchetti attualmente presenti nella coda di elaborazione:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Components\SMS_DISTRIBUTION_MANAGER

    Se i valori pacchetti in fase di elaborazione non cambiano e rimangono 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 DistMgr principale, quindi in questi casi è utile identificare l'ID del thread DistMgr principale cercando la voce di SMS_EXECUTIVE avviata SMS_DISTRIBUTION_MANAGER log, quindi filtrare i 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 sul dp non risponde, causando l'attesa di DistMgr per un tempo indefinito. Filtrare il DistMgr.log per il thread di DistMgr principale può fornire indizi sul dp con cui sta tentando di comunicare. Una volta identificato, verificare se il dp risponde e WMI è funzionante nel dp. Se necessario, riavviare il dp per verificare se è utile.

    Se il DistMgr.log filtrato non fornisce indizi, acquisire un dump del processo di SMSExec.exe durante lo stato del problema per la revisione.

Problemi comuni di PkgXferMgr

  • PkgXferMgr.log viene visualizzato un errore durante l'aggiunta di file alla raccolta contenuto nel 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 nel 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 sul dp per identificare il motivo per cui il dp non è riuscito ad aggiungere il file alla raccolta contenuto. Se nella SMSDPProv.log vengono visualizzati errori di file/percorso, è necessario acquisire una traccia di Monitoraggio processi per determinare il motivo dell'errore.

  • PkgXferMgr.log mostra che è consentita una sola connessione al servizio Device Provisioning:

    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.
    

    o

    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 il 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 questo viene visualizzato nel log, significa che il dp è sotto il controllo della larghezza di banda e l'indirizzo al dp chiuso mentre il trasferimento del contenuto era in corso. Nell'esempio precedente, la pianificazione dp è stata configurata per Consenti priorità alta solo durante le 10:00 alle 10:00. Di conseguenza, PkgXferMgr ha interrotto l'invio di contenuto alle 8:00 e ha contrassegnato il pacchetto/DP in uno stato di errore.

  • 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 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 relativi al dp pull

  • PkgXferMgr.log indica che il servizio Pull DP è in fase di 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 verificare il numero di processi attualmente in uno stato non completato nel dp pull. Se la query restituisce più di 50 processi, non invierà altri processi al dp 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 il pull dp 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 WMI Explorer per esaminare il numero di 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 in stato Non riuscito ed esaminare PullDP.log nonché DataTransferService.log per analizzare gli errori.

  • SignatureDownload il processo sul pull DP ha esito negativo con errore HTTP 404.

    Creazione della firmaScaricare il processo DTS {JOBID} per il pacchetto C010000D.28, content id ContentID. JobState = NotStarted
    Messaggio di errore DTS ricevuto per C010000D.28, processo del 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 si trova in un server del sito. Questo problema si verifica solo quando l'azione di distribuzione non è ridistributa.

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

    • Ridistribuire il pacchetto (la ridistribuzione del pacchetto non richiede il download delle firme perché il contenuto completo viene scaricato).
    • Configurare il dp pull per l'uso di un dp di origine non incluso nel server del sito.
  • DataTransferService.log mostra 0x800706D9 quando si tenta di scaricare il 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 disponibili altri endpoint dal mapper dell'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 di pull e dal server dp di origine) riproducendo l'errore per la revisione.

  • Pull DP mostra che ha 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ò terminare l'elaborazione bloccata dei processi. Anche se la maggior parte di questi problemi è stata risolta nelle versioni recenti del prodotto (Configuration Manager versione 1810), alcuni fattori ambientali possono comportare l'esecuzione del pull dp non elaborando i processi. In questo caso, è probabile che vengano visualizzati migliaia di processi DTS nella ROOT\ccm\DataTransferService:CCM_DTS_JobEx classe WMI e ~50 (o più) processi BITS in stato Non riuscito . In questo scenario, può essere utile rimuovere tutti gli elementi specifici del processo da WMI nel dp pull e distribuire di nuovo il contenuto al pull DP 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 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 pull DP non vengono popolati in ContentDPMap, 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 del dp per comprendere il flusso ed esaminare i log pertinenti per esaminare il motivo per cui il messaggio di stato non viene elaborato. La causa più probabile di questo problema è un backlog di messaggi di stato nel \MP\outboxes\StateMsg.box punto di gestione o MPFDM che 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. Questo problema può verificarsi a causa di problemi di distribuzione del contenuto precedenti o di un utente/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 è 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\~
    

    o

    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, è probabile che il problema sia dovuto al fatto che la raccolta contenuto nel server del sito non contiene 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 per FileLib 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 Esplora raccolta contenuto può richiedere del tempo e potrebbe essere più semplice tenere traccia manuale del contenuto da PkgLib a FileLib. In alternativa, è possibile acquisire una traccia di Monitoraggio processi per verificare se i file necessari non sono presenti 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 dell'origine pacchetto in modo che DistMgr acquisisca di nuovo uno snapshot del contenuto dalla directory di origine del pacchetto e popola nuovamente il contenuto mancante.

    Se il sito non contiene 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 in 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 viene visualizzato l'errore. Una volta identificato, testare quanto segue:

    1. È possibile effettuare il ping del 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 pertinenti (RPC/SMB) sono aperte?

    Se i test precedenti hanno esito positivo, acquisire una traccia di rete (dal server del sito e dal server interessato) riproducendo l'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 viene visualizzato l'errore. Una volta identificato, testare quanto segue:

    1. È possibile effettuare il ping del 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 pertinenti (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.

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