Share via


Felsöka innehållsdistribution

Den här artikeln beskriver hur du felsöker vanliga problem med innehållsdistribution.

Ursprunglig produktversion: Configuration Manager aktuell gren, Microsoft System Center 2012 Configuration Manager, Microsoft System Center 2012 R2 Configuration Manager

Exempelproblem

I det här exemplet ska vi anta att du har distribuerat ett paket till en distributionsplats, men att paketet är i antingen tillståndet Misslyckades eller Pågår för DP.

  1. Granska först DistMgr.log på den plats (primär/sekundär) där DP finns.

    1. Leta efter ~Processing package-poster i loggen och identifiera paketbearbetningstråden för det aktuella paket-ID:t. Filtrera DistMgr.log för det tråd-ID som du identifierade. Granska steg 4 i Distribuera ett paket till standard-DP för att se loggutdrag.
    2. Granska den filtrerade loggen och kontrollera om en DP-tråd har skapats för dp i fråga. Filtrera DistMgr.log för tråd-ID för att göra det enklare.
    3. Granska den filtrerade loggen och kontrollera om ett PkgXferMgr-jobb har skapats.
  2. Granska PkgXferMgr.log på den plats (primär/sekundär) där DP finns.

    1. Leta efter Hittad skicka begäran med ID-poster i loggen och identifiera den sändande tråden för den berörda DP/package-kombinationen. Filtrera PkgXferMgr.log för det identifierade tråd-ID:t. Granska steg 6 i Distribuera ett paket till standard-DP för att se loggutdrag.
    2. Granska den filtrerade loggen för att se om innehållet har överförts till DP eller om det uppstod ett fel.
  3. För Standard-DPs kopierar PkgXferMgr innehållsfilerna till DP. Den instruerar DP WMI-providern att lägga till filen i innehållsbiblioteket genom att anropa WMI-metoder. Granska SMSDPProv.log på DP för att se till att innehållet har lagts till i innehållsbiblioteket. Granska steg 7 i Distribuera ett paket till standard-DP för att se loggutdrag.

    För pull-DPs meddelar PkgXferMgr pull DP för att initiera nedladdningen av innehållet. Granska steg 8–16 i Distribuera ett paket för att hämta DP för att förstå flödet och granska PullDP.log och DataTransferService.log för att säkerställa att innehållet har laddats ned.

  4. För standard-DPs skickar PkgXferMgr ett statusmeddelande till DistMgr. Granska DistMgr.log för att kontrollera om statusmeddelandet har bearbetats. Granska steg 8 i Distribuera ett paket till standard-DP för att se loggutdrag.

    För pull-DP:er skickar pull-DP ett tillståndsmeddelande för att indikera att det lyckades. Granska steg 16–22 i Distribuera ett paket för att hämta DP för att förstå flödet och granska relevanta loggar för att säkerställa att tillståndsmeddelandet bearbetas korrekt.

  5. Om flera platser är inblandade kontrollerar du att databasreplikeringen fungerar och att databaslänkarna mellan relevanta platser är aktiva.

Vanliga Problem med DistMgr

  • DistMgr.log visar följande post för det aktuella paket-ID:t:

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

    Detta sker vanligtvis tillfälligt när innehållet överförs från en plats till en annan. Granska loggarna för avsändare/despooler för att se till att det inte finns några problem med webbplatskommunikation. Om du ser fel under plats-till-plats-kommunikation (Scheduler ->Sender ->Despooler) fokuserar du på att lösa dessa fel innan du felsöker meddelandet ovan i DistMgr.log. Läs Distribuera ett paket till DP på flera platser för att förstå loggflödet.

    Om det inte finns några fel kan det vara nödvändigt att tvinga den överordnade platsen att skicka om paketet till den berörda platsen. Mer information finns i Skicka om komprimerad kopia av ett paket till en plats .

  • DistMgr.log kan visa att det är upptaget med bearbetning av andra paket och använder alla tillgängliga trådar för paketbearbetning.

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

    Om du ser detta granskar du de aktuella paketbearbetningstrådarna i DistMgr.log för att se om de har fastnat. Du kan också granska registervärdena För paketbearbetningskö och Paket som bearbetas under följande registernyckel för att se hur många paket som för närvarande finns i bearbetningskö:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Components\SMS_DISTRIBUTION_MANAGER

    Om värdena för Paket som bearbetas inte ändras och har fastnat under en lång tidsperiod är det möjligt att DistMgr är låst/fastnat. Om detta inträffar samlar du in en processdump med SMSExec.exe för granskning.

    Om det finns många paket i kön men kön flyttas kan det vara nödvändigt att granska och ändra trådkonfigurationen.

  • DistMgr.log bearbetar inte inkommande PKN-filer och därför bearbetas inte paketen. Detta resulterar i kvarvarande PKN-filer i inkorgen DistMgr.

    PKN-filer bearbetas av den huvudsakliga DistMgr-tråden, så i dessa fall är det bra att identifiera huvudtråds-ID:t för DistMgr genom att leta efter SMS_EXECUTIVE startade SMS_DISTRIBUTION_MANAGER loggpost och sedan filtrera DistMgr.log för tråd-ID som identifierats.

    I de flesta fall uppstår det här problemet när den huvudsakliga DistMgr-tråden gör ett WMI-anrop till en fjärr-DP men WMI på DP inte svarar, vilket gör att DistMgr väntar på det på obestämd tid. Att filtrera DistMgr.log för den huvudsakliga DistMgr-tråden kan ge ledtrådar om den DP som den försöker kommunicera med. När du har identifierat det kontrollerar du om DP svarar och WMI fungerar på DP. Starta om DP om det behövs för att se om det hjälper.

    Om den filtrerade DistMgr.log inte ger några ledtrådar samlar du in en processdump med SMSExec.exe i problemtillstånd för granskning.

Vanliga problem med PkgXferMgr

  • PkgXferMgr.log visar ett fel när du lägger till filer i innehållsbiblioteket på 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
    

    När PkgXferMgr har kopierat innehållsfilen till DP kör den WMI-metoder för att instruera fjärr-DP att lägga till filen i innehållsbiblioteket. Om fjärr-DP inte kan lägga till filen i innehållsbiblioteket visas ett allmänt WMI-fel (0x80041001 = WBEM_E_FAILED) i PkgXferMgr.log.

    När detta inträffar är det nödvändigt att granska SMSDPProv.log på DP för att identifiera orsaken till att DP inte kunde lägga till filen i innehållsbiblioteket. Om du ser fil -/sökvägsfel i SMSDPProv.log måste du samla in en Process Monitor-spårning för att fastställa orsaken till felet.

  • PkgXferMgr.log visar att endast en anslutning tillåts till 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.
    

    eller

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

    Om PkgXferMgr.log visar att "endast en anslutning tillåts" till DP innebär det att DP har konfigurerats för bandbreddsbegränsning. I så fall kan PkgXferMgr bara använda en tråd för DP och därför bara skicka ett paket till DP i taget. Mer information finns i Bandbreddskontroll och trådar .

  • PkgXferMgr.log visar att adressen är stängd:

    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
    

    Om du ser detta i loggen innebär det att DP är under bandbreddskontroll och att adressen till DP stängdes medan innehållsöverföringen pågick. I exemplet ovan konfigurerades DP-schemat för Tillåt endast hög prioritet under 08:00 till 10:00. Därför slutade PkgXferMgr att skicka innehåll kl. 08:00 och markerade paketet/DP i ett feltillstånd.

  • PkgXferMgr.log visar flera trådar som startar samtidigt för samma jobb:

    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
    

    Vanligtvis använder PkgXferMgr en tråd för ett jobb, men om det använder flera trådar för samma jobb kan innehållsöverföringen börja misslyckas på grund av fel 0x80070020 (ERROR_SHARING_VIOLATION). Detta inträffar om platsservern och platsdatabasservrarna finns i olika tidszoner. Lösningen här är att se till att platsservern och platsdatabasservrarna har samma tidszonsuppsättning.

Vanliga problem med pull-DP

  • PkgXferMgr.log visar att Pull DP har kapacitet och att inga fler jobb skickas till pull-DP:

    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 kör följande fråga för att kontrollera hur många jobb som för närvarande är i ett oavslutat tillstånd på pull DP. Om frågan returnerar fler än 50 jobb skickas inga fler jobb till pull-DP.

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

    De här jobben DistributionJobs tas bort från tabellen när pull-DP skickar ett meddelande om statusstatus eller när statussökningen stoppas (baserat på konfigurerade värden). Om du vill se jobben i pull-DP:n kan du använda wbemtest eller WMI Explorer för att granska instansantalet för SMS_PullDPNotification klassen. Du kan också granska instanserna av ROOT\SCCMDP:SMS_PullDPState WMI-klassen på pull DP för att identifiera paket som är i ett feltillstånd och granska PullDP.log samt DataTransferService.log för att undersöka felen.

  • SignatureDownload jobbet på pull DP misslyckas med HTTP 404-fel.

    Skapade SignatureDownload DTS-jobbet {JOBID} för paket C010000D.28, innehålls-ID ContentID. JobState = NotStarted
    DTS-felmeddelande för C010000D.28, innehållsjobb {JOBID}, 0x80070002: BITS-fel: HTTP-status 404: Den begärda URL:en finns inte på servern.

    Det här är ett känt problem eftersom signaturfilerna inte finns på en käll-DP som samplaceras på en platsserver. Det här problemet uppstår bara när distributionsåtgärden inte är redist.

    Använd någon av följande metoder för att lösa problemet:

    • Distribuera om paketet (omdistribuering av paketet kräver inte nedladdning av signaturer eftersom fullständigt innehåll laddas ned).
    • Konfigurera pull DP för att använda en käll-DP som inte är samplaceerad på platsservern.
  • DataTransferService.log visar 0x800706D9 när du försöker ladda ned innehåll från källans 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 innebär att det inte finns några fler slutpunkter tillgängliga från slutpunktsmapparen. Det här problemet kan inträffa på grund av RPC-portallokeringsfel som orsakas av brandväggen. Det kan också inträffa när Windows-brandväggstjänsten är inaktiverad.

    Kontrollera om det finns en brandvägg mellan platsservern och den berörda servern och ta reda på om RPC-portarna är öppna. Du kan också avbilda en nätverksspårning (från pull-DP och dp-källservern) samtidigt som du återskapar felet för granskning.

  • Pull DP visar att det har ett stort antal jobb, men att jobben inte bearbetas.

    I vissa fall (normalt efter installationen av en ny pull-DP när allt innehåll skickas till pull DP) kan för många jobbfel på pull-DP stoppa bearbetningen av jobben. Även om de flesta av dessa problem åtgärdas i de senaste versionerna av produkten (Configuration Manager version 1810), kan vissa miljöfaktorer resultera i att PULL DP inte bearbetar jobb. När detta inträffar skulle du förmodligen se tusentals DTS-jobb i ROOT\ccm\DataTransferService:CCM_DTS_JobEx WMI-klassen och ~50 (eller fler) BITS-jobb i feltillstånd . I det här scenariot kan det vara bra att ta bort alla jobbspecifika objekt från WMI på pull-DP och distribuera innehållet igen till pull-DP på ett kontrollerat sätt och undersöka fel.

    Om du vill ta bort alla jobbspecifika objekt från WMI i Pull DP kan du använda PowerShell-skriptet nedan (granska skriptkommentarna för hjälp):

    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 ""
    
  • Innehållet visar Installerat på pull-DP men URL och URLSubPath för pull-DP fylls inte i i ContentDPMap, vilket orsakar problem med att paket har SMB-åtkomst aktiverat.

    När pull-DP har innehållet installerat skickar det ett tillståndsmeddelande som innehåller de data som krävs för att uppdatera URL/URLSubPath värdena i ContentDPMap. Detta inträffar när pull DP-svaret bearbetas. Granska steg 16–22 i Distribuera ett paket för att hämta DP för att förstå flödet och granska relevanta loggar för att undersöka varför tillståndsmeddelandet inte bearbetas. Den troligaste orsaken till det här problemet är antingen kvarvarande tillståndsmeddelanden på \MP\outboxes\StateMsg.box hanteringsplatsen eller att MPFDM inte kan kopiera filer till platsservern på grund av behörighetsproblem.

Innehållsfiler saknas i innehållsbiblioteket

Det finns tillfällen då du märker att innehåll saknas i innehållsbiblioteket. Detta kan inträffa på grund av tidigare problem med innehållsdistribution eller på att någon/något oavsiktligt tar bort filer från innehållsbiblioteket. Bekräfta att innehållet saknas i innehållsbiblioteket genom att identifiera ett berört paket och spåra paketinnehållet från PkgLib till FileLib.

När du har bekräftat att det nödvändiga innehållet för ett paket saknas i innehållsbiblioteket kan du läsa Skicka om komprimerad kopia av ett paket till en webbplats för information om hur du fyller i innehållet igen.

Allmänna problem

  • DistMgr- eller PkgXferMgr-loggen visar ett fel om att en fil/sökväg inte hittades:

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

    eller

    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
    

    Vanliga felkoder: 0x80070002, 0x80070003.

    För fel som inte hittades i filen/sökvägen beror problemet troligen på att innehållsbiblioteket på platsservern saknar innehållsfiler för paketet. Därför kan PkgXferMgr inte skicka filerna till DP.

    I dessa fall kan du identifiera innehålls-ID:t från loggen och spåra innehållet från PkgLib för att FileLib säkerställa att filerna finns. Du kan också använda Innehållsbiblioteksutforskaren för att kontrollera om paketinnehållsfilerna är tillgängliga i innehållsbiblioteket, men innehållsbiblioteksutforskaren kan ta lite tid att läsa in och det kan vara enklare att manuellt spåra innehållet från PkgLib till FileLib. Du kan också samla in en processövervakarspårning för att kontrollera om de nödvändiga filerna saknas i innehållsbiblioteket på platsservern.

    Om webbplatsen som saknar innehåll i innehållsbiblioteket är paketkällans webbplats, är det nödvändigt att uppdatera paketet för att öka paketkällans version så att DistMgr tar en ögonblicksbild av innehållet från paketkällans katalog igen och fyller i det saknade innehållet igen.

    Om webbplatsen som saknar innehållet i innehållsbiblioteket skiljer sig från paketkällans webbplats kan du tvinga paketkällan att skicka om den komprimerade kopian av paketet till den berörda webbplatsen. Mer information finns i Skicka om komprimerad kopia av ett paket till en plats .

  • DistMgr/PkgXferMgr-loggen visar ett nätverksfel:

    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.
    

    Vanliga felkoder: 2, 3, 53, 64.

    För nätverksrelaterade fel granskar du loggen och identifierar den server som du försöker kommunicera med när du får felet. När du har identifierat det testar du följande:

    1. Kan du pinga det berörda SERVERNAME med hjälp av FQDN/NetBIOS/IP-adressen?
    2. Kan du komma åt resursen \\SERVERNAME\admin$ med hjälp av FQDN/NetBIOS/IP-adressen med systemkontot från platsservern?
    3. Kan du komma åt resursen \\SERVERNAME\admin$ med hjälp av FQDN/NetBIOS/IP-adressen med hjälp av den inloggade användarens konto från platsservern?
    4. Finns det en brandvägg mellan platsservern och den berörda servern? Är relevanta portar (RPC/SMB) öppna?

    Om ovanstående tester lyckas samlar du in en nätverksspårning (från platsservern och den berörda servern) samtidigt som du återskapar felet för granskning.

  • DistMgr/PkgXferMgr-loggen visar ett fel om nekad åtkomst:

    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>
    

    Vanliga felkoder: 5, 0x80070005.

    Om du har behörighetsrelaterade fel granskar du loggen och identifierar den sökväg som du försöker komma åt när du får felet. När du har identifierat det testar du följande:

    1. Kan du pinga det berörda SERVERNAME om sökvägen är en UNC-sökväg?
    2. Har platsserverns datorkonto behörighet att komma åt sökvägen?
    3. Kan du komma åt den berörda sökvägen med hjälp av FQDN/NetBIOS/IP-adressen när du använder SYSTEM-kontot från platsservern?
    4. Kan du komma åt den berörda sökvägen med hjälp av FQDN/NetBIOS/IP-adressen när du använder den inloggade användarens konto från platsservern?
    5. Finns det en brandvägg mellan platsservern och den berörda servern? Är relevanta portar (RPC/SMB) öppna?

    Om ovanstående tester lyckas samlar du in en processövervakarspårning från platsservern medan du återskapar felet för granskning.

  • DistMgr/PkgXferMgr söker efter innehåll i katalogen i \bin\x64\FileLib stället för den faktiska platsen för innehållsbiblioteket.

    Detta beror på ett känt problem i verktyget Överföring av innehållsbibliotek.