Устранение неполадок с распространением содержимого

В этой статье описывается устранение распространенных проблем с распространением содержимого.

Исходная версия продукта: Configuration Manager current branch, Microsoft System Center 2012 Configuration Manager, Microsoft System Center 2012 R2 Configuration Manager

Пример проблемы

В этом примере предположим, что вы распространили пакет в точку распространения, но пакет находится в состоянии Failed или In Progress (Выполняется ) для DP.

  1. Сначала просмотрите DistMgr.log на сайте (первичном или вторичном), где находится DP.

    1. Найдите ~Обработка записей пакета в журнале и определите поток обработки пакета для соответствующего идентификатора пакета. Фильтрация DistMgr.log для идентификатора потока, который вы определили. Просмотрите шаг 4 в разделе Распространение пакета в стандартный DP , чтобы просмотреть фрагменты журнала.
    2. Просмотрите отфильтрованный журнал и проверка, был ли создан поток DP для соответствующего DP. Фильтрация DistMgr.log для идентификатора потока, чтобы упростить эту задачу.
    3. Проверьте отфильтрованный журнал и проверка, было ли создано задание PkgXferMgr.
  2. Просмотрите PkgXferMgr.log на сайте (первичном или вторичном), где находится dp.

    1. Найдите запрос на отправку Найден с записями идентификаторов в журнале и определите поток отправки для затронутого сочетания DP/пакета. Фильтрация PkgXferMgr.log для идентифицированного идентификатора потока. Просмотрите шаг 6 в разделе Распространение пакета в стандартный DP , чтобы просмотреть фрагменты журнала.
    2. Просмотрите отфильтрованный журнал, чтобы узнать, было ли содержимое успешно передано в DP или произошла ошибка.
  3. Для стандартных DPS PkgXferMgr копирует файлы содержимого в DP, а поставщик WMI DP добавляет файл в библиотеку содержимого, вызывая методы WMI. Просмотрите SMSDPProv.log в DP, чтобы убедиться, что содержимое было добавлено в библиотеку содержимого. Просмотрите шаг 7 в разделе Распространение пакета в стандартный DP , чтобы просмотреть фрагменты журнала.

    PkgXferMgr уведомляет оповещать оповещенную загрузку содержимого. Ознакомьтесь с шагами 8–16 в разделе Распространение пакета для извлечения DP , чтобы понять поток и проверить PullDP.log и DataTransferService.log , чтобы убедиться, что содержимое было успешно загружено.

  4. Для стандартных DPS PkgXferMgr отправляет сообщение о состоянии в DistMgr. Проверьте DistMgr.log , чтобы проверить, успешно ли обработано сообщение о состоянии. Просмотрите шаг 8 в разделе Распространение пакета в стандартный DP , чтобы просмотреть фрагменты журнала.

    Для опрашиваемого DPS опрашиваемый DP отправляет сообщение о состоянии, указывающее на успешное выполнение. Ознакомьтесь с шагами 16-22 в разделе Распространение пакета для извлечения DP , чтобы понять поток и просмотреть соответствующие журналы, чтобы убедиться, что сообщение о состоянии успешно обработано.

  5. Если задействовано несколько сайтов, убедитесь, что репликация базы данных работает, а каналы базы данных между соответствующими сайтами активны.

Распространенные проблемы с DistMgr

  • DistMgr.log отображает следующую запись для соответствующего идентификатора пакета:

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

    Обычно это происходит временно во время передачи содержимого с одного сайта на другой. Просмотрите журналы sender/Despooler, чтобы убедиться в отсутствии проблем с обменом данными на сайте. Если во время обмена данными между сайтом (Планировщик ->Отправитель ->Despooler) возникают ошибки, сосредоточьтесь на устранении этих ошибок перед устранением приведенного выше сообщения в DistMgr.log. Ознакомьтесь с разделом Распространение пакета в DP между сайтами , чтобы понять поток журнала.

    Если ошибок нет, может потребоваться заставить родительский сайт повторно отправить пакет на затронутый сайт. Дополнительные сведения см. в статье Повторная отправка сжатой копии пакета на сайт .

  • DistMgr.log может показать, что он занят обработкой других пакетов и использует все доступные потоки для обработки пакетов.

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

    Если вы видите это, просмотрите текущие потоки обработки пакетов в DistMgr.log , чтобы узнать, зависли ли они. Вы также можете просмотреть значения реестра "Очередь обработки пакетов " и "Обрабатываемые пакеты " в следующем разделе реестра, чтобы узнать, сколько пакетов в настоящее время находится в очереди обработки:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SMS\Components\SMS_DISTRIBUTION_MANAGER

    Если значения обрабатываемых пакетов не изменяются и зависают в течение длительного периода времени, возможно, DistMgr зависает или зависает. В этом случае запишите дамп процесса SMSExec.exe для проверки.

    Если в очереди много пакетов, но очередь перемещается, может потребоваться проверить и изменить конфигурацию потока.

  • DistMgr.log не обрабатывает входящие PKN-файлы, и в результате пакеты не обрабатываются. Это приводит к невыполненной записи PKN-файлов в папке "Входящие" DistMgr.

    PKN-файлы обрабатываются потоком main DistMgr, поэтому в таких случаях полезно определить идентификатор потока main DistMgr, найдите SMS_EXECUTIVE, запущенную SMS_DISTRIBUTION_MANAGER запись журнала, а затем отфильтруйте DistMgr.log по идентификатору потока.

    В большинстве случаев эта проблема возникает, когда поток DistMgr main выполняет вызов WMI к удаленному dp, но WMI в DP не отвечает, в результате чего DistMgr будет ждать его неограниченное время. Фильтрация DistMgr.log для потока DistMgr main может дать подсказки о dp, с которым он пытается связаться. После определения проверка, если dp отвечает и WMI работает в DP. При необходимости перезагрузите DP, чтобы узнать, помогает ли это.

    Если отфильтрованный DistMgr.log не предоставляет никаких подсказок, запишите дамп процесса SMSExec.exe в состоянии проблемы для проверки.

Распространенные проблемы PkgXferMgr

  • PkgXferMgr.log отображает ошибку при добавлении файлов в библиотеку содержимого на 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
    

    После того как PkgXferMgr копирует файл содержимого в DP, он выполняет методы WMI, чтобы указать удаленному dp добавить файл в библиотеку содержимого. Если удаленному dp не удается добавить файл в библиотеку содержимого, в PkgXferMgr.log появится общая ошибка WMI (0x80041001 = WBEM_E_FAILED).

    В этом случае необходимо просмотреть SMSDPProv.log в DP, чтобы определить причину, по которой dp не удалось добавить файл в библиотеку содержимого. Если в SMSDPProv.logотображаются ошибки "Файл и путь не найдены", необходимо записать трассировку монитора процессов, чтобы определить причину сбоя.

  • PkgXferMgr.log показывает, что к 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.
    

    или

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

    Если PkgXferMgr.log показывает, что к DP разрешено только одно подключение, это означает, что dp настроен для регулирования пропускной способности. В этом случае PkgXferMgr может использовать только один поток для DP и в результате отправлять в DP только один пакет за раз. Дополнительные сведения см. в разделе Управление пропускной способностью и потоки .

  • PkgXferMgr.log показывает, что адрес закрыт:

    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
    

    Если вы видите это в журнале, это означает, что DP находится под контролем пропускной способности, а адрес dp закрыт во время передачи содержимого. В приведенном выше примере для расписания DP было настроено значение Разрешить высокий приоритет только в период с 8:00 до 10:00. В результате PkgXferMgr прекратила отправку содержимого в 8:00 и помечала пакет/DP в состоянии сбоя.

  • PkgXferMgr.log отображает несколько потоков, начинающихся одновременно для одного задания:

    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 использует один поток для задания, но если для одного задания используется несколько потоков, передача содержимого может начаться сбоем из-за ошибки 0x80070020 (ERROR_SHARING_VIOLATION). Это происходит, если сервер сайта и серверы базы данных сайта находятся в разных часовых поясах. Решение здесь заключается в том, чтобы убедиться, что сервер сайта и серверы базы данных сайта имеют одинаковые часовые пояса.

Распространенные проблемы с вытягиванием DP

  • PkgXferMgr.log показывает, что опрашиваемый DP находится в емкости и задания больше не отправляются в опрашиваемый 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 выполняет следующий запрос, чтобы проверка, сколько заданий в настоящее время находится в незавершенном состоянии в опрашиваемом DP. Если запрос возвращает более 50 заданий, он больше не будет отправлять задания в опрашиваемый 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, '') <> '')
    

    Эти задания удаляются из таблицы, DistributionJobs когда опрашиваемый DP отправляет сообщение об успешном выполнении или когда опрос состояния останавливается (на основе настроенных значений). Чтобы просмотреть задания в pull DP, можно использовать wbemtest или WMI Обозреватель для просмотра количества экземпляров для SMS_PullDPNotification класса. Вы также можете просмотреть экземпляры ROOT\SCCMDP:SMS_PullDPState класса WMI в опрашиваемом DP, чтобы определить пакеты, которые находятся в состоянии сбоя , и проверить PullDP.log а также DataTransferService.log для изучения сбоев.

  • SignatureDownload Задание при вытягивании DP завершается сбоем с ошибкой HTTP 404.

    Создано SignatureСкачать задание DTS {JOBID} для пакета C010000D.28, идентификатор содержимого ContentID. JobState = NotStarted
    Сообщение об ошибке DTS, полученное для C010000D.28, задание содержимого {JOBID}, 0x80070002: ошибка BITS: "СОСТОЯНИЕ HTTP 404: запрошенный URL-адрес не существует на сервере.

    Это известная проблема, так как файлы сигнатуры отсутствуют в исходном dp, размещенном на сервере сайта. Эта проблема возникает только в том случае, если действие распространения не является повторным.

    Чтобы обойти эту проблему, воспользуйтесь одним из описанных ниже методов.

    • Повторное распространение пакета (для повторного распространения пакета не требуется скачивание подписей, так как скачано полное содержимое).
    • Настройте опрашиваемый DP для использования исходного DP, который не размещен на сервере сайта.
  • DataTransferService.log отображает 0x800706D9 при попытке скачать содержимое из исходного 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 означает, что из средства сопоставления конечных точек больше нет доступных конечных точек. Эта проблема может возникнуть из-за сбоев выделения портов RPC, вызванных брандмауэром. Это также может произойти, если служба брандмауэра Windows отключена.

    Проверьте наличие брандмауэра между сервером сайта и затронутым сервером и проверьте, открыты ли порты RPC . Вы также можете записать трассировку сети (с опрашиваемого DP, а также исходного сервера DP) при воспроизведении ошибки для проверки.

  • Pull DP показывает, что он содержит большое количество заданий, но задания не обрабатываются.

    В некоторых случаях (обычно после установки нового опрашиваемого DP, когда все содержимое отправляется в опрашиваемый DP) слишком много сбоев заданий в опрашиваемом DP может привести к остановке обработки заданий. Хотя большинство из этих проблем устранены в последних выпусках продукта (Configuration Manager версии 1810), некоторые факторы среды могут привести к тому, что вытягивание dp не обрабатывает задания. В этом случае вы, скорее всего, увидите тысячи заданий DTS в ROOT\ccm\DataTransferService:CCM_DTS_JobEx классе WMI и около 50 (или более) заданий BITS в состоянии сбоем . В этом сценарии может быть полезно удалить все элементы, относящиеся к заданию, из WMI в опрашиваемом DP и повторно распространить содержимое в опрашиваемый DP контролируемым образом и исследовать сбои.

    Чтобы удалить все элементы, относящиеся к заданию, из WMI в pull DP, можно использовать приведенный ниже сценарий PowerShell (см. комментарии к скрипту для получения справки):

    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 ""
    
  • В содержимом показано , как установлено на опрашиваемом dp, но URL-адрес и URLSubPath для опрашиваемого DP не заполнены в ContentDPMap, что приводит к проблемам с пакетами с включенным доступом по протоколу SMB.

    После успешной установки содержимого опрашиваемого DP отправляет сообщение о состоянии, содержащее данные, необходимые для обновления значений URL/URLSubPath в ContentDPMap. Это происходит при обработке ответа DP по запросу. Ознакомьтесь с шагами 16-22 в разделе Распространение пакета для извлечения DP , чтобы понять поток и просмотреть соответствующие журналы, чтобы выяснить, почему сообщение о состоянии не обрабатывается. Скорее всего, причиной этой проблемы является либо невыполненная работа сообщений о состоянии в \MP\outboxes\StateMsg.box точке управления, либо ошибка MPFDM при копировании файлов на сервер сайта из-за проблем с разрешениями.

Отсутствующие файлы содержимого в библиотеке содержимого

Бывают случаи, когда вы заметите, что содержимое отсутствует в библиотеке содержимого. Это может произойти из-за предыдущих проблем с распространением содержимого или случайного удаления файлов из библиотеки содержимого. Чтобы убедиться, что содержимое отсутствует в библиотеке содержимого, определите затронутый пакет и отслеживайте содержимое пакета от PkgLib до FileLib.

Убедившись, что необходимое содержимое для пакета отсутствует в библиотеке содержимого, см. раздел Повторная отправка сжатой копии пакета на сайт для получения сведений о том, как повторно заполнить содержимое.

Общие проблемы

  • В журнале DistMgr или PkgXferMgr отображается ошибка "Файл/путь не найден":

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

    или

    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
    

    Распространенные коды ошибок: 0x80070002, 0x80070003.

    Для ошибок файла и пути не найдены, проблема, скорее всего, связана с тем, что в библиотеке содержимого на сервере сайта отсутствуют файлы содержимого для пакета. В результате PkgXferMgr не может отправлять файлы в DP.

    В таких случаях можно определить идентификатор содержимого из журнала и отслеживать содержимое от PkgLib до FileLib , чтобы убедиться, что файлы существуют. Вы также можете использовать библиотеку содержимого Обозреватель, чтобы проверка, если файлы содержимого пакета доступны в библиотеке содержимого, однако Обозреватель библиотеки содержимого может занять некоторое время, и может быть проще вручную отслеживать содержимое от PkgLib до FileLib. Кроме того, можно записать трассировку монитора процессов , чтобы проверить, отсутствуют ли необходимые файлы в библиотеке содержимого на сервере сайта.

    Если сайт, на который отсутствует содержимое в библиотеке содержимого, является исходным сайтом пакета, необходимо обновить пакет, чтобы увеличить версию исходного пакета, чтобы DistMgr снова принимает snapshot содержимого из исходного каталога пакета и повторно заполняет отсутствующее содержимое.

    Если сайт, на который отсутствует содержимое в библиотеке содержимого, отличается от исходного сайта пакета, можно заставить исходный сайт пакета повторно отправить сжатую копию пакета на затронутый сайт. Дополнительные сведения см. в статье Повторная отправка сжатой копии пакета на сайт .

  • В журнале DistMgr/PkgXferMgr отображается ошибка сети:

    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.
    

    Распространенные коды ошибок: 2, 3, 53, 64.

    Сведения об ошибках, связанных с сетью, см. в журнале и найдите сервер, с которым вы пытаетесь связаться при получении ошибки. После определения проверьте следующее:

    1. Можно ли выполнить связь с затронутым именем SERVERNAME, используя полное доменное имя, NetBIOS/IP-адрес?
    2. Можно ли получить доступ к общей папке \\SERVERNAME\admin$ с помощью полного доменного имени/NetBIOS/IP-адреса с помощью учетной записи SYSTEM с сервера сайта?
    3. Можно ли получить доступ к общей папке \\SERVERNAME\admin$ , используя полное доменное имя/NetBIOS/IP-адрес, используя учетную запись вошедшего пользователя с сервера сайта?
    4. Существует ли брандмауэр между сервером сайта и затронутым сервером? Открыты ли соответствующие порты (RPC/SMB) ?

    Если приведенные выше тесты успешно выполняются, запишите трассировку сети (как с сервера сайта, так и с затронутого сервера) при воспроизведении ошибки для проверки.

  • Журнал DistMgr/PkgXferMgr отображает ошибку "Отказано в доступе":

    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>
    

    Распространенные коды ошибок: 5, 0x80070005.

    Сведения об ошибках, связанных с разрешениями, см. в журнале и найдите путь, к которому вы пытаетесь получить доступ при возникновении ошибки. После определения проверьте следующее:

    1. Можно ли проверить связь с затронутым именем SERVERNAME, если путь является UNC-путем?
    2. Имеет ли учетная запись компьютера сервера сайта разрешения на доступ к пути?
    3. Можно ли получить доступ к затронутму пути с помощью полного доменного имени, NetBIOS/IP-адреса при использовании учетной записи SYSTEM с сервера сайта?
    4. Можно ли получить доступ к затронутму пути с помощью полного доменного имени, NetBIOS/IP-адреса при использовании учетной записи вошедшего пользователя с сервера сайта?
    5. Существует ли брандмауэр между сервером сайта и затронутым сервером? Открыты ли соответствующие порты (RPC/SMB) ?

    Если приведенные выше тесты успешно выполняются, запишите трассировку монитора процессов с сервера сайта при воспроизведении ошибки для проверки.

  • DistMgr/PkgXferMgr искать содержимое в каталоге \bin\x64\FileLib , а не в фактическом расположении библиотеки содержимого.

    Это связано с известной проблемой в средстве передачи библиотеки содержимого.