Résoudre les problèmes de distribution de contenu

Cet article explique comment résoudre les problèmes courants de distribution de contenu.

Version du produit d’origine : Configuration Manager Current Branch, Microsoft System Center 2012 Configuration Manager, Microsoft System Center 2012 R2 Configuration Manager

Exemple de problème

Pour cet exemple, supposons que vous avez distribué un package à un point de distribution, mais que le package est dans un état Échec ou En cours pour le dp.

  1. Tout d’abord, passez en revue DistMgr.log sur le site (principal/secondaire) où réside le dp.

    1. Recherchez ~Traitement des entrées de package dans le journal et identifiez le thread de traitement du package pour l’ID de package en question. Filtrez DistMgr.log pour l’ID de thread que vous avez identifié. Passez en revue l’étape 4 de la section Distribuer un package au dp de données standard pour afficher les extraits de journal.
    2. Passez en revue le journal filtré et case activée si un thread DP a été créé pour le dp en question. Filtrez DistMgr.log pour l’ID de thread pour faciliter cette opération.
    3. Passez en revue le journal filtré et case activée si un travail PkgXferMgr a été créé.
  2. Passez en revue PkgXferMgr.log sur le site (principal/secondaire) où réside le dp.

    1. Recherchez Requête d’envoi trouvée avec des entrées d’ID dans le journal et identifiez le thread d’envoi pour la combinaison DP/package affectée. Filtrez PkgXferMgr.log pour l’ID de thread identifié. Passez en revue l’étape 6 dans Distribuer un package au dp de données standard pour voir les extraits de journal.
    2. Passez en revue le journal filtré pour voir si le contenu a été correctement transféré vers le dp ou s’il y a eu une erreur.
  3. Pour les fournisseurs de données Standard, PkgXferMgr copie le ou les fichiers de contenu dans le dp. Il indique au fournisseur WMI DP d’ajouter le fichier à la bibliothèque de contenu en appelant des méthodes WMI. Passez en revue SMSDPProv.log sur le dp pour vous assurer que le contenu a été ajouté à la bibliothèque de contenu. Passez en revue l’étape 7 de Distribuer un package au dp standard pour voir les extraits de journal.

    Pour les DPs d’extraction, PkgXferMgr avertit pull DP de lancer le téléchargement de contenu. Passez en revue les étapes 8 à 16 de La section Distribuer un package pour extraire le dp pour comprendre le flux et passer en revue les PullDP.log et DataTransferService.log pour vous assurer que le contenu a été téléchargé avec succès.

  4. Pour les fournisseurs de données standard, PkgXferMgr envoie un message status à DistMgr. Passez en revue DistMgr.log pour vérifier si le message status a été traité correctement. Passez en revue l’étape 8 de La distribution d’un package au DP standard pour voir les extraits de journal.

    Pour les DPS d’extraction, pull DP envoie un message d’état pour indiquer la réussite. Passez en revue les étapes 16 à 22 dans Distribuer un package pour tirer (pull) dp pour comprendre le flux et passez en revue les journaux pertinents pour vous assurer que le message d’état est traité correctement.

  5. Si plusieurs sites sont impliqués, assurez-vous que la réplication de base de données fonctionne et que les liens de base de données entre les sites appropriés sont actifs.

Problèmes courants liés à DistMgr

  • DistMgr.log affiche l’entrée suivante pour l’ID de package en question :

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

    Cela se produit généralement temporairement lorsque le contenu est en transit d’un site à un autre. Passez en revue les journaux expéditeur/dépooleur pour vous assurer qu’il n’y a aucun problème avec les communications de site. Si vous voyez des erreurs pendant la communication de site à site (Planificateur ->Expéditeur -Despooler), concentrez-vous> sur la résolution de ces erreurs avant de résoudre le message ci-dessus dans DistMgr.log. Consultez Distribuer un package à dp sur plusieurs sites pour comprendre le flux de journal.

    S’il n’y a pas d’erreur, il peut être nécessaire de forcer le site parent à renvoyer le package au site affecté. Pour plus d’informations, consultez Renvoyer une copie compressée d’un package à un site .

  • DistMgr.log peut montrer qu’il est occupé à traiter d’autres packages et qu’il utilise tous les threads disponibles pour le traitement des packages.

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

    Si vous voyez cela, passez en revue les threads de traitement de package actuels dans DistMgr.log pour voir s’ils sont bloqués. Vous pouvez également consulter les valeurs de Registre File d’attente de traitement despackages et Packages en cours de traitement sous la clé de Registre suivante pour voir le nombre de packages actuellement dans la file d’attente de traitement :

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Components\SMS_DISTRIBUTION_MANAGER

    Si les valeurs packages en cours de traitement ne changent pas et sont bloquées sur une longue période, il est possible que DistMgr soit bloqué/bloqué. Si cela se produit, capturez un vidage de processus de SMSExec.exe pour révision.

    S’il y a de nombreux packages dans la file d’attente mais que la file d’attente est en cours de déplacement, il peut être nécessaire d’examiner et de modifier la configuration du thread.

  • DistMgr.log ne traite pas les fichiers PKN entrants et, par conséquent, les packages ne sont pas traités. Cela entraîne un backlog de fichiers PKN dans la boîte de réception DistMgr.

    Les fichiers PKN sont traités par le thread DistMgr main. Dans ces cas, il est utile d’identifier l’ID de thread DistMgr main en recherchant l’entrée de journal SMS_EXECUTIVE démarrée SMS_DISTRIBUTION_MANAGER, puis en filtrant les DistMgr.log pour l’ID de thread identifié.

    Dans la plupart des cas, ce problème se produit lorsque le thread d’main DistMgr effectue un appel WMI à un DP distant, mais que WMI sur le dp ne répond pas, ce qui oblige DistMgr à l’attendre indéfiniment. Le filtrage des DistMgr.log pour le thread d’main DistMgr peut fournir des indices sur le dp qu’il tente de communiquer avec. Une fois identifié, case activée si le DP répond et que WMI est fonctionnel sur le dp. Si nécessaire, redémarrez le dp pour voir si cela vous aide.

    Si la DistMgr.log filtrée ne fournit aucun indice, capturez un vidage de processus de SMSExec.exe dans l’état du problème pour examen.

Problèmes courants liés à PkgXferMgr

  • PkgXferMgr.log affiche une erreur lors de l’ajout de fichiers à la bibliothèque de contenu sur le 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
    

    Une fois que PkgXferMgr a copié le fichier de contenu dans le dp, il exécute des méthodes WMI pour indiquer au dp distant d’ajouter le fichier à la bibliothèque de contenu. Si le dp distant ne parvient pas à ajouter le fichier à la bibliothèque de contenu, une erreur WMI générique (0x80041001 = WBEM_E_FAILED) s’affiche dans PkgXferMgr.log.

    Dans ce cas, il est nécessaire de passer en revue SMSDPProv.log sur le dp pour identifier la raison pour laquelle le dp n’a pas pu ajouter le fichier à la bibliothèque de contenu. Si vous voyez des erreurs fichier/chemin introuvable dans SMSDPProv.log, vous devez capturer une trace du moniteur de processus pour déterminer la raison de l’échec.

  • PkgXferMgr.log montre qu’une seule connexion est autorisée au 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.
    

    Si PkgXferMgr.log indique qu’une seule connexion est autorisée au dp, cela signifie que le dp est configuré pour la limitation de bande passante. Si c’est le cas, PkgXferMgr ne peut utiliser qu’un seul thread pour le DP et, par conséquent, n’envoyer qu’un seul package au dp à la fois. Pour plus d’informations, consultez Contrôle de bande passante et threads .

  • PkgXferMgr.log indique que l’adresse est fermée :

    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 vous voyez cela dans le journal, cela signifie que le dp est sous contrôle de la bande passante et que l’adresse du DP est fermée pendant que le transfert de contenu était en cours. Dans l’exemple ci-dessus, la planification dp a été configurée pour Autoriser une priorité élevée uniquement entre 8h00 et 10h00. Par conséquent, PkgXferMgr a cessé d’envoyer du contenu à 8h00 et a marqué le package/DP dans un état d’échec.

  • PkgXferMgr.log montre plusieurs threads commençant en même temps pour le même travail :

    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
    

    En règle générale, PkgXferMgr utilise un thread pour un travail, mais s’il utilise plusieurs threads pour le même travail, le transfert de contenu peut commencer à échouer en raison d’une erreur 0x80070020 (ERROR_SHARING_VIOLATION). Cela se produit si le serveur de site et les serveurs de base de données de site se trouvent dans des fuseaux horaires différents. La solution ici consiste à s’assurer que le serveur de site et les serveurs de base de données de site ont le même fuseau horaire défini.

Problèmes courants liés à l’extraction de données

  • PkgXferMgr.log montre que le pull DP est à sa capacité et qu’aucun autre travail n’est envoyé à la dp d’extraction :

    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 exécute la requête suivante pour case activée le nombre de travaux actuellement inachevés sur le dp d’extraction. Si la requête retourne plus de 50 travaux, elle n’envoie plus de travaux au dp d’extraction.

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

    Ces travaux sont supprimés de la table lorsque l’extraction DistributionJobs de données envoie un message d’état de réussite ou lorsque l’interrogation status s’arrête (en fonction des valeurs configurées). Pour voir les travaux sur le dp d’extraction, vous pouvez utiliser wbemtest ou WMI Explorer pour passer en revue le nombre de instance pour SMS_PullDPNotification la classe. Vous pouvez également passer en revue les instances de ROOT\SCCMDP:SMS_PullDPState la classe WMI sur le dp d’extraction pour identifier les packages qui sont dans un état Échec et passer en revue PullDP.log ainsi que DataTransferService.log pour examiner les échecs.

  • SignatureDownload Le travail sur pull DP échoue avec l’erreur HTTP 404.

    Création de la signatureTélécharger le travail DTS {JOBID} pour le package C010000D.28, content ID ContentID. JobState = NotStarted
    Message d’erreur DTS reçu pour C010000D.28, travail de contenu {JOBID}, 0x80070002 : Erreur BITS : ' HTTP status 404 : L’URL demandée n’existe pas sur le serveur.

    Il s’agit d’un problème connu, car les fichiers de signature ne sont pas présents sur un DP source qui est colocalisé sur un serveur de site. Ce problème se produit uniquement lorsque l’action de distribution n’est pas redissinée.

    Pour contourner ce problème, appliquez l’une des méthodes suivantes :

    • Redistribuez le package (la redistribution du package ne nécessite pas de téléchargement de signatures, car le contenu complet est téléchargé).
    • Configurez le dp d’extraction pour utiliser un dp source qui n’est pas colocalisé sur le serveur de site.
  • DataTransferService.log affiche 0x800706D9 lors de la tentative de téléchargement de contenu à partir du DP source :

    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 signifie qu’il n’y a plus de points de terminaison disponibles à partir du mappeur de point de terminaison. Ce problème peut se produire en raison d’échecs d’allocation de ports RPC causés par le pare-feu. Elle peut également se produire lorsque le service Pare-feu Windows est désactivé.

    Vérifiez s’il existe un pare-feu entre le serveur de site et le serveur affecté et déterminez si les ports RPC sont ouverts. Vous pouvez également capturer une trace réseau (à partir du dp d’extraction ainsi que du serveur DP source) tout en reproduisant l’erreur pour révision.

  • Pull DP montre qu’il a un grand nombre de travaux, mais que les travaux ne sont pas traités.

    Dans certains cas (normalement après l’installation d’une nouvelle demande de tirage lorsque tout le contenu est envoyé à la dp d’extraction), un trop grand nombre d’échecs de travail sur le dp d’extraction peut se retrouver bloqué le traitement des travaux. Bien que la plupart de ces problèmes soient résolus dans les versions récentes du produit (Configuration Manager version 1810), certains facteurs environnementaux peuvent faire en sorte que les tâches de tirage ne soient pas traitées. Dans ce cas, vous verrez probablement des milliers de travaux DTS dans ROOT\ccm\DataTransferService:CCM_DTS_JobEx la classe WMI et environ 50 (ou plus) travaux BITS dans l’état Échec . Dans ce scénario, il peut être avantageux de supprimer tous les éléments spécifiques au travail de WMI sur le dp d’extraction et de redistribuer le contenu au dp d’extraction de manière contrôlée et d’examiner les échecs.

    Pour supprimer tous les éléments spécifiques au travail de WMI sur le pull DP, vous pouvez utiliser le script PowerShell ci-dessous (consultez les commentaires du script pour obtenir de l’aide) :

    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 ""
    
  • Le contenu affiche Installé sur le dp d’extraction, mais l’URL et l’URLSubPath pour le dp d’extraction ne sont pas renseignés dans ContentDPMap, ce qui provoque des problèmes avec les packages pour lesquels l’accès SMB est activé.

    Lorsque le contenu est correctement installé par le dp d’extraction, il envoie un message d’état qui contient les données nécessaires pour mettre à jour les URL/URLSubPath valeurs dans ContentDPMap. Cela se produit lorsque la réponse pull DP est traitée. Passez en revue les étapes 16 à 22 dans Distribuer un package pour tirer (pull) dp afin de comprendre le flux et passez en revue les journaux pertinents pour déterminer pourquoi le message d’état n’est pas traité. La cause la plus probable de ce problème est un backlog de messages d’état dans le \MP\outboxes\StateMsg.box sur le point de gestion ou MPFDM qui ne parvient pas à copier des fichiers vers le serveur de site en raison de problèmes d’autorisation.

Fichiers de contenu manquants dans la bibliothèque de contenu

Il arrive que vous remarquez du contenu manquant dans la bibliothèque de contenu. Cela peut se produire en raison de problèmes de distribution de contenu précédents ou d’une personne ou d’un élément supprimant accidentellement des fichiers de la bibliothèque de contenu. Pour vérifier que le contenu est manquant dans la bibliothèque de contenu, identifiez un package affecté et suivez le contenu du package de PkgLib à FileLib.

Une fois que vous confirmez que le contenu requis pour un package est manquant dans la bibliothèque de contenu, consultez Renvoyer une copie compressée d’un package à un site pour plus d’informations sur la façon de remplir à nouveau le contenu.

Problèmes génériques

  • Le journal DistMgr ou PkgXferMgr affiche une erreur de fichier/chemin d’accès introuvable :

    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
    

    Codes d’erreur courants : 0x80070002, 0x80070003.

    Pour les erreurs de fichier/chemin d’accès introuvables, le problème est probablement dû au fait que la bibliothèque de contenu sur le serveur de site ne contient pas de fichiers de contenu pour le package. Par conséquent, PkgXferMgr n’est pas en mesure d’envoyer les fichiers au dp.

    Dans ce cas, vous pouvez identifier l’ID de contenu à partir du journal et suivre le contenu de PkgLib à FileLib pour vous assurer que les fichiers existent. Vous pouvez également utiliser le Explorer de la bibliothèque de contenu pour case activée si les fichiers de contenu du package sont disponibles dans la bibliothèque de contenu. Toutefois, le chargement de la Explorer bibliothèque de contenu peut prendre un certain temps et il peut être plus facile de suivre manuellement le contenu de PkgLib à FileLib. Vous pouvez également capturer une trace Process Monitor pour vérifier si les fichiers nécessaires sont manquants dans la bibliothèque de contenu sur le serveur de site.

    Si le site qui manque du contenu dans la bibliothèque de contenu est le site source du package, il est nécessaire de mettre à jour le package pour incrémenter la version de la source du package afin que DistMgr prenne une instantané du contenu du répertoire source du package et remplisse à nouveau le contenu manquant.

    Si le contenu manquant dans la bibliothèque de contenu est différent du site source du package, vous pouvez forcer le site source du package à renvoyer la copie compressée du package au site affecté. Pour plus d’informations, consultez Renvoyer une copie compressée d’un package à un site .

  • Le journal DistMgr/PkgXferMgr affiche une erreur réseau :

    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.
    

    Codes d’erreur courants : 2, 3, 53, 64.

    Pour les erreurs liées au réseau, passez en revue le journal et identifiez le serveur avec lequel vous essayez de communiquer lorsque vous obtenez l’erreur. Une fois identifié, testez les éléments suivants :

    1. Pouvez-vous effectuer un test ping sur serverNAME affecté à l’aide de l’adresse FQDN/NetBIOS/IP ?
    2. Pouvez-vous accéder au partage \\SERVERNAME\admin$ à l’aide du nom de domaine complet/netBIOS/adresse IP à l’aide du compte SYSTEM à partir du serveur de site ?
    3. Pouvez-vous accéder au partage \\SERVERNAME\admin$ à l’aide du nom de domaine complet/netBIOS/adresse IP à l’aide du compte d’utilisateur connecté à partir du serveur de site ?
    4. Existe-t-il un pare-feu entre le serveur de site et le serveur affecté ? Les ports appropriés (RPC/SMB) sont-ils ouverts ?

    Si les tests ci-dessus réussissent, capturez une trace réseau (à partir du serveur de site ainsi que du serveur affecté) tout en reproduisant l’erreur pour révision.

  • Le journal DistMgr/PkgXferMgr affiche une erreur d’accès refusé :

    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>
    

    Codes d’erreur courants : 5, 0x80070005.

    Pour les erreurs liées aux autorisations, passez en revue le journal et identifiez le chemin d’accès auquel vous essayez d’accéder lorsque vous obtenez l’erreur. Une fois identifié, testez les éléments suivants :

    1. Pouvez-vous effectuer un test ping sur serverNAME affecté si le chemin est un chemin UNC ?
    2. Le compte d’ordinateur du serveur de site dispose-t-il des autorisations nécessaires pour accéder au chemin d’accès ?
    3. Pouvez-vous accéder au chemin d’accès affecté à l’aide du nom de domaine complet/netBIOS/adresse IP lors de l’utilisation du compte SYSTEM à partir du serveur de site ?
    4. Pouvez-vous accéder au chemin d’accès affecté à l’aide du nom de domaine complet/netBIOS/adresse IP lors de l’utilisation du compte d’utilisateur connecté à partir du serveur de site ?
    5. Existe-t-il un pare-feu entre le serveur de site et le serveur affecté ? Les ports appropriés (RPC/SMB) sont-ils ouverts ?

    Si les tests ci-dessus réussissent, capturez une trace Process Monitor à partir du serveur de site tout en reproduisant l’erreur pour révision.

  • DistMgr/PkgXferMgr recherche du contenu dans le \bin\x64\FileLib répertoire au lieu de l’emplacement réel de la bibliothèque de contenu.

    Cela est dû à un problème connu dans l’outil de transfert de bibliothèque de contenu.