Partilhar via


Solucionar 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: Configuration Manager branch atual, Microsoft System Center 2012 Configuration Manager, Microsoft System Center 2012 R2 Configuration Manager

Problema de exemplo

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

  1. Primeiro, examine DistMgr.log no site (primário/secundário) em que o DP reside.

    1. Procure ~Processamento de entradas de pacote no log e identifique o thread de processamento de pacote para a ID do pacote em questão. Filtrar DistMgr.log para a ID do thread que você identificou. Examine a etapa 4 em Distribuir um pacote para DP padrão para ver trechos de log.
    2. Examine o log filtrado e marcar se um thread DP foi criado para o DP em questão. Filtrar DistMgr.log para a ID do thread para facilitar isso.
    3. Examine o log filtrado e marcar se um trabalho PkgXferMgr foi criado.
  2. Examine PkgXferMgr.log no site (primário/secundário) em que 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 de DP/pacote afetada. Filtrar PkgXferMgr.log para a ID do thread identificada. Examine a etapa 6 em Distribuir um pacote para 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 Standard, pkgXferMgr copia os arquivos de conteúdo para o DP, ele instrui o Provedor de WMI do DP a adicionar o arquivo à biblioteca de conteúdo chamando métodos WMI. Examine SMSDPProv.log no DP para garantir que o conteúdo tenha sido 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, PkgXferMgr notifica pull DP para iniciar o download de conteúdo. Examine as etapas 8-16 em Distribuir um pacote para puxar o 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, PkgXferMgr envia uma mensagem status ao DistMgr. Examine DistMgr.log para verificar se a mensagem 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, pull DP envia uma mensagem de estado para indicar o sucesso. Examine as etapas 16-22 em Distribuir um pacote para puxar o DP para entender o fluxo e examinar 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 os links de banco de dados entre 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. Examine 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 (Agendador ->Remetente -Despooler), concentre-se> em resolver esses erros antes de solucionar problemas da mensagem acima no DistMgr.log. Examine Distribuir um pacote para DP entre sites para entender o fluxo de log.

    Se não houver erros, talvez seja necessário forçar o site pai a reenviar o pacote para o site afetado. Consulte Reenviar a cópia compactada de um pacote em 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 presos. Você também pode examinar a fila de processamento de pacotes e os valores de registro 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 Processamento de Pacotes não forem alterados e ficarem presos por um longo período de tempo, é possível que o DistMgr esteja suspenso/preso. 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 examinar e alterar a configuração do thread.

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

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

    Na maioria dos casos, esse problema ocorre quando o thread DistMgr main está fazendo uma chamada WMI para um DP remoto, mas a WMI no DP não está respondendo, fazendo com que o DistMgr aguarde indefinidamente. Filtrar o DistMgr.log para o thread DistMgr main pode fornecer pistas sobre o DP com o qual ele está tentando se comunicar. Depois de identificado, marcar se o DP estiver respondendo e o WMI estiver funcional no DP. Se necessário, reinicialize 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 em estado de problema para revisão.

Problemas comuns de 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 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 adicionar o arquivo à biblioteca de conteúdo, você verá um erro de WMI genérico (0x80041001 = WBEM_E_FAILED) no PkgXferMgr.log.

    Quando isso acontece, é necessário examinar SMSDPProv.log no DP para identificar o motivo pelo qual o DP não adicionou o arquivo à biblioteca de conteúdo. Se você vir erros de Arquivo/Caminho não encontrados em SMSDPProv.log, você precisará 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, significa que o DP está configurado para limitação de largura de banda. Se esse for o caso, pkgXferMgr só pode 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 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 durante as 8h às 10h. Como resultado, pkgXferMgr parou de enviar conteúdo às 8:00 AM e marcou o pacote/DP em um estado com 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, pkgXferMgr usa um thread para um trabalho, mas se ele usa vários threads para o mesmo trabalho, a transferência de conteúdo pode começar a falhar devido ao erro 0x80070020 (ERROR_SHARING_VIOLATION). Isso acontecerá 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 os servidores de banco de dados do site e do site tenham o mesmo conjunto de fusos horários.

Problemas comuns de DP de pull

  • PkgXferMgr.log mostra que o Pull DP está em capacidade e não há mais trabalhos enviados 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 marcar quantos trabalhos estão atualmente em um estado inacabado no pull DP. Se a consulta retornar mais de 50 trabalhos, ela não enviará mais trabalhos para o 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, '') <> '')
    

    Esses trabalhos são removidos da tabela quando pull DistributionJobs DP envia uma mensagem de estado success ou quando o status a votação é interrompido (com base em valores configurados). Para ver os trabalhos no DP pull, você pode usar wbemtest ou WMI Explorer para revisar a contagem de instâncias para SMS_PullDPNotification classe. Você também pode examinar as instâncias da ROOT\SCCMDP:SMS_PullDPState classe WMI no DP pull para identificar pacotes que estão em um estado com 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.

    Trabalho do DTS SignatureDownload {JOBID} para 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: 'HTTP status 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 colocado em um servidor de site. Esse problema só ocorre quando a ação de distribuição não é redista.

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

    • Redistribua o pacote (redistribuir o pacote não requer o download de assinaturas, pois o conteúdo completo é baixado).
    • Configure o pull DP para usar um DP de origem que não seja colocado no servidor do site.
  • DataTransferService.log mostra 0x800706D9 ao tentar baixar o 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 do ponto de extremidade. Esse problema pode ocorrer devido a falhas de alocação de porta do 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.

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

    Em algumas instâncias (normalmente após a instalação de um novo pull DP quando todo o conteúdo é enviado para o DP pull), muitas falhas de trabalho no DP de pull podem acabar parando 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 pull DP não processando trabalhos. 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 com falha . Nesse cenário, pode ser benéfico remover todos os itens específicos do trabalho da WMI no DP de pull e distribuir o conteúdo novamente para o DP pull de forma controlada e investigar falhas.

    Para remover todos os itens específicos do trabalho da WMI no Pull DP, use o script abaixo do PowerShell (examine os comentários de 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 pull DP, mas URL e URLSubPath para o pull DP não são preenchidos no ContentDPMap, o que causa problemas com pacotes com o Acesso SMB habilitado.

    Quando o pull DP 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 em ContentDPMap. Isso acontece quando a resposta pull DP é processada. Examine as etapas 16-22 em Distribuir um pacote para puxar o DP para entender o fluxo e examinar os logs relevantes para investigar por que a mensagem de estado não está sendo processada. A causa mais provável para esse problema é um atraso de mensagens de estado no ponto de gerenciamento ou falha do MPFDM em \MP\outboxes\StateMsg.box 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 conteúdo ausente da biblioteca de conteúdo. Isso pode acontecer devido a problemas anteriores de distribuição de conteúdo ou alguém/algo que exclui arquivos acidentalmente da biblioteca de conteúdo. Para confirmar se o conteúdo está ausente da biblioteca de conteúdo, identifique um pacote afetado e acompanhe o conteúdo do pacote até PkgLibFileLib.

Depois de confirmar que o conteúdo necessário para um Pacote está ausente na Biblioteca de Conteúdo, consulte Reenviar a cópia compactada de um pacote em um site para obter informações sobre como reenviar 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 encontrados, o problema provavelmente se deve ao fato de que a biblioteca de conteúdo no servidor do site está faltando arquivos de conteúdo para o pacote. Como resultado, pkgXferMgr não é capaz de enviar os arquivos para o DP.

    Nesses casos, você pode identificar a ID de conteúdo do log e rastrear o conteúdo PkgLib para FileLib garantir que os arquivos existam. Você também pode usar a Biblioteca de Conteúdo Explorer para marcar se os arquivos de conteúdo do pacote estiverem disponíveis na biblioteca de conteúdo, no entanto, a Biblioteca de Conteúdo Explorer pode levar algum tempo para carregar e pode ser mais fácil rastrear manualmente o conteúdo de PkgLib para 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 que está faltando conteúdo na biblioteca de conteúdo for o site de origem do pacote, será necessário atualizar o pacote para incrementar a versão do Package Source para que o DistMgr tire uma instantâneo do conteúdo do diretório de origem do pacote novamente e reenplante o conteúdo ausente.

    Se o site que não tiver 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 a cópia compactada de um pacote em 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, examine o log e identifique o servidor com o qual você está tentando se comunicar quando receber o erro. Depois de 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 registrada no servidor do site?
    4. Há 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, bem como do servidor afetado) enquanto reproduz o erro para revisão.

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

    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 obter erros relacionados a permissões, examine o log e identifique o caminho que você está tentando acessar quando receber o erro. Depois de identificado, teste o seguinte:

    1. Você pode fazer ping no SERVERNAME afetado se o caminho for um caminho UNC?
    2. A conta do 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 registrada no servidor do site?
    5. Há 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 procure conteúdo no \bin\x64\FileLib diretório em vez do local da biblioteca de conteúdo real.

    Isso ocorre devido a um problema conhecido na ferramenta Transferência de Biblioteca de Conteúdo.