Problemen met inhoudsdistributie oplossen

In dit artikel wordt beschreven hoe u veelvoorkomende problemen met de distributie van inhoud kunt oplossen.

Oorspronkelijke productversie: Configuration Manager current branch, Microsoft System Center 2012 Configuration Manager, Microsoft System Center 2012 R2 Configuration Manager

Voorbeeldprobleem

In dit voorbeeld stelt u dat u een pakket hebt gedistribueerd naar een distributiepunt, maar dat het pakket de status Mislukt of In uitvoering heeft voor de DP.

  1. Controleer eerst DistMgr.log op de site (primair/secundair) waar de DP zich bevindt.

    1. Zoek naar ~Processing package entries in het logboek en identificeer de pakketverwerkingsthread voor de betreffende pakket-id. Filter DistMgr.log op de thread-id die u hebt geïdentificeerd. Bekijk stap 4 in Een pakket distribueren naar standard DP om logboekfragmenten te bekijken.
    2. Controleer het gefilterde logboek en controleer of er een DP-thread is gemaakt voor de betreffende DP. Filter DistMgr.log op de thread-id om dit gemakkelijker te maken.
    3. Controleer het gefilterde logboek en controleer of er een PkgXferMgr-taak is gemaakt.
  2. Controleer PkgXferMgr.log op de site (primair/secundair) waar de DP zich bevindt.

    1. Zoek naar Gevonden verzendaanvraag met id-vermeldingen in het logboek en identificeer de verzendthread voor de betreffende DP-/pakketcombinatie. Filter PkgXferMgr.log op de thread-id die is geïdentificeerd. Bekijk stap 6 in Een pakket distribueren naar standard DP om logboekfragmenten te bekijken.
    2. Controleer het gefilterde logboek om te zien of de inhoud is overgebracht naar de DP of dat er een fout is opgetreden.
  3. Voor Standard-DC's kopieert PkgXferMgr de inhoudsbestanden naar de DP. De DP WMI-provider geeft de opdracht om het bestand toe te voegen aan de inhoudsbibliotheek door WMI-methoden aan te roepen. Controleer SMSDPProv.log op de DP om ervoor te zorgen dat inhoud is toegevoegd aan de inhoudsbibliotheek. Bekijk stap 7 in Een pakket distribueren naar standard DP om logboekfragmenten te bekijken.

    Voor pull-DP's meldt PkgXferMgr pull DP om het downloaden van de inhoud te starten. Bekijk stap 8-16 in Een pakket distribueren om DP op te halen om de stroom te begrijpen en PullDP.log en DataTransferService.log te controleren om te controleren of inhoud is gedownload.

  4. Voor standaard-DC's stuurt PkgXferMgr een statusbericht naar DistMgr. Controleer DistMgr.log om te controleren of het statusbericht is verwerkt. Bekijk stap 8 in Een pakket distribueren naar standard DP om logboekfragmenten te bekijken.

    Voor pull-DP wordt een statusbericht verzonden om aan te geven dat het is gelukt. Bekijk stap 16-22 in Een pakket distribueren om DP op te halen om de stroom te begrijpen en de relevante logboeken te controleren om te controleren of het statusbericht is verwerkt.

  5. Als er meerdere sites bij betrokken zijn, moet u ervoor zorgen dat de databasereplicatie werkt en dat de databasekoppelingen tussen relevante sites actief zijn.

Veelvoorkomende problemen met DistMgr

  • DistMgr.log toont de volgende vermelding voor de betreffende pakket-id:

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

    Dit gebeurt meestal tijdelijk terwijl de inhoud van de ene site naar de andere wordt overgedragen. Controleer de afzender-/despooler-logboeken om er zeker van te zijn dat er geen problemen zijn met de sitecommunicatie. Als u fouten ziet tijdens site-naar-site-communicatie (Scheduler ->Sender ->Despooler), richt u zich op het oplossen van deze fouten voordat u het bovenstaande bericht in DistMgr.log oplost. Raadpleeg Een pakket distribueren naar DP over sites voor meer informatie over de logboekstroom.

    Als er geen fouten zijn, kan het nodig zijn om de bovenliggende site af te dwingen het pakket opnieuw te verzenden naar de betreffende site. Zie Gecomprimeerde kopie van een pakket opnieuw verzenden naar een site voor meer informatie.

  • DistMgr.log kan laten zien dat het bezig is met het verwerken van andere pakketten en dat alle beschikbare threads worden gebruikt voor pakketverwerking.

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

    Als u dit ziet, bekijkt u de huidige pakketverwerkingsthreads in DistMgr.log om te zien of ze vastzitten. U kunt ook de registerwaarden Wachtrij voor pakketverwerking en Pakketten die worden verwerkt bekijken onder de volgende registersleutel om te zien hoeveel pakketten zich momenteel in de verwerkingswachtrij bevinden:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Components\SMS_DISTRIBUTION_MANAGER

    Als de waarden voor pakketten die worden verwerkt niet veranderen en gedurende een lange periode vastzitten, is het mogelijk dat DistMgr vastloopt/vastloopt. Als dit gebeurt, legt u een procesdump van SMSExec.exe vast voor beoordeling.

    Als er veel pakketten in de wachtrij staan, maar de wachtrij wordt verplaatst, kan het nodig zijn om de threadconfiguratie te controleren en te wijzigen.

  • DistMgr.log verwerkt de inkomende PKN-bestanden niet en als gevolg hiervan worden pakketten niet verwerkt. Dit resulteert in een achterstand van PKN-bestanden in het Postvak IN distMgr.

    PKN-bestanden worden verwerkt door de belangrijkste DistMgr-thread, dus in deze gevallen is het handig om de belangrijkste DistMgr-thread-id te identificeren door te zoeken naar de SMS_EXECUTIVE is gestart SMS_DISTRIBUTION_MANAGER logboekvermelding en vervolgens de DistMgr.log te filteren op de geïdentificeerde thread-id.

    In de meeste gevallen treedt dit probleem op wanneer de belangrijkste DistMgr-thread een WMI-aanroep naar een externe DP maakt, maar WMI op de DP niet reageert, waardoor DistMgr er voor onbepaalde tijd op wacht. Het filteren van de DistMgr.log op de belangrijkste DistMgr-thread kan aanwijzingen geven over de DP waarmee het probeert te communiceren. Zodra de DP is geïdentificeerd, controleert u of de DP reageert en of WMI functioneel is op de DP. Start de DP zo nodig opnieuw op om te zien of dat helpt.

    Als het gefilterde DistMgr.log geen aanwijzingen geeft, legt u een procesdump van SMSExec.exe vast terwijl deze zich in de probleemstatus bevindt.

Veelvoorkomende problemen met PkgXferMgr

  • PkgXferMgr.log geeft een fout weer tijdens het toevoegen van bestanden aan de inhoudsbibliotheek op de 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
    

    Nadat PkgXferMgr het inhoudsbestand naar de DP heeft gekopieerd, worden WMI-methoden uitgevoerd om de externe DP te instrueren het bestand toe te voegen aan de inhoudsbibliotheek. Als de externe DP het bestand niet kan toevoegen aan de inhoudsbibliotheek, ziet u een algemene WMI-fout (0x80041001 = WBEM_E_FAILED) in PkgXferMgr.log.

    Wanneer dit gebeurt, moet u SMSDPProv.log op de DP controleren om de reden te identificeren waarom het bestand niet is toegevoegd aan de inhoudsbibliotheek. Als er fouten bestand/pad niet gevonden worden weergegeven in SMSDPProv.log, moet u een tracering voor procescontrole vastleggen om de reden van de fout te bepalen.

  • PkgXferMgr.log laat zien dat er slechts één verbinding met de DP is toegestaan:

    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.
    

    of

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

    Als PkgXferMgr.log laat zien dat 'slechts één verbinding is toegestaan' voor de DP, betekent dit dat de DP is geconfigureerd voor bandbreedtebeperking. Als dit het geval is, kan PkgXferMgr slechts één thread voor de DP gebruiken en als gevolg hiervan slechts één pakket tegelijk naar de DP verzenden. Zie Bandbreedtebeheer en threads voor meer informatie.

  • PkgXferMgr.log geeft aan dat het adres is gesloten:

    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
    

    Als u dit in het logboek ziet, betekent dit dat de DP onder bandbreedtebeheer staat en dat het adres van de DP is gesloten terwijl de inhoudsoverdracht werd uitgevoerd. In het bovenstaande voorbeeld is de DP-planning geconfigureerd voor Hoge prioriteit alleen toestaan van 8:00 tot 10:00 uur. Als gevolg hiervan is PkgXferMgr om 8:00 uur gestopt met het verzenden van inhoud en het pakket/DP gemarkeerd met de status Mislukt.

  • PkgXferMgr.log toont meerdere threads die tegelijkertijd beginnen voor dezelfde taak:

    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
    

    PkgXferMgr gebruikt doorgaans één thread voor een taak, maar als er meerdere threads voor dezelfde taak worden gebruikt, kan de inhoudsoverdracht mislukken vanwege een fout 0x80070020 (ERROR_SHARING_VIOLATION). Dit gebeurt als de siteserver en de sitedatabaseservers zich in verschillende tijdzones bevinden. De oplossing hier is om ervoor te zorgen dat de siteserver en sitedatabaseservers dezelfde tijdzone hebben ingesteld.

Veelvoorkomende problemen met pull-DP

  • PkgXferMgr.log geeft aan dat de pull-DP capaciteit heeft en er geen taken meer naar de pull-DP worden verzonden:

    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 voert de volgende query uit om te controleren hoeveel taken zich momenteel in een onvoltooide status bevinden op de pull-DP. Als de query meer dan 50 taken retourneert, worden er geen taken meer naar de pull-DP verzonden.

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

    Deze taken worden uit de DistributionJobs tabel verwijderd wanneer pull-DP een bericht over de status geslaagd verzendt of wanneer de status polling stopt (op basis van geconfigureerde waarden). Als u de taken op de pull-DP wilt zien, kunt u wbemtest of WMI Explorer gebruiken om het aantal exemplaren voor SMS_PullDPNotification klasse te controleren. U kunt ook de exemplaren van ROOT\SCCMDP:SMS_PullDPState de WMI-klasse op de pull-DP controleren om pakketten te identificeren die de status Mislukt hebben en PullDP.log en DataTransferService.log controleren om de fouten te onderzoeken.

  • SignatureDownload taak op pull-DP mislukt met HTTP 404-fout.

    SignatureDownload dts-taak {JOBID} voor pakket C010000D.28, inhouds-id ContentID. JobState = NotStarted
    DTS-foutbericht ontvangen voor C010000D.28, inhoudstaak {JOBID}, 0x80070002: BITS-fout: 'HTTP-status 404: de aangevraagde URL bestaat niet op de server.

    Dit is een bekend probleem omdat de handtekeningbestanden niet aanwezig zijn op een bron-DP die is geplaatst op een siteserver. Dit probleem treedt alleen op wanneer de distributieactie niet opnieuw wordt uitgevoerd.

    Om dit probleem te omzeilen, kunt u een van de volgende methoden gebruiken:

    • Het pakket opnieuw distribueren (voor het opnieuw distribueren van het pakket hoeft u geen handtekeningen te downloaden omdat de volledige inhoud wordt gedownload).
    • Configureer de pull-DP om een bron-DP te gebruiken die niet op de siteserver is geplaatst.
  • DataTransferService.log toont 0x800706D9 bij het downloaden van inhoud van de bron-DP:

    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 betekent dat er geen eindpunten meer beschikbaar zijn vanuit de eindpunttoewijzing. Dit probleem kan optreden als gevolg van RPC-poorttoewijzingsfouten die worden veroorzaakt door de firewall. Dit kan ook gebeuren wanneer de Windows Firewall-service is uitgeschakeld.

    Controleer of er een firewall is tussen de siteserver en de betreffende server en of er RPC-poorten zijn geopend. U kunt ook een netwerktracering vastleggen (van de pull-DP en de bron-DP-server) tijdens het reproduceren van de fout voor revisie.

  • Pull-DP laat zien dat het een groot aantal taken heeft, maar dat de taken niet worden verwerkt.

    In sommige gevallen (normaal gesproken na de installatie van een nieuwe pull-DP wanneer alle inhoud naar de pull-DP wordt verzonden), kunnen te veel taakfouten op de pull-DP de verwerking van de taken vastlopen. Hoewel de meeste van deze problemen zijn opgelost in de recente releases van het product (Configuration Manager versie 1810), kunnen sommige omgevingsfactoren ertoe leiden dat pull-DP geen taken verwerkt. Als dit gebeurt, ziet u waarschijnlijk duizenden DTS-taken in ROOT\ccm\DataTransferService:CCM_DTS_JobEx WMI-klasse en ~50 (of meer) BITS-taken met de status Mislukt . In dit scenario kan het handig zijn om alle taakspecifieke items uit WMI op de pull-DP te verwijderen en de inhoud opnieuw op een gecontroleerde manier naar de pull-DP te distribueren en fouten te onderzoeken.

    Als u alle taakspecifieke items uit WMI op de Pull-DP wilt verwijderen, kunt u het onderstaande PowerShell-script gebruiken (raadpleeg de opmerkingen bij het script voor hulp):

    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 ""
    
  • Inhoud toont Geïnstalleerd op de pull-DP, maar URL en URLSubPath voor de pull-DP is niet ingevuld in ContentDPMap, wat problemen veroorzaakt met pakketten waarvoor SMB-toegang is ingeschakeld.

    Wanneer de pull-DP de inhoud heeft geïnstalleerd, wordt een statusbericht verzonden dat de gegevens bevat die nodig zijn om de URL/URLSubPath waarden in ContentDPMapbij te werken. Dit gebeurt wanneer het pull-DP-antwoord wordt verwerkt. Bekijk stap 16-22 in Een pakket distribueren om DP op te halen om de stroom te begrijpen en bekijk de relevante logboeken om te onderzoeken waarom het statusbericht niet wordt verwerkt. De meest waarschijnlijke oorzaak van dit probleem is een achterstand van statusberichten in de \MP\outboxes\StateMsg.box op het beheerpunt of MPFDM kan bestanden niet kopiëren naar de siteserver vanwege machtigingsproblemen.

Ontbrekende inhoudsbestanden in inhoudsbibliotheek

Er zijn momenten waarop inhoud ontbreekt in de inhoudsbibliotheek. Dit kan gebeuren vanwege eerdere problemen met de distributie van inhoud of door iemand/iets dat per ongeluk bestanden uit de inhoudsbibliotheek heeft verwijderd. Als u wilt controleren of de inhoud ontbreekt in de inhoudsbibliotheek, identificeert u een betrokken pakket en volgt u de inhoud van het pakket van PkgLib tot FileLib.

Zodra u hebt bevestigd dat de vereiste inhoud voor een pakket ontbreekt in de inhoudsbibliotheek, raadpleegt u Gecomprimeerde kopie van een pakket opnieuw verzenden naar een site voor informatie over het opnieuw vullen van de inhoud.

Algemene problemen

  • In het logboek DistMgr of PkgXferMgr ziet u de fout Bestand/pad niet gevonden:

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

    of

    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
    

    Veelvoorkomende foutcodes: 0x80070002, 0x80070003.

    Voor fouten met bestand/pad dat niet is gevonden, wordt het probleem waarschijnlijk veroorzaakt door het feit dat inhoudsbestanden voor het pakket ontbreken in de inhoudsbibliotheek op de siteserver. Als gevolg hiervan kan PkgXferMgr de bestanden niet naar de DP verzenden.

    In deze gevallen kunt u de inhouds-id uit het logboek identificeren en de inhoud van PkgLib naar FileLib bijhouden om ervoor te zorgen dat de bestanden bestaan. U kunt inhoudsbibliotheekverkenner ook gebruiken om te controleren of de inhoudsbestanden van het pakket beschikbaar zijn in de inhoudsbibliotheek. Het kan echter enige tijd duren voordat Inhoudsbibliotheekverkenner is geladen en het mogelijk gemakkelijker is om de inhoud handmatig bij te houden van PkgLib tot FileLib. U kunt ook een procescontroletracering vastleggen om te controleren of de benodigde bestanden ontbreken in de inhoudsbibliotheek op de siteserver.

    Als de site met ontbrekende inhoud in de inhoudsbibliotheek de pakketbronsite is, is het noodzakelijk om het pakket bij te werken om de pakketbronversie te verhogen, zodat DistMgr opnieuw een momentopname van de inhoud uit de pakketbronmap maakt en de ontbrekende inhoud opnieuw vult.

    Als de site waar de inhoud in de inhoudsbibliotheek ontbreekt, verschilt van de pakketbronsite, kunt u de pakketbronsite afdwingen om de gecomprimeerde kopie van het pakket opnieuw te verzenden naar de betreffende site. Zie Gecomprimeerde kopie van een pakket opnieuw verzenden naar een site voor meer informatie.

  • Het logboek DistMgr/PkgXferMgr toont een netwerkfout:

    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.
    

    Veelvoorkomende foutcodes: 2, 3, 53, 64.

    Voor netwerkgerelateerde fouten controleert u het logboek en identificeert u de server waarmee u probeert te communiceren wanneer de fout wordt weergegeven. Zodra deze zijn geïdentificeerd, test u het volgende:

    1. Kunt u de betrokken SERVERNAME pingen met behulp van het FQDN/NetBIOS/IP-adres?
    2. Hebt u toegang tot de share \\SERVERNAME\admin$ met behulp van het FQDN/NetBIOS/IP-adres met behulp van het SYSTEM-account van de siteserver?
    3. Hebt u toegang tot de share \\SERVERNAME\admin$ met behulp van het FQDN-/NetBIOS-/IP-adres met behulp van het account van de aangemelde gebruiker vanaf de siteserver?
    4. Is er een firewall tussen de siteserver en de betreffende server? Zijn relevante poorten (RPC/SMB) geopend?

    Als de bovenstaande tests zijn geslaagd, legt u een netwerktracering vast (van de siteserver en de betreffende server) terwijl u de fout voor beoordeling reproduceert.

  • DistMgr/PkgXferMgr-logboek toont een fout toegang geweigerd:

    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>
    

    Veelvoorkomende foutcodes: 5, 0x80070005.

    Voor fouten met betrekking tot machtigingen controleert u het logboek en identificeert u het pad dat u probeert te openen wanneer de fout wordt weergegeven. Zodra deze zijn geïdentificeerd, test u het volgende:

    1. Kunt u de betrokken SERVERNAME pingen als het pad een UNC-pad is?
    2. Heeft het computeraccount van de siteserver machtigingen voor toegang tot het pad?
    3. Hebt u toegang tot het betreffende pad met behulp van het FQDN-/NetBIOS-/IP-adres wanneer u het SYSTEM-account van de siteserver gebruikt?
    4. Hebt u toegang tot het betrokken pad met behulp van het FQDN-/NetBIOS-/IP-adres wanneer u het account van de aangemelde gebruiker vanaf de siteserver gebruikt?
    5. Is er een firewall tussen de siteserver en de betreffende server? Zijn relevante poorten (RPC/SMB) geopend?

    Als de bovenstaande tests zijn geslaagd, legt u een procesmonitortracering vast van de siteserver terwijl de fout wordt gereproduceerd voor beoordeling.

  • DistMgr/PkgXferMgr zoekt naar inhoud in de \bin\x64\FileLib map in plaats van de werkelijke locatie van de inhoudsbibliotheek.

    Dit wordt veroorzaakt door een bekend probleem in het hulpprogramma Voor overdracht van inhoudsbibliotheek.