Compartir a través de


Solución de 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: Configuration Manager rama actual, Microsoft System Center 2012 Configuration Manager, Microsoft System Center 2012 R2 Configuration Manager

Problema de ejemplo

En este ejemplo, supongamos que ha distribuido un paquete a un punto de distribución, pero el paquete se encuentra en un estado Failed o In Progress para el DP.

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

    1. Busque ~Processing package en el registro e identifique el subproceso de procesamiento de paquetes para el identificador de paquete en cuestión. Filtre DistMgr.log por el identificador de subproceso que ha identificado. Revise el paso 4 de Distribución de un paquete a DP estándar para ver extractos de registro.
    2. Revise el registro filtrado y compruebe si se creó un subproceso dp para el DP en cuestión. Filtre DistMgr.log para que el identificador de subproceso sea más fácil.
    3. Revise el registro filtrado y compruebe si se creó un trabajo de PkgXferMgr.
  2. Revise PkgXferMgr.log en el sitio (principal o secundario) donde reside el DP.

    1. Busque Solicitud de envío encontrada con entradas de identificador en el registro e identifique el subproceso de envío para la combinación de DP/paquete afectada. Filtre PkgXferMgr.log para el identificador de subproceso identificado. Revise el paso 6 de Distribución de un paquete a DP estándar para ver extractos de registro.
    2. Revise el registro filtrado para ver si el contenido se transfirió correctamente al DP o si se produjo un error.
  3. En el caso de los DP estándar, PkgXferMgr copia los archivos de contenido en el DP, y indica al proveedor WMI de DP que agregue el archivo a la biblioteca de contenido llamando a métodos WMI. Revise SMSDPProv.log en el DP para asegurarse de que el contenido se agregó a la biblioteca de contenido. Revise el paso 7 de Distribución de un paquete a DP estándar para ver extractos de registro.

    En el caso de los DP de extracción, PkgXferMgr notifica a pull DP que inicie la descarga de contenido. Revise los pasos del 8 al 16 en Distribución de un paquete para extraer DP para comprender el flujo y revisar PullDP.log y DataTransferService.log para asegurarse de que el contenido se descargó correctamente.

  4. En el caso de los DPs estándar, PkgXferMgr envía un mensaje de estado a DistMgr. Revise DistMgr.log para comprobar si el mensaje de estado se procesó correctamente. Revise el paso 8 de Distribución de 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 realizado correctamente. Revise los pasos del 16 al 22 en Distribución de un paquete para extraer DP para comprender el flujo y revisar los registros pertinentes para asegurarse de que el mensaje de estado se procese correctamente.

  5. Si hay varios sitios implicados, asegúrese de que la replicación de base de datos funciona y que los vínculos de base de datos entre los sitios pertinentes 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 remitentes o de cola para asegurarse de que no haya ningún problema con las comunicaciones del sitio. Si ve errores durante la comunicación de sitio a sitio (Scheduler ->Sender ->Despooler), céntrese en resolver esos errores antes de solucionar el mensaje anterior en DistMgr.log. Revise Distribución de un paquete a DP entre sitios para comprender el flujo de registro.

    Si no hay errores, es posible que sea necesario forzar al sitio primario a volver a enviar el paquete al sitio afectado. Consulte Reenviar 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 usa todos los subprocesos disponibles para el procesamiento de paquetes.

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

    Si ve esto, revise los subprocesos de procesamiento de paquetes actuales en DistMgr.log para ver si están bloqueados. También puede revisar los valores de Cola de procesamiento de paquetes y Paquetes procesados 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 Paquetes que se procesan no cambian y se bloquean durante un largo período de tiempo, es posible que DistMgr esté bloqueado o bloqueado. Si esto sucede, capture un volcado de proceso 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 procesan. Esto da lugar a un trabajo pendiente de archivos PKN en la bandeja de entrada de DistMgr.

    El subproceso principal de DistMgr procesa los archivos PKN, por lo que, en estos casos, resulta útil identificar el identificador de subproceso de DistMgr principal buscando el SMS_EXECUTIVE iniciado SMS_DISTRIBUTION_MANAGER entrada de registro y, a continuación, filtrar el DistMgr.log por el identificador de subproceso identificado.

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

    Si el DistMgr.log filtrado no proporciona ninguna pista, capture un volcado de proceso de SMSExec.exe mientras está en 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 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
    

    Una vez que PkgXferMgr copia el archivo de contenido en 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 el DP para identificar el motivo por el que el DP no pudo agregar el archivo a la biblioteca de contenido. Si ve errores de archivo o ruta de acceso no encontrados en SMSDPProv.log, deberá 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 is currently under bandwidth control, therefore only one connection is allowed, returning send request to the pool.
    

    o

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

    Si PkgXferMgr.log muestra que "solo se permite una conexión" al DP, significa que el DP está configurado para la limitación de ancho de banda. Si este es el caso, PkgXferMgr solo puede usar un subproceso para el DP y, como resultado, enviar solo un paquete al DP a la vez. Consulte Control de ancho de banda y subprocesos para obtener más información.

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

    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
    

    Si ve esto en el registro, significa que el DP está bajo control de ancho de banda y que la dirección al DP se cerró mientras la transferencia de contenido estaba en curso. En el ejemplo anterior, la programación de 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 o DP en un estado de error.

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

    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 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 0x80070020 de error (ERROR_SHARING_VIOLATION). Esto sucede si el servidor de sitio y los servidores de base de datos de sitio están en zonas horarias diferentes. La solución aquí es asegurarse de que el servidor de sitio y los servidores de base de datos de sitio tengan el mismo conjunto de zona horaria.

Problemas comunes de dp de extracción

  • PkgXferMgr.log muestra que el dp de extracción está a la 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\ 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 ejecuta la consulta siguiente para comprobar cuántos trabajos están actualmente en estado inacabado en el dp de extracción. Si la consulta devuelve más de 50 trabajos, no enviará más trabajos al 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 la DistributionJobs extracción de DP envía un mensaje de estado Correcto o cuando se detiene el sondeo de estado (en función de los valores configurados). Para ver los trabajos en el dp de extracción, puede usar wbemtest o el Explorador WMI para revisar el recuento de instancias de la SMS_PullDPNotification clase . También puede revisar las instancias de ROOT\SCCMDP:SMS_PullDPState la clase WMI en el dp de extracción para identificar los paquetes que se encuentran en estado Con error y revisar PullDP.log , así como DataTransferService.log para investigar los errores.

  • SignatureDownload El trabajo en dp de extracción produce un error HTTP 404.

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

    Se trata de un problema conocido porque los archivos de firma no están presentes en un DP de origen que está colocado 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:

    • Redistribuir el paquete (la redistribución del paquete no requiere la descarga de firmas, ya que se descarga todo el contenido).
    • Configure el dp de extracción para usar un DP de origen que no esté colocado en el servidor de 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}' under user '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 producirse cuando el servicio Firewall de Windows está deshabilitado.

    Compruebe si hay un firewall entre el servidor de sitio y el servidor afectado y averigüe si los puertos RPC están abiertos. También puede capturar un seguimiento de red (desde el dp de extracción, así como el servidor DP de origen) mientras reproduce el error para su revisión.

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

    En algunos casos (normalmente después de la instalación de un nuevo dp de extracción cuando todo el contenido se envía al dp de extracción), demasiados errores de trabajo en el dp de extracción pueden terminar paralizando el procesamiento de los trabajos. Aunque la mayoría de estos problemas se corrigen en las versiones recientes del producto (Configuration Manager versión 1810), algunos factores ambientales pueden dar lugar a que dp de extracción no procese trabajos. Cuando esto sucede, es probable que vea miles de trabajos DTS en ROOT\ccm\DataTransferService:CCM_DTS_JobEx la clase WMI y aproximadamente 50 (o más) trabajos de BITS en estado con error . En este escenario, puede ser beneficioso quitar todos los elementos específicos del trabajo de WMI en el dp de extracción y distribuir el contenido de nuevo al dp de extracción de forma controlada e investigar los errores.

    Para quitar todos los elementos específicos del trabajo de WMI en pull DP, puede usar el siguiente script de PowerShell (revise 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 el dp de extracción no se rellenan en ContentDPMap, lo que provoca problemas con los paquetes que tienen habilitado el acceso SMB.

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

Faltan archivos de contenido en la biblioteca de contenido

Hay ocasiones en las que observaría que faltaba contenido de la biblioteca de contenido. Esto puede ocurrir debido a problemas de distribución de contenido anteriores o a alguien o algo que 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 de PkgLib a FileLib.

Una vez que confirme que falta el contenido necesario para un paquete en la biblioteca de contenido, consulte Reenviar 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 o ruta de acceso no encontrada:

    SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) CContentDefinition::TotalFileSizes failed; 0x80070003
    SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) Sending content 000f8a0a-825c-457b-a15b-57ade145a09b for package \<PackageID>
    SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) CSendFileAction::SendFiles failed; 0x80070003
    SMS_PACKAGE_TRANSFER_MANAGER 3776 (0xec0) CSendFileAction::SendContent failed; 0x80070003
    SMS_PACKAGE_TRANSFER_MANAGER 648 (0x288) Sent status to the distribution manager for pkg <PackageID>, version 14, status 4 and distribution point ["Display=\\DPNAME.CONTOSO.COM\"]MSWNET:["SMS_SITE=S01"]\\DPNAME.CONTOSO.COM\~
    

    o

    SMS_PACKAGE_TRANSFER_MANAGER 11228 (0x2bdc) Sending legacy content P0100053.2 for package <PackageID>  
    SMS_PACKAGE_TRANSFER_MANAGER 11228 (0x2bdc) CContentDefinition::TotalFileSizes failed; 0x80070003  
    SMS_PACKAGE_TRANSFER_MANAGER 11228 (0x2bdc) CSendFileAction::SendFiles failed; 0x80070003
    

    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 al hecho de que la biblioteca de contenido del servidor de sitio no tiene archivos de contenido para el paquete. Como resultado, PkgXferMgr no puede enviar los archivos al DP.

    En estos casos, puede identificar el identificador de contenido del registro y realizar un seguimiento del contenido de PkgLib a FileLib para asegurarse de que los archivos existen. También puede usar el Explorador de biblioteca de contenido para comprobar si los archivos de contenido del paquete están disponibles en la biblioteca de contenido, pero el Explorador de biblioteca de contenido puede tardar algún tiempo en cargarse y puede ser más fácil realizar un seguimiento manual del contenido de PkgLib a FileLib. Como alternativa, puede capturar un seguimiento de Monitor de procesos para comprobar si faltan los archivos necesarios en la biblioteca de contenido del servidor de 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 tome una instantánea del contenido del directorio de origen del paquete de nuevo 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 al sitio de origen del paquete a volver a enviar la copia comprimida del paquete al sitio afectado. Consulte Reenviar 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) 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 error comunes: 2, 3, 53, 64.

    En el caso de los errores relacionados con la red, revise el registro e identifique el servidor con el que intenta comunicarse cuando se produce el error. Una vez identificado, pruebe lo siguiente:

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

    Si las pruebas anteriores se realizan correctamente, capture un seguimiento de red (desde el servidor de sitio, así como desde el 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)    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 error comunes: 5, 0x80070005.

    En el caso de los errores relacionados con los permisos, revise el registro e identifique la ruta de acceso a la que intenta acceder cuando reciba 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 de sitio tiene permisos para acceder a la ruta de acceso?
    3. ¿Puede acceder a la ruta de acceso afectada mediante el FQDN, NetBIOS o la dirección IP al usar la cuenta SYSTEM desde el servidor de sitio?
    4. ¿Puede acceder a la ruta de acceso afectada mediante el FQDN, NetBIOS o la dirección IP al usar la cuenta del usuario que ha iniciado sesión desde el servidor de sitio?
    5. ¿Hay un firewall entre el servidor de sitio y el servidor afectado? ¿Están abiertos los puertos pertinentes (RPC/SMB )?

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

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

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