Partilhar via


Resolver problemas de distribuição de conteúdo

Este artigo discute como solucionar problemas comuns de distribuição de conteúdo.

Versão original do produto: ramificação atual do Configuration Manager, Microsoft System Center 2012 Configuration Manager, Microsoft System Center 2012 R2 Configuration Manager

Exemplo de problema

Para este exemplo, digamos que você distribuiu um pacote para um ponto de distribuição, mas o pacote está em um estado Falha ou Em Andamento para o DP.

  1. Primeiro, revise DistMgr.log no site (primário/secundário) onde o DP reside.

    1. Procure entradas de pacote ~Processing no log e identifique o thread de processamento de pacote para a ID do pacote em questão. Filtre DistMgr.log para a ID do thread que você identificou. Examine a etapa 4 em Distribuir um pacote para o DP padrão para ver trechos de log.
    2. Examine o log filtrado e verifique se um thread DP foi criado para o DP em questão. Filtre DistMgr.log para a ID do thread para facilitar isso.
    3. Revise o log filtrado e verifique se um trabalho PkgXferMgr foi criado.
  2. Revise PkgXferMgr.log no site (primário/secundário) onde o DP reside.

    1. Procure a solicitação de envio encontrada com entradas de ID no log e identifique o thread de envio para a combinação DP/pacote afetada. Filtre PkgXferMgr.log para a ID de thread identificada. Examine a etapa 6 em Distribuir um pacote para o DP padrão para ver trechos de log.
    2. Examine o log filtrado para ver se o conteúdo foi transferido com êxito para o DP ou se houve um erro.
  3. Para DPs padrão, PkgXferMgr copia os arquivos de conteúdo para o DP e instrui o provedor WMI DP a adicionar o arquivo à biblioteca de conteúdo chamando métodos WMI. Revise SMSDPProv.log no DP para garantir que o conteúdo foi adicionado à biblioteca de conteúdo. Examine a etapa 7 em Distribuir um pacote para o DP padrão para ver trechos de log.

    Para DPs pull, o PkgXferMgr notifica o DP pull para iniciar o download do conteúdo. Examine as etapas 8 a 16 em Distribuir um pacote para efetuar pull do DP para entender o fluxo e examinar PullDP.log e DataTransferService.log para garantir que o conteúdo tenha sido baixado com êxito.

  4. Para DPs padrão, o PkgXferMgr envia uma mensagem de status para DistMgr. Revise DistMgr.log para verificar se a mensagem de status foi processada com êxito. Examine a etapa 8 em Distribuir um pacote para o DP padrão para ver trechos de log.

    Para DPs pull, o DP pull envia uma mensagem de estado para indicar êxito. Examine as etapas 16 a 22 em Distribuir um pacote para efetuar pull do DP para entender o fluxo e examine os logs relevantes para garantir que a mensagem de estado seja processada com êxito.

  5. Se vários sites estiverem envolvidos, verifique se a replicação do banco de dados está funcionando e se os links de banco de dados entre os sites relevantes estão ativos.

Problemas comuns do DistMgr

  • DistMgr.log mostra a seguinte entrada para a ID do pacote em questão:

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

    Isso geralmente acontece temporariamente enquanto o conteúdo está em trânsito de um site para outro. Revise os logs do remetente/despooler para garantir que não haja problemas com as comunicações do site. Se você vir erros durante a comunicação site a site (Scheduler ->Sender ->Despooler), concentre-se em resolver esses erros antes de solucionar a mensagem acima no DistMgr.log. Examine Distribuir um pacote para DP entre sites para entender o fluxo de log.

    Se não houver erros, pode ser necessário forçar o site pai a reenviar o pacote para o site afetado. Consulte Reenviar cópia compactada de um pacote para um site para obter mais informações.

  • DistMgr.log pode mostrar que está ocupado processando outros pacotes e está usando todos os threads disponíveis para processamento de pacotes.

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

    Se você vir isso, examine os threads de processamento de pacotes atuais no DistMgr.log para ver se eles estão travados. Você também pode examinar os valores do Registro Fila de Processamento de Pacotes e Pacotes que Estão Sendo Processados na seguinte chave do Registro para ver quantos pacotes estão atualmente na Fila de Processamento:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Components\SMS_DISTRIBUTION_MANAGER

    Se os valores de Pacotes que estão sendo processados não forem alterados e ficarem presos por um longo período de tempo, é possível que o DistMgr esteja travado/travado. Se isso acontecer, capture um despejo de processo de SMSExec.exe para revisão.

    Se houver muitos pacotes na fila, mas a fila estiver se movendo, talvez seja necessário revisar e alterar a configuração do thread.

  • DistMgr.log não processa os arquivos PKN recebidos e, como resultado, os pacotes não estão sendo processados. Isso está resultando em um acúmulo de arquivos PKN na caixa de entrada do DistMgr.

    Os arquivos PKN são processados pelo thread principal do DistMgr, portanto, nesses casos, é útil identificar a ID do thread principal do DistMgr procurando a entrada de log SMS_DISTRIBUTION_MANAGER iniciada SMS_EXECUTIVE e, em seguida, filtrar o DistMgr.log para a ID do thread identificada.

    Na maioria dos casos, esse problema ocorre quando o thread principal do DistMgr está fazendo uma chamada WMI para um DP remoto, mas o WMI no DP não está respondendo, fazendo com que o DistMgr aguarde indefinidamente. Filtrar o DistMgr.log do thread principal do DistMgr pode fornecer pistas sobre o DP com o qual ele está tentando se comunicar. Uma vez identificado, verifique se o DP está respondendo e se o WMI está funcionando no DP. Se necessário, reinicie o DP para ver se isso ajuda.

    Se o DistMgr.log filtrado não fornecer nenhuma pista, capture um despejo de processo de SMSExec.exe enquanto estiver no estado do problema para revisão.

Problemas comuns do PkgXferMgr

  • PkgXferMgr.log mostra um erro ao adicionar arquivos à biblioteca de conteúdo no 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
    

    Depois que o PkgXferMgr copia o arquivo de conteúdo para o DP, ele executa métodos WMI para instruir o DP remoto a adicionar o arquivo à biblioteca de conteúdo. Se o DP remoto não conseguir adicionar o arquivo à biblioteca de conteúdo, você verá um erro WMI genérico (0x80041001 = WBEM_E_FAILED) em PkgXferMgr.log.

    Quando isso acontece, é necessário revisar SMSDPProv.log no DP para identificar o motivo pelo qual o DP falhou ao adicionar o arquivo à biblioteca de conteúdo. Se você vir erros de arquivo/caminho não encontrado em SMSDPProv.log, será necessário capturar um rastreamento do Monitor de Processo para determinar o motivo da falha.

  • PkgXferMgr.log mostra que apenas uma conexão é permitida ao DP:

    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.
    

    ou

    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 mostrar que 'apenas uma conexão é permitida' para o DP, isso significa que o DP está configurado para limitação de largura de banda. Se esse for o caso, o PkgXferMgr só poderá usar um thread para o DP e, como resultado, enviar apenas um pacote para o DP por vez. Consulte Controle de largura de banda e threads para obter mais informações.

  • PkgXferMgr.log mostra que o endereço está fechado:

    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 você vir isso no log, significa que o DP está sob controle de largura de banda e o endereço para o DP foi fechado enquanto a transferência de conteúdo estava em andamento. No exemplo acima, o agendamento de DP foi configurado para Permitir alta prioridade somente entre 8:00 e 10:00. Como resultado, o PkgXferMgr parou de enviar conteúdo às 8:00 da manhã e marcou o pacote/DP em um estado de falha.

  • PkgXferMgr.log mostra vários threads começando ao mesmo tempo para o mesmo trabalho:

    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
    

    Normalmente, o PkgXferMgr usa um thread para um trabalho, mas se ele usar vários threads para o mesmo trabalho, a transferência de conteúdo poderá começar a falhar devido ao 0x80070020 de erro (ERROR_SHARING_VIOLATION). Isso acontece se o servidor do site e os servidores de banco de dados do site estiverem em fusos horários diferentes. A solução aqui é garantir que o servidor do site e os servidores de banco de dados do site tenham o mesmo fuso horário definido.

Problemas comuns de DP pull

  • PkgXferMgr.log mostra que o DP de pull está no limite da capacidade e nenhum trabalho é enviado para o DP de 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 executa a consulta a seguir para verificar quantos trabalhos estão atualmente em um estado inacabado no DP de pull. Se a consulta retornar mais de 50 trabalhos, ela não enviará mais trabalhos para o DP de 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, '') <> '')
    

    Esses trabalhos são removidos da tabela quando o DistributionJobs DP pull envia uma mensagem de estado de êxito ou quando a sondagem de status é interrompida (com base nos valores configurados). Para ver os trabalhos no DP pull, você pode usar wbemtest ou WMI Explorer para examinar a contagem de instâncias da SMS_PullDPNotification classe. Você também pode examinar as instâncias da ROOT\SCCMDP:SMS_PullDPState classe WMI no DP de pull para identificar pacotes que estão em um estado de falha e examinar PullDP.log bem como DataTransferService.log para investigar as falhas.

  • SignatureDownload o trabalho no pull DP falha com o erro HTTP 404.

    Criado SignatureDownload DTS job {JOBID} para o pacote C010000D.28, ID de conteúdo ContentID. JobState = NotStarted
    Mensagem de erro DTS recebida para C010000D.28, trabalho de conteúdo {JOBID}, 0x80070002 : Erro BITS: 'Status HTTP 404: A URL solicitada não existe no servidor.

    Esse é um problema conhecido porque os arquivos de assinatura não estão presentes em um DP de origem que está colocado em um servidor do site. Esse problema ocorre apenas quando a ação de distribuição não é redist.

    Para contornar esse problema, use um dos seguintes métodos:

    • Redistribua o pacote (a redistribuição do pacote não requer o download de assinaturas, pois o conteúdo completo é baixado).
    • Configure o DP de pull para usar um DP de origem que não esteja colocado no servidor do site.
  • DataTransferService.log mostra 0x800706D9 ao tentar baixar conteúdo do DP de origem:

    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 que não há mais pontos de extremidade disponíveis no mapeador de ponto de extremidade. Esse problema pode ocorrer devido a falhas de alocação de porta RPC causadas pelo firewall. Também pode ocorrer quando o serviço Firewall do Windows está desabilitado.

    Verifique se há um firewall entre o servidor do site e o servidor afetado e descubra se as portas RPC estão abertas. Você também pode capturar um rastreamento de rede (do DP de pull, bem como do servidor DP de origem) enquanto reproduz o erro para revisão.

  • O Pull DP mostra que ele tem um grande número de trabalhos, mas os trabalhos não estão sendo processados.

    Em alguns casos (normalmente após a instalação de um novo DP de pull quando todo o conteúdo é enviado para o DP de pull), muitas falhas de trabalho no DP de pull podem acabar paralisando o processamento dos trabalhos. Embora a maioria desses problemas seja corrigida nas versões recentes do produto (Configuration Manager versão 1810), alguns fatores ambientais podem resultar em trabalhos de não processamento do DP de pull. Quando isso acontecer, você provavelmente verá milhares de trabalhos DTS na ROOT\ccm\DataTransferService:CCM_DTS_JobEx classe WMI e ~50 (ou mais) trabalhos BITS no estado Falha . Nesse cenário, pode ser benéfico remover todos os itens específicos do trabalho do WMI no DP de pull e distribuir o conteúdo novamente para o DP de pull de maneira controlada e investigar falhas.

    Para remover todos os itens específicos do trabalho do WMI no DP de Pull, você pode usar o script do PowerShell abaixo (examine os comentários do script para obter ajuda):

    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 ""
    
  • O conteúdo mostra Instalado no DP pull, mas URL e URLSubPath para o DP pull não são preenchidos no ContentDPMap, o que causa problemas com pacotes com acesso SMB habilitado.

    Quando o DP pull tem o conteúdo instalado com êxito, ele envia uma mensagem de estado que contém os dados necessários para atualizar os URL/URLSubPath valores no ContentDPMap. Isso acontece quando a resposta de DP pull é processada. Examine as etapas 16 a 22 em Distribuir um pacote para efetuar pull do DP para entender o fluxo e examine os logs relevantes para investigar por que a mensagem de estado não está sendo processada. A causa mais provável para esse problema é uma lista de pendências de mensagens de estado no \MP\outboxes\StateMsg.box ponto de gerenciamento ou MPFDM falhando ao copiar arquivos para o servidor do site devido a problemas de permissão.

Arquivos de conteúdo ausentes na biblioteca de conteúdo

Há momentos em que você notaria que o conteúdo está faltando na biblioteca de conteúdo. Isso pode acontecer devido a problemas anteriores de distribuição de conteúdo ou alguém/algo excluindo acidentalmente arquivos da biblioteca de conteúdo. Para confirmar se o conteúdo está ausente da biblioteca de conteúdo, identifique um pacote afetado e rastreie o conteúdo do pacote de PkgLib até .FileLib

Depois de confirmar que o conteúdo necessário para um pacote está ausente na Biblioteca de conteúdo, consulte Reenviar cópia compactada de um pacote para um site para obter informações sobre como preencher novamente o conteúdo.

Problemas genéricos

  • O log DistMgr ou PkgXferMgr mostra um erro de arquivo/caminho não encontrado:

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

    ou

    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
    

    Códigos de erro comuns: 0x80070002, 0x80070003.

    Para erros de arquivo/caminho não encontrado, o problema provavelmente se deve ao fato de que a biblioteca de conteúdo no servidor do site não possui arquivos de conteúdo para o pacote. Como resultado, o PkgXferMgr não consegue enviar os arquivos para o DP.

    Nesses casos, você pode identificar a ID de conteúdo do log e rastrear o conteúdo de PkgLib para FileLib garantir que os arquivos existam. Você também pode usar o Explorador da Biblioteca de Conteúdo para verificar se os arquivos de conteúdo do pacote estão disponíveis na biblioteca de conteúdo, no entanto, o Explorador da Biblioteca de Conteúdo pode levar algum tempo para carregar e pode ser mais fácil rastrear manualmente o conteúdo do PkgLib FileLib. Como alternativa, você pode capturar um rastreamento do Monitor de Processo para verificar se os arquivos necessários estão ausentes da biblioteca de conteúdo no servidor do site.

    Se o site com conteúdo ausente na biblioteca de conteúdo for o site de origem do pacote, será necessário atualizar o pacote para incrementar a versão de origem do pacote para que o DistMgr tire um instantâneo do conteúdo do diretório de origem do pacote novamente e preencha novamente o conteúdo ausente.

    Se o site que não tem o conteúdo na biblioteca de conteúdo for diferente do site de origem do pacote, você poderá forçar o site de origem do pacote a reenviar a cópia compactada do pacote para o site afetado. Consulte Reenviar cópia compactada de um pacote para um site para obter mais informações.

  • O log DistMgr/PkgXferMgr mostra um erro de rede:

    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.
    

    Códigos de erro comuns: 2, 3, 53, 64.

    Para erros relacionados à rede, revise o log e identifique o servidor com o qual você está tentando se comunicar quando receber o erro. Uma vez identificado, teste o seguinte:

    1. Você pode fazer ping no SERVERNAME afetado usando o endereço FQDN/NetBIOS/IP?
    2. Você pode acessar o compartilhamento \\SERVERNAME\admin$ usando o endereço FQDN/NetBIOS/IP usando a conta SYSTEM do servidor do site?
    3. Você pode acessar o compartilhamento \\SERVERNAME\admin$ usando o endereço FQDN/NetBIOS/IP usando a conta do usuário conectado do servidor do site?
    4. Existe um firewall entre o servidor do site e o servidor afetado? As portas relevantes (RPC/SMB) estão abertas?

    Se os testes acima forem bem-sucedidos, capture um rastreamento de rede (do servidor do site e do servidor afetado) enquanto reproduz o erro para revisão.

  • O log DistMgr/PkgXferMgr mostra um erro de acesso negado:

    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>
    

    Códigos de erro comuns: 5, 0x80070005.

    Para erros relacionados a permissões, revise o log e identifique o caminho que você está tentando acessar quando receber o erro. Uma vez identificado, teste o seguinte:

    1. Você pode fazer ping no SERVERNAME afetado se o caminho for um caminho UNC?
    2. A conta de computador do servidor do site tem permissões para acessar o caminho?
    3. Você pode acessar o caminho afetado usando o endereço FQDN/NetBIOS/IP ao usar a conta SYSTEM do servidor do site?
    4. Você pode acessar o caminho afetado usando o endereço FQDN/NetBIOS/IP ao usar a conta do usuário conectado do servidor do site?
    5. Existe um firewall entre o servidor do site e o servidor afetado? As portas relevantes (RPC/SMB) estão abertas?

    Se os testes acima forem bem-sucedidos, capture um rastreamento do Monitor de Processo do servidor do site enquanto reproduz o erro para revisão.

  • DistMgr/PkgXferMgr procura conteúdo no \bin\x64\FileLib diretório em vez do local real da biblioteca de conteúdo.

    Isso ocorre devido a um problema conhecido na ferramenta Transferência da biblioteca de conteúdo.