Solucionar problemas de distribución de contenido

En este artículo se describe cómo solucionar problemas comunes de distribución de contenido.

Versión original del producto:   Rama actual de Configuration Manager, Microsoft System Center 2012 Configuration Manager, Microsoft System Center 2012 R2 Configuration Manager

Problema de ejemplo

En este ejemplo, supongamos que distribuyó un paquete a un punto de distribución, pero que el paquete está en estado Failed o In Progress para dp.

  1. En primer lugar, revise DistMgr.log en el sitio (principal/secundario) donde reside el DP.

    1. Busca ~Entradas de paquete de procesamiento en el registro e identifica el subproceso de procesamiento del paquete para el identificador de paquete en cuestión. Filtra DistMgr.log por el id. de subproceso que identificaste. Revisa el paso 4 de Distribuir un paquete a DP estándar para ver extractos de registro.
    2. Revisa el registro filtrado y comprueba si se creó un subproceso DP para el DP en cuestión. Filtra DistMgr.log por el id. de subproceso para que sea más fácil.
    3. Revise el registro filtrado y compruebe si se creó un trabajo de PkgXferMgr.
  2. Revisa PkgXferMgr.log en el sitio (principal/secundario) donde reside el DP.

    1. Busca la solicitud de envío encontrada con entradas id. en el registro e identifica el subproceso de envío de la combinación dp/paquete afectada. Filtra PkgXferMgr.log por el id. de subproceso identificado. Revisa el paso 6 de Distribuir un paquete a DP estándar para ver extractos de registro.
    2. Revise el registro filtrado para ver si el contenido se ha transferido correctamente a dp o si se ha producido un error.
  3. Para los DP estándar, PkgXferMgr copia los archivos de contenido en dp, indica al proveedor WMI de DP que agregue el archivo a la biblioteca de contenido llamando a métodos WMI. Revisa SMSDPProv.log en dp para asegurarte de que el contenido se ha agregado a la biblioteca de contenido. Revisa el paso 7 de Distribuir un paquete a DP estándar para ver extractos de registro.

    Para los DP de extracción, PkgXferMgr notifica a Pull DP que inicie la descarga de contenido. Revisa los pasos 8 a 16 de Distribuir un paquete para extraer DP para comprender el flujo y revisa PullDP.log y DataTransferService.log para asegurarte de que el contenido se ha descargado correctamente.

  4. Para los DP estándar, PkgXferMgr envía un mensaje de estado a DistMgr. Revise DistMgr.log para comprobar si el mensaje de estado se ha procesado correctamente. Revisa el paso 8 de Distribuir un paquete a DP estándar para ver extractos de registro.

    En el caso de los DP de extracción, pull DP envía un mensaje de estado para indicar que se ha hecho correctamente. Revisa los pasos del 16 al 22 de Distribuir un paquete para extraer DP para comprender el flujo y revisar los registros relevantes para garantizar que el mensaje de estado se procese correctamente.

  5. Si hay varios sitios implicados, asegúrese de que la replicación de bases de datos funciona y de que los vínculos de la base de datos entre sitios relevantes están activos.

Problemas comunes de DistMgr

  • DistMgr.log muestra la siguiente entrada para el identificador de paquete en cuestión:

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

    Esto suele ocurrir temporalmente mientras el contenido está en tránsito de un sitio a otro. Revise los registros del remitente o del administrador de sitios para asegurarse de que no haya problemas con las comunicaciones del sitio. Si ve errores durante la comunicación de sitio a sitio ( Programador de grupo de remitentes ), céntrate en resolver esos errores antes de solucionar el mensaje anterior -> -> en DistMgr.log. Revisa Distribuir un paquete a DP entre sitios para comprender el flujo de registro.

    Si no hay errores, puede que sea necesario forzar al sitio primario para que vuelva a enviar el paquete al sitio afectado. Vea Volver a enviar una copia comprimida de un paquete a un sitio para obtener más información.

  • DistMgr.log puede mostrar que está ocupado procesando otros paquetes y está usando todos los subprocesos disponibles para el procesamiento de paquetes.

    SMS_DISTRIBUTION_MANAGER 4824 (0x12d8) ~Actualmente usa 3 de 3 subprocesos de procesamiento de paquetes permitidos.

    Si ves esto, revisa los subprocesos de procesamiento de paquetes actuales en DistMgr.log para ver si están bloqueados. También puede revisar los valores del Registro Cola de procesamiento de paquetes y Paquetes que se están procesando en la siguiente clave del Registro para ver cuántos paquetes están actualmente en la cola de procesamiento:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Components\SMS_DISTRIBUTION_MANAGER

    Si los valores de los paquetes que se están procesando no cambian y se han quedado bloqueados durante un largo período de tiempo, es posible que DistMgr esté bloqueado o bloqueado. Si esto ocurre, capture un volcado de SMSExec.exe para su revisión.

    Si hay muchos paquetes en la cola pero la cola se está moviendo, puede que sea necesario revisar y cambiar la configuración del subproceso.

  • DistMgr.log no procesa los archivos PKN entrantes y, como resultado, los paquetes no se están procesando. Esto resulta en un registro pendiente de los archivos PKN en la bandeja de entrada de DistMgr.

    Los archivos PKN son procesados por el subproceso distMgr principal, por lo que en estos casos resulta útil identificar el identificador de subproceso principal de DistMgr buscando la entrada de registro de SMS_EXECUTIVE iniciado en SMS_DISTRIBUTION_MANAGER y, a continuación, filtrar DistMgr.log por el id. de subproceso identificado.

    En la mayoría de los casos, este problema se produce cuando el subproceso distmgr principal realiza una llamada WMI a un DP remoto pero WMI en dp no responde, lo que hace que DistMgr espere indefinidamente. Filtrar DistMgr.log para el subproceso distmgr principal puede proporcionar pistas sobre el DP con el que intenta comunicarse. Una vez identificado, comprueba si el DP responde y WMI es funcional en el DP. Si es necesario, reinicia el DP para ver si eso ayuda.

    Si el archivo DistMgr.log filtrado no proporciona ninguna pista, captura un volcado de SMSExec.exe estado de problema para su revisión.

Problemas comunes de PkgXferMgr

  • PkgXferMgr.log muestra un error al agregar archivos a la biblioteca de contenido en dp:

    SMS_PACKAGE_TRANSFER_MANAGER 5744 (0x1670) ~Sending completed [D:\SCCMContentLib\FileLib\B53B\B53B6F96ECC3FB2AF59D02C84A2D31434904BACF2F9C90D80107B6602860BCFD]
    SMS_PACKAGE_TRANSFER_MANAGER error 5744 (0x1670) ~ExecStaticMethod (80041001)
    SMS_DistributionPoint, AddFile
    SMS_PACKAGE_TRANSFER_MANAGER error 5744 (0x1670) CSendFileAction::AddFile; 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) ~ Error de envío. Recuento de errores = 1, hora de reinicio = 12/4/2014 6:14:27 AM Hora estándar del Este

    Después de que PkgXferMgr copie el archivo de contenido en la DP, ejecuta métodos WMI para indicar al DP remoto que agregue el archivo a la biblioteca de contenido. Si el DP remoto no puede agregar el archivo a la biblioteca de contenido, verá un error wmi genérico (0x80041001 = WBEM_E_FAILED) en PkgXferMgr.log.

    Cuando esto sucede, es necesario revisar SMSDPProv.log en dp para identificar el motivo por el que dp no pudo agregar el archivo a la biblioteca de contenido. Si ves errores de archivo o ruta de acceso no encontrados en SMSDPProv.log, deberás capturar un seguimiento del Monitor de procesos para determinar el motivo del error.

  • PkgXferMgr.log muestra que solo se permite una conexión al DP:

    SMS_PACKAGE_TRANSFER_MANAGER 21216 (0x52e0) ~Address to DPNAME. CONTOSO.COM está actualmente bajo control de ancho de banda, por lo que solo se permite una conexión, lo que devuelve la solicitud de envío al grupo de servidores.

    o

    SMS_PACKAGE_TRANSFER_MANAGER 21216 (0x52e0) ~Address to DPNAME. CONTOSO.COM está actualmente en modo de impulso, por lo que solo se permite una conexión.

    Si PkgXferMgr.log muestra que "solo se permite una conexión" a dp, significa que la DP está configurada para la limitación de ancho de banda. Si este es el caso, PkgXferMgr solo puede usar un subproceso para dp y, como resultado, solo envía un paquete a dp a la vez. Vea el control de ancho de banda y los subprocesos para obtener más información.

  • PkgXferMgr.log muestra que la dirección está cerrada:

    SMS_PACKAGE_TRANSFER_MANAGER 7156 (0x1BF4) La dirección está cerrada para trabajos de prioridad 2, deje de enviar[E:\SCCMContentLib\FileLib\2F08\2F0819F959E788CF843F42E9CA7B44E258B8B4BA37BB63902DB39ACF747BE7DA]
    SMS_PACKAGE_TRANSFER_MANAGER 7156 (0x1BF4) Eliminar el archivo remoto \ \DPNAME. CONTOSO.COM\SMS_DP$ \ <PackageID> .6-2F0819F959E788CF843F42E9CA7B44E258B8B4BA37BB63902DB39ACF747BE7DA
    SMS_PACKAGE_TRANSFER_MANAGER error 7156 (0x1BF4) CSendFileAction::SendFiles; 0x80004005
    SMS_PACKAGE_TRANSFER_MANAGER error al enviar 7156 (0x1BF4). Recuento de errores = 1, hora de reinicio = 15/3/2016 8:30:08 AM Horario de verano de la sierra

    Si ve esto en el registro, significa que dp está bajo control de ancho de banda y la dirección a dp cerrada mientras la transferencia de contenido estaba en curso. En el ejemplo anterior, la programación dp se configuró para Permitir prioridad alta solo durante las 8:00 a.m. a las 10:00 a.m. Como resultado, PkgXferMgr dejó de enviar contenido a las 8:00 a.m. y marcó el paquete/DP en un estado de error.

  • PkgXferMgr.log muestra varios subprocesos empezando al mismo tiempo para el mismo trabajo:

    SMS_PACKAGE_TRANSFER_MANAGER 8360 (0x20a8) Subproceso de envío a partir de Job: 12771, package: <PackageID> , Version: 8, Priority: 2, server: DPNAME. CONTOSO.COM, DPPriority: 200
    SMS_PACKAGE_TRANSFER_MANAGER 10752 (0x2a00) Envío de subprocesos a partir de Job: 12771, package: <PackageID> , Version: 8, Priority: 2, server: DPNAME. CONTOSO.COM, DPPriority: 200
    SMS_PACKAGE_TRANSFER_MANAGER 12208 (0x2fb0) Subproceso de envío a partir de Job: 12771, package: <PackageID> , Version: 8, Priority: 2, server: DPNAME. CONTOSO.COM, DPPriority: 200
    SMS_PACKAGE_TRANSFER_MANAGER 4244 (0x1094) Subproceso de envío a partir de Job: 12771, package: <PackageID> , Version: 8, Priority: 2, server: DPNAME. CONTOSO.COM, DPPriority: 200
    SMS_PACKAGE_TRANSFER_MANAGER 8348 (0x209c) Subproceso de envío a partir de Job: 12771, package: <PackageID> , Version: 8, Priority: 2, server: DPNAME. CONTOSO.COM, DPPriority: 200

    Normalmente, PkgXferMgr usa un subproceso para un trabajo, pero si usa varios subprocesos para el mismo trabajo, la transferencia de contenido puede empezar a producir errores debido a errores 0x80070020 (ERROR_SHARING_VIOLATION). Esto sucede si el servidor del sitio y los servidores de base de datos del sitio se encuentran en zonas horarias diferentes. La solución aquí es asegurarse de que el servidor del sitio y los servidores de base de datos del sitio tengan la misma zona horaria establecida.

Problemas comunes de pull DP

  • PkgXferMgr.log muestra que pull DP está en capacidad y no se envían más trabajos al DP de extracción:

    SMS_PACKAGE_TRANSFER_MANAGER 4712 (0x1268) PullDP ["Display= \ \P01PDP1. CONTOSO.COM \ "]MSWNET:["SMS_SITE=P01"] \ \P01PDP1. CONTOSO.COM ha \ alcanzado la capacidad máxima 50
    SMS_PACKAGE_TRANSFER_MANAGER 4712 (0x1268) ~ PullDP no tiene capacidad. Hora de reinicio = 10/10/2019 13:16:33 Hora estándar del Este

    PkgXferMgr ejecuta la siguiente consulta para comprobar cuántos trabajos están actualmente sin terminar en el DP de extracción. Si la consulta devuelve más de 50 trabajos, no enviará más trabajos a la DP de extracción.

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

    Estos trabajos se quitan de la tabla cuando pull DP envía un mensaje de estado Correcto o cuando se detiene el sondeo de estado (en función de DistributionJobs los valores configurados). Para ver los trabajos en el DP de extracción, puedes usar wbemtest o el Explorador wmi para revisar el recuento de instancias para la SMS_PullDPNotification clase. También puedes revisar las instancias de la clase WMI en el DP de extracción para identificar paquetes que están en estado Failed y revisar ROOT\SCCMDP:SMS_PullDPState PullDP.log, así como DataTransferService.log para investigar los errores.

  • SignatureDownload el trabajo de extraer DP produce un error HTTP 404.

    Se creó el trabajo DTS SignatureDownload {JOBID} para el paquete C010000D.28, content id ContentID. JobState = NotStarted
    Mensaje de error dts recibido para C010000D.28, trabajo de contenido {JOBID}, 0x80070002 : error de BITS: 'Estado HTTP 404: La dirección URL solicitada no existe en el servidor.

    Este es un problema conocido porque los archivos de firma no están presentes en una DP de origen que se coloca en un servidor de sitio. Este problema solo se produce cuando la acción de distribución no es redist.

    Para resolver este problema, use uno de los métodos siguientes:

    • Redistribuya el paquete (redistribuir el paquete no requiere la descarga de firmas ya que se descarga el contenido completo).
    • Configure el DP de extracción para usar un DP de origen que no esté situado en el servidor del sitio.
  • DataTransferService.log muestra 0x800706D9 al intentar descargar contenido del DP de origen:

    DataTransferService 4864 (0x1300) CDTSJob::HandleErrors: DTS Job '{5285F8B3-C426-4882-85F2-AD5331DD4179}' BITS Job '{D53BA625-24AA-41FA-A357-6EB1B7D7E701}" en el usuario 'S-1-5-18' OldErrorCount 29 NewErrorCount 30 ErrorCode

    0x800706D9 significa que no hay más puntos de conexión disponibles en el asignador de puntos de conexión. Este problema puede producirse debido a errores de asignación de puerto RPC causados por el firewall. También puede ocurrir cuando el servicio Firewall de Windows está deshabilitado.

    Compruebe si hay un firewall entre el servidor del sitio y el servidor afectado y compruebe si hay puertos RPC abiertos. También puedes capturar un seguimiento de red (del DP de extracción así como del servidor DP de origen) mientras reproduces el error para su revisión.

  • Pull DP muestra que tiene un gran número de trabajos, pero los trabajos no se están procesando.

    En algunos casos (normalmente después de la instalación de un nuevo DP de extracción cuando todo el contenido se envía a la DP de extracción), demasiados errores de trabajo en la dp de extracción pueden terminar detenidos el procesamiento de los trabajos. Aunque la mayoría de estos problemas se han corregido en las versiones recientes del producto (Configuration Manager versión 1810), algunos factores del entorno pueden provocar trabajos de extracción de DP que no procesen. Cuando esto sucede, es probable que vea miles de trabajos dts en la clase WMI y ROOT\ccm\DataTransferService:CCM_DTS_JobEx ~50 (o más) trabajos bits en estado de error. En este escenario, puede ser conveniente quitar todos los elementos específicos del trabajo de WMI en el DP de extracción y distribuir el contenido de nuevo a la DP de extracción de forma controlada e investigar errores.

    Para quitar todos los elementos específicos del trabajo de WMI en Pull DP, puedes usar el siguiente script de PowerShell (revisa los comentarios del script para obtener ayuda):

    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 ""
    
  • El contenido muestra Instalado en el DP de extracción, pero url y URLSubPath para la DP de extracción no se rellenan, lo que provoca problemas con los paquetes que tienen acceso ContentDPMap SMB habilitado.

    Cuando el DP de extracción tiene el contenido instalado correctamente, envía un mensaje de estado que contiene los datos necesarios para actualizar URL/URLSubPath los valores en ContentDPMap . Esto sucede cuando se procesa la respuesta dp de extracción. Revisa los pasos 16-22 de Distribuir un paquete para extraer DP para comprender el flujo y revisar los registros relevantes para investigar por qué no se está procesando el mensaje de estado. La causa más probable de este problema es un atraso de mensajes de estado en el punto de administración o un error de MPFDM al copiar archivos en el servidor del sitio debido a problemas \MP\outboxes\StateMsg.box de permisos.

Faltan archivos de contenido en la biblioteca de contenido

Hay ocasiones en las que observaría que falta contenido de la biblioteca de contenido. Esto puede ocurrir debido a problemas de distribución de contenido anteriores o a que alguien/algo elimina accidentalmente archivos de la biblioteca de contenido. Para confirmar que falta el contenido de la biblioteca de contenido, identifique un paquete afectado y realice un seguimiento del contenido del paquete desde PkgLib . FileLib

Una vez que confirme que falta el contenido necesario para un paquete en la biblioteca de contenido, vea Volver a enviar una copia comprimida de un paquete a un sitio para obtener información sobre cómo volver a rellenar el contenido.

Problemas genéricos

  • El registro distmgr o PkgXferMgr muestra un error de archivo/ruta de acceso no encontrado:

    SMS_PACKAGE_TRANSFER_MANAGER error 3776 (0xec0) CContentDefinition::TotalFileSizes; 0x80070003 SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) Envío de contenido 000f8a0a-825c-457b-a15b-57ade145a09b para el paquete <PackageID> SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) CSendFileAction::SendFiles falló; 0x80070003 SMS_PACKAGE_TRANSFER_MANAGER error 3776 (0xec0) CSendFileAction::SendContent; 0x80070003 SMS_PACKAGE_TRANSFER_MANAGER 648 (0x288) Estado enviado al administrador de distribución para pkg , versión 14, estado 4 y punto de distribución <PackageID> ["Display= \ \DPNAME. CONTOSO.COM \ "]MSWNET:["SMS_SITE=S01"] \ \DPNAME. CONTOSO.COM\~

    o

    SMS_PACKAGE_TRANSFER_MANAGER 11228 (0x2bdc) Envío de contenido heredado P0100053.2 para el paquete <PackageID>
    SMS_PACKAGE_TRANSFER_MANAGER error 11228 (0x2bdc) CContentDefinition::TotalFileSizes; 0x80070003
    SMS_PACKAGE_TRANSFER_MANAGER error 11228 (0x2bdc) CSendFileAction::SendFiles; 0x80070003

    Códigos de error comunes: 0x80070002, 0x80070003.

    En el caso de errores de archivo o ruta de acceso no encontrados, es probable que el problema se deba a que la biblioteca de contenido del servidor del sitio no tiene archivos de contenido para el paquete. Como resultado, PkgXferMgr no puede enviar los archivos a dp.

    En estos casos, puede identificar el identificador de contenido del registro y realizar un seguimiento del contenido para asegurarse PkgLib de que los archivos FileLib existen. También puede usar el Explorador de bibliotecas de contenido para comprobar si los archivos de contenido del paquete están disponibles en la biblioteca de contenido, pero el Explorador de bibliotecas de contenido puede tardar algún tiempo en cargarse y puede ser más fácil realizar un seguimiento manual del contenido desde . PkgLib FileLib Como alternativa, puede capturar un seguimiento del Monitor de procesos para comprobar si faltan los archivos necesarios en la biblioteca de contenido del servidor del sitio.

    Si el sitio que falta contenido en la biblioteca de contenido es el sitio de origen del paquete, es necesario actualizar el paquete para incrementar la versión del origen del paquete para que DistMgr vuelva a tomar una instantánea del contenido del directorio de origen del paquete y vuelva a rellenar el contenido que falta.

    Si el sitio que falta en la biblioteca de contenido es diferente del sitio de origen del paquete, puede forzar que el sitio de origen del paquete vuelva a enviar la copia comprimida del paquete al sitio afectado. Vea Volver a enviar una copia comprimida de un paquete a un sitio para obtener más información.

  • El registro de DistMgr/PkgXferMgr muestra un error de red:

    SMS_DISTRIBUTION_MANAGER 5112 (0x13f8) Error al realizar una conexión de red a \ \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 error 5112 (0x13f8). Realizar la limpieza de errores antes de volver.

    Códigos de error comunes: 2, 3, 53, 64.

    Para los errores relacionados con la red, revise el registro e identifique el servidor con el que está intentando comunicarse cuando reciba el error. Una vez identificado, pruebe lo siguiente:

    1. ¿Puede hacer ping al SERVERNAME afectado con la dirección FQDN/NetBIOS/IP?
    2. ¿Puede obtener acceso al recurso compartido \ \SERVERNAME\admin$ con la dirección IP/FQDN/NetBIOS con la cuenta SYSTEM desde el servidor del sitio?
    3. ¿Puede obtener acceso al recurso compartido \ \SERVERNAME\admin$ con la dirección FQDN/NetBIOS/IP con la cuenta del usuario que ha iniciado sesión desde el servidor del sitio?
    4. ¿Hay un firewall entre el servidor del sitio y el servidor afectado? ¿Están abiertos los puertos relevantes (RPC/SMB)?

    Si las pruebas anteriores se realizan correctamente, capture un seguimiento de red (tanto del servidor del sitio como del servidor afectado) mientras reproduce el error para su revisión.

  • El registro de DistMgr/PkgXferMgr muestra un error de acceso denegado:

    SMS_DISTRIBUTION_MANAGER 7076 (0x1ba4) Tomar instantáneas del paquete del origen <PackageID> \ \PS1SITE\PKGSOURCE\DummyPackage SMS_DISTRIBUTION_MANAGER 7076 (0x1ba4) ~El directorio de origen \PS1SITE\PKGSOURCE\DummyPackage no existe o el servicio SMS no puede tener acceso a él, el último error de \ Win32 = 5 SMS_DISTRIBUTION_MANAGER 7076 (0x1ba4) ~Failed to take snapshot of package <PackageID>

    Códigos de error comunes: 5, 0x80070005.

    Para ver los errores relacionados con permisos, revise el registro e identifique la ruta de acceso a la que está intentando obtener acceso cuando obtenga el error. Una vez identificado, pruebe lo siguiente:

    1. ¿Puede hacer ping al SERVERNAME afectado si la ruta de acceso es una ruta UNC?
    2. ¿La cuenta de equipo del servidor del sitio tiene permisos para tener acceso a la ruta de acceso?
    3. ¿Puede obtener acceso a la ruta de acceso afectada con la dirección FQDN/NetBIOS/IP al usar la cuenta SYSTEM desde el servidor del sitio?
    4. ¿Puede obtener acceso a la ruta de acceso afectada con la dirección FQDN/NetBIOS/IP al usar la cuenta del usuario que ha iniciado sesión desde el servidor del sitio?
    5. ¿Hay un firewall entre el servidor del sitio y el servidor afectado? ¿Están abiertos los puertos relevantes (RPC/SMB)?

    Si las pruebas anteriores se realizan correctamente, capture un seguimiento del Monitor de procesos desde el servidor del sitio mientras reproduce el error para su revisión.

  • DistMgr/PkgXferMgr busca contenido en el directorio en lugar de la \bin\x64\FileLib ubicación real de la biblioteca de contenido.

    Esto se debe a un problema conocido en la herramienta transferencia de biblioteca de contenido.