Rozwiązywanie problemów z dystrybucją zawartości

W tym artykule omówiono sposób rozwiązywania typowych problemów z dystrybucją zawartości.

Oryginalna wersja produktu: Configuration Manager bieżąca gałąź, Microsoft System Center 2012 Configuration Manager, Microsoft System Center 2012 R2 Configuration Manager

Przykładowy problem

W tym przykładzie załóżmy, że pakiet został rozproszony do punktu dystrybucji, ale pakiet jest w stanie Niepowodzenie lub W toku dla dp.

  1. Najpierw przejrzyj DistMgr.log w lokacji (podstawowej/dodatkowej), w której znajduje się dp.

    1. Wyszukaj pozycje ~Processing package w dzienniku i zidentyfikuj wątek przetwarzania pakietu dla danego identyfikatora pakietu. Filtruj DistMgr.log identyfikatora wątku, który został zidentyfikowany. Przejrzyj krok 4 w temacie Dystrybucja pakietu do standardowego dpa , aby wyświetlić fragmenty dziennika.
    2. Przejrzyj filtrowany dziennik i sprawdź, czy dla danego dpa utworzono wątek DP. Filtruj DistMgr.log identyfikatora wątku, aby to ułatwić.
    3. Przejrzyj filtrowany dziennik i sprawdź, czy utworzono zadanie PkgXferMgr.
  2. Przejrzyj PkgXferMgr.log w lokacji (podstawowej/dodatkowej), w której znajduje się dp.

    1. Wyszukaj pozycję Znaleziono żądanie wysyłania z wpisami identyfikatora w dzienniku i zidentyfikuj wątek wysyłania dla kombinacji dp/package, którego dotyczy problem. Filtruj PkgXferMgr.log identyfikatora wątku. Przejrzyj krok 6 w temacie Dystrybucja pakietu do standardowego dp , aby wyświetlić fragmenty dziennika.
    2. Przejrzyj filtrowany dziennik, aby sprawdzić, czy zawartość została pomyślnie przeniesiona do dp lub czy wystąpił błąd.
  3. W przypadku standardowych dostawców danych program PkgXferMgr kopiuje pliki zawartości do dpa, nakazuje dostawcy DP WMI dodanie pliku do biblioteki zawartości przez wywołanie metod WMI. Przejrzyj SMSDPProv.log w dp, aby upewnić się, że zawartość została dodana do biblioteki zawartości. Przejrzyj krok 7 w temacie Dystrybucja pakietu do standardowego dpa , aby wyświetlić fragmenty dziennika.

    W przypadku ściągania adresów IP program PkgXferMgr powiadamia ściąganie dp w celu zainicjowania pobierania zawartości. Przejrzyj kroki 8–16 w temacie Dystrybucja pakietu, aby ściągnąć dp , aby zrozumieć przepływ i przejrzeć PullDP.log i DataTransferService.log , aby upewnić się, że zawartość została pobrana pomyślnie.

  4. W przypadku standardowych adresów IP program PkgXferMgr wysyła komunikat o stanie do programu DistMgr. Przejrzyj DistMgr.log , aby sprawdzić, czy komunikat o stanie został pomyślnie przetworzony. Przejrzyj krok 8 w temacie Dystrybucja pakietu do standardowego dpa , aby wyświetlić fragmenty dziennika.

    W przypadku ściągania adresów IP ściąganie dp wysyła komunikat o stanie, aby wskazać powodzenie. Przejrzyj kroki 16–22 w temacie Dystrybucja pakietu w celu pobrania dp , aby zrozumieć przepływ i przejrzeć odpowiednie dzienniki, aby upewnić się, że komunikat o stanie został pomyślnie przetworzony.

  5. Jeśli jest zaangażowanych wiele lokacji, upewnij się, że replikacja bazy danych działa, a linki bazy danych między odpowiednimi lokacjami są aktywne.

Typowe problemy z programem DistMgr

  • DistMgr.log pokazuje następujący wpis dla danego identyfikatora pakietu:

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

    Zwykle dzieje się to tymczasowo, gdy zawartość jest przesyłana z jednej witryny do innej. Przejrzyj dzienniki nadawcy/despoolera, aby upewnić się, że nie ma problemów z komunikacją w witrynie. Jeśli podczas komunikacji między lokacjami występują błędy (Scheduler ->Sender ->Despooler), skoncentruj się na rozwiązywaniu tych błędów przed rozwiązaniem powyższego komunikatu w DistMgr.log. Przejrzyj artykuł Dystrybucja pakietu do dp między lokacjami, aby zrozumieć przepływ dziennika.

    Jeśli nie ma żadnych błędów, może być konieczne wymusowanie, aby lokacja nadrzędna ponownie wyświęciła pakiet do witryny, której dotyczy problem. Aby uzyskać więcej informacji, zobacz Ponowne dodawanie skompresowanej kopii pakietu do lokacji .

  • DistMgr.log może pokazać, że jest zajęty przetwarzaniem innych pakietów i używa wszystkich dostępnych wątków do przetwarzania pakietów.

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

    Jeśli to widzisz, przejrzyj bieżące wątki przetwarzania pakietów w DistMgr.log , aby sprawdzić, czy są zablokowane. Możesz również przejrzeć wartości rejestru Kolejka przetwarzania pakietów i Pakiety przetwarzane w ramach następującego klucza rejestru, aby zobaczyć, ile pakietów znajduje się obecnie w kolejce przetwarzania:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Components\SMS_DISTRIBUTION_MANAGER

    Jeśli wartości przetwarzane pakietów nie ulegają zmianie i są zablokowane przez długi okres czasu, możliwe, że program DistMgr jest zawieszony/zablokowany. W takim przypadku przechwyć zrzut procesu SMSExec.exe do przeglądu.

    Jeśli w kolejce znajduje się wiele pakietów, ale kolejka jest przenoszona, może być konieczne przejrzenie i zmiana konfiguracji wątku.

  • DistMgr.log nie przetwarza przychodzących plików PKN i w rezultacie pakiety nie są przetwarzane. Powoduje to powstanie listy prac plików PKN w skrzynce odbiorczej programu DistMgr.

    Pliki PKN są przetwarzane przez główny wątek DistMgr, więc w takich przypadkach warto zidentyfikować główny identyfikator wątku DistMgr, szukając SMS_EXECUTIVE uruchomionego SMS_DISTRIBUTION_MANAGER wpisu dziennika, a następnie przefiltruj DistMgr.log identyfikatora wątku.

    W większości przypadków ten problem występuje, gdy główny wątek DistMgr wykonuje wywołanie usługi WMI do zdalnego dpa, ale usługa WMI w dp nie odpowiada, co powoduje, że program DistMgr czeka na nie przez czas nieokreślony. Filtrowanie DistMgr.log dla głównego wątku programu DistMgr może dostarczyć wskazówek dotyczących dp, z którą próbuje się komunikować. Po zidentyfikowaniu sprawdź, czy dp odpowiada, a usługa WMI działa w dp. W razie potrzeby uruchom ponownie dp, aby sprawdzić, czy to pomaga.

    Jeśli filtrowana DistMgr.log nie zawiera żadnych wskazówek, przechwyć zrzut procesu SMSExec.exe w stanie problemu do przeglądu.

Typowe problemy z narzędziem PkgXferMgr

  • PkgXferMgr.log wyświetla błąd podczas dodawania plików do biblioteki zawartości w 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
    

    Gdy program PkgXferMgr skopiuje plik zawartości do dp, wykonuje metody WMI, aby polecić zdalnemu dpowi dodanie pliku do biblioteki zawartości. Jeśli zdalna dp nie może dodać pliku do biblioteki zawartości, zostanie wyświetlony ogólny błąd WMI (0x80041001 = WBEM_E_FAILED) w PkgXferMgr.log.

    W takim przypadku należy przejrzeć SMSDPProv.log w dp, aby zidentyfikować przyczynę, dla którego dp nie może dodać pliku do biblioteki zawartości. Jeśli w SMSDPProv.lognie znaleziono błędów pliku/ścieżki, należy przechwycić ślad monitora procesów, aby ustalić przyczynę błędu.

  • PkgXferMgr.log pokazuje, że tylko jedno połączenie jest dozwolone z 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.
    

    lub

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

    Jeśli PkgXferMgr.log pokazuje, że "tylko jedno połączenie jest dozwolone" z dp, oznacza to, że dp jest skonfigurowany do ograniczania przepustowości. W takim przypadku program PkgXferMgr może używać tylko jednego wątku dla dp, a w rezultacie wysyłać tylko jeden pakiet do dpa naraz. Aby uzyskać więcej informacji, zobacz Kontrola przepustowości i wątki .

  • PkgXferMgr.log pokazuje, że adres jest zamknięty:

    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
    

    Jeśli widzisz to w dzienniku, oznacza to, że dp jest pod kontrolą przepustowości i adres do DP zamknięty podczas transferu zawartości był w toku. W powyższym przykładzie harmonogram DP został skonfigurowany dla opcji Zezwalaj na wysoki priorytet tylko w godzinach od 8:00 do 10:00. W rezultacie program PkgXferMgr przestał wysyłać zawartość o godzinie 8:00 i oznaczył pakiet/DP w stanie niepowodzenia.

  • PkgXferMgr.log pokazuje wiele wątków rozpoczynających się w tym samym czasie dla tego samego zadania:

    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
    

    Zazwyczaj program PkgXferMgr używa jednego wątku do zadania, ale jeśli używa wielu wątków dla tego samego zadania, transfer zawartości może rozpocząć się niepowodzeniem z powodu błędu 0x80070020 (ERROR_SHARING_VIOLATION). Dzieje się tak, jeśli serwer lokacji i serwery bazy danych lokacji znajdują się w różnych strefach czasowych. Rozwiązaniem jest zapewnienie, że serwer lokacji i serwery bazy danych lokacji mają ten sam zestaw stref czasowych.

Typowe problemy z ściąganiem dp

  • PkgXferMgr.log pokazuje, że ściąganie dp jest w pojemności i nie więcej zadań są wysyłane do dp ściągania:

    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
    

    Narzędzie PkgXferMgr uruchamia następujące zapytanie, aby sprawdzić, ile zadań jest obecnie w stanie niedokończonym w ściąganiu DP. Jeśli zapytanie zwróci więcej niż 50 zadań, nie wyśle więcej zadań do ściągania 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, '') <> '')
    

    Te zadania są usuwane z DistributionJobs tabeli, gdy ściąganie dp wysyła komunikat o stanie powodzenie lub gdy sondowanie stanu zostanie zatrzymane (na podstawie skonfigurowanych wartości). Aby wyświetlić zadania w ściąganiu DP, możesz użyć narzędzia wbemtest lub Eksploratora WMI , aby przejrzeć liczbę wystąpień dla SMS_PullDPNotification klasy. Możesz również przejrzeć wystąpienia ROOT\SCCMDP:SMS_PullDPState klasy WMI w ściąganiu DP, aby zidentyfikować pakiety w stanie Niepowodzenie i przejrzeć PullDP.log , a także DataTransferService.log w celu zbadania błędów.

  • SignatureDownload zadanie przy ściągania DP kończy się niepowodzeniem z powodu błędu HTTP 404.

    Utworzono zadanie DTS SignatureDownload {JOBID} dla pakietu C010000D.28 o identyfikatorze zawartości ContentID. JobState = NotStarted
    Odebrano komunikat o błędzie usługi DTS dla C010000D.28, zadanie zawartości {JOBID}, 0x80070002: błąd BITS: "Stan HTTP 404: Żądany adres URL nie istnieje na serwerze.

    Jest to znany problem, ponieważ pliki sygnatur nie są obecne w źródłowym dp, który jest kolokowany na serwerze lokacji. Ten problem występuje tylko wtedy, gdy akcja dystrybucji nie jest redist.

    Aby obejść ten problem, użyj jednej z następujących metod:

    • Redystrybucja pakietu (redystrybucja pakietu nie wymaga pobierania podpisów, ponieważ pobierana jest pełna zawartość).
    • Skonfiguruj ściąganie DP, aby używać źródłowego dpa, który nie jest kolokowany na serwerze lokacji.
  • DataTransferService.log pokazuje 0x800706D9 podczas próby pobrania zawartości ze źródłowego dpa:

    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 oznacza, że nie ma więcej punktów końcowych dostępnych z mapownika punktu końcowego. Ten problem może wystąpić z powodu błędów alokacji portów RPC spowodowanych przez zaporę. Może również wystąpić, gdy usługa Zapory systemu Windows jest wyłączona.

    Sprawdź, czy istnieje zapora między serwerem lokacji a serwerem, którego dotyczy problem, i sprawdź, czy porty RPC są otwarte. Możesz również przechwycić ślad sieci (z ściągającego dpa, a także źródłowego serwera DP) podczas odtwarzania błędu do przeglądu.

  • Ściąganie dp pokazuje, że ma dużą liczbę zadań, ale zadania nie są przetwarzane.

    W niektórych przypadkach (zwykle po zainstalowaniu nowego ściągania DP, gdy cała zawartość jest wysyłana do ściągania DP), zbyt wiele błędów zadań w ściąganiu DP może zakończyć się wstrzymanym przetwarzaniem zadań. Chociaż większość z tych problemów została rozwiązana w ostatnich wersjach produktu (Configuration Manager wersji 1810), niektóre czynniki środowiskowe mogą spowodować, że zadania przetwarzania ściągania DP nie będą przetwarzane. W takim przypadku prawdopodobnie zobaczysz tysiące zadań DTS w ROOT\ccm\DataTransferService:CCM_DTS_JobEx klasie WMI i około 50 (lub więcej) zadań BITS w stanie Niepowodzenie . W tym scenariuszu korzystne może być usunięcie wszystkich elementów specyficznych dla zadania z usługi WMI w usłudze DP ściągania i ponowne dystrybuowanie zawartości do ściągania DP w kontrolowany sposób i badanie niepowodzeń.

    Aby usunąć wszystkie elementy specyficzne dla zadania z usługi WMI w usłudze Pull DP, możesz użyć poniższego skryptu programu PowerShell (przejrzyj komentarze skryptu, aby uzyskać pomoc):

    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 ""
    
  • Zawartość pokazuje zainstalowane w ściąganiu DP, ale adres URL i adres URLSubPath dla ściągania DP nie są wypełniane w ContentDPMapprogramie , co powoduje problemy z pakietami z włączonym dostępem SMB.

    Po pomyślnym zainstalowaniu zawartości ściągania dp wysyła komunikat o stanie zawierający dane niezbędne do zaktualizowania URL/URLSubPath wartości w ContentDPMapprogramie . Dzieje się tak, gdy jest przetwarzana odpowiedź dp ściągnięcia. Przejrzyj kroki 16–22 w temacie Dystrybucja pakietu w celu pobrania dp , aby zrozumieć przepływ i przejrzeć odpowiednie dzienniki, aby zbadać, dlaczego komunikat o stanie nie jest przetwarzany. Najprawdopodobniej przyczyną tego problemu jest zaległości komunikatów o stanie w \MP\outboxes\StateMsg.box punkcie zarządzania lub nie można skopiować plików na serwer lokacji przez program MPFDM z powodu problemów z uprawnieniami.

Brakujące pliki zawartości w bibliotece zawartości

Czasami można zauważyć brak zawartości w bibliotece zawartości. Może się to zdarzyć z powodu wcześniejszych problemów z dystrybucją zawartości lub przypadkowego usunięcia plików z biblioteki zawartości przez kogoś/kogoś. Aby potwierdzić, że brakuje zawartości w bibliotece zawartości, zidentyfikuj pakiet, którego dotyczy problem, i śledź zawartość pakietu z PkgLib do FileLib.

Po potwierdzeniu, że w bibliotece zawartości brakuje wymaganej zawartości pakietu, zobacz Ponowne publikowanie skompresowanej kopii pakietu do witryny, aby uzyskać informacje na temat sposobu ponownego wypełniania zawartości.

Problemy ogólne

  • Dziennik DistMgr lub PkgXferMgr pokazuje błąd nie znaleziono pliku/ścieżki:

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

    lub

    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
    

    Typowe kody błędów: 0x80070002, 0x80070003.

    W przypadku błędów nie znaleziono pliku/ścieżki problem jest prawdopodobnie spowodowany tym, że w bibliotece zawartości na serwerze lokacji brakuje plików zawartości pakietu. W związku z tym PkgXferMgr nie może wysłać plików do dp.

    W takich przypadkach można zidentyfikować identyfikator zawartości z dziennika i śledzić zawartość z PkgLib , aby FileLib upewnić się, że pliki istnieją. Możesz również użyć Eksploratora biblioteki zawartości, aby sprawdzić, czy pliki zawartości pakietu są dostępne w bibliotece zawartości, jednak ładowanie Eksploratora biblioteki zawartości może zająć trochę czasu i może być łatwiej ręcznie śledzić zawartość z PkgLib .FileLib Alternatywnie możesz przechwycić ślad monitora procesów , aby sprawdzić, czy w bibliotece zawartości na serwerze lokacji brakuje niezbędnych plików.

    Jeśli witryna, w której brakuje zawartości w bibliotece zawartości, jest witryną źródłową pakietu, konieczne jest zaktualizowanie pakietu w celu przyrostu wersji źródła pakietu , tak aby program DistMgr ponownie zrobił migawkę zawartości z katalogu źródłowego pakietu i ponownie uzupełnił brakującą zawartość.

    Jeśli witryna, w której brakuje zawartości w bibliotece zawartości, różni się od lokacji źródłowej pakietu, możesz wymusić ponowne zapisanie skompresowanej kopii pakietu w witrynie, której dotyczy problem. Aby uzyskać więcej informacji, zobacz Ponowne dodawanie skompresowanej kopii pakietu do lokacji .

  • Dziennik DistMgr/PkgXferMgr pokazuje błąd sieci:

    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.
    

    Typowe kody błędów: 2, 3, 53, 64.

    W przypadku błędów związanych z siecią przejrzyj dziennik i zidentyfikuj serwer, z którym próbujesz się komunikować po wystąpieniu błędu. Po zidentyfikowaniu przetestuj następujące elementy:

    1. Czy można wysłać polecenie ping do nazwy SERWERA, którego dotyczy problem, przy użyciu adresu FQDN/NetBIOS/IP?
    2. Czy można uzyskać dostęp do udziału \\SERVERNAME\admin$ przy użyciu adresu FQDN/NetBIOS/IP przy użyciu konta SYSTEM z serwera lokacji?
    3. Czy można uzyskać dostęp do udziału \\SERVERNAME\admin$ przy użyciu adresu FQDN/NetBIOS/IP przy użyciu konta zalogowanego użytkownika z serwera lokacji?
    4. Czy między serwerem lokacji a serwerem, którego dotyczy problem, istnieje zapora? Czy odpowiednie porty (RPC/SMB) są otwarte?

    Jeśli powyższe testy zakończą się pomyślnie, przechwyć ślad sieci (z serwera lokacji, a także serwera, którego dotyczy problem), podczas odtwarzania błędu do przeglądu.

  • Dziennik DistMgr/PkgXferMgr pokazuje błąd odmowy dostępu:

    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>
    

    Typowe kody błędów: 5, 0x80070005.

    W przypadku błędów związanych z uprawnieniami przejrzyj dziennik i zidentyfikuj ścieżkę, do której próbujesz uzyskać dostęp po wystąpieniu błędu. Po zidentyfikowaniu przetestuj następujące elementy:

    1. Czy można wysłać polecenie ping do pliku SERVERNAME, którego dotyczy problem, jeśli ścieżka jest ścieżką UNC?
    2. Czy konto komputera serwera lokacji ma uprawnienia dostępu do ścieżki?
    3. Czy można uzyskać dostęp do ścieżki, których dotyczy problem, przy użyciu adresu FQDN/NetBIOS/IP podczas korzystania z konta SYSTEMU z serwera lokacji?
    4. Czy podczas korzystania z konta zalogowanego użytkownika z serwera lokacji można uzyskać dostęp do ścieżki, na którą ma to wpływ, przy użyciu adresu FQDN/NetBIOS/IP?
    5. Czy między serwerem lokacji a serwerem, którego dotyczy problem, istnieje zapora? Czy odpowiednie porty (RPC/SMB) są otwarte?

    Jeśli powyższe testy zakończą się pomyślnie, przechwyć ślad monitora procesów z serwera lokacji podczas odtwarzania błędu do przeglądu.

  • Program DistMgr/PkgXferMgr poszukaj zawartości w \bin\x64\FileLib katalogu zamiast rzeczywistej lokalizacji biblioteki zawartości.

    Jest to spowodowane znanym problemem w narzędziu do transferu biblioteki zawartości.