コンテンツ配布のトラブルシューティング

この記事では、一般的なコンテンツ配布の問題をトラブルシューティングする方法について説明します。

元の製品バージョン: 現在のブランチConfiguration Manager、Microsoft System Center 2012 Configuration Manager、Microsoft System Center 2012 R2 Configuration Manager

サンプルの問題

この例では、パッケージを配布ポイントに配布したが、パッケージが DP の [失敗] または [進行中] 状態にあるとします。

  1. まず、DP 存在するサイト (プライマリ/セカンダリ) でDistMgr.logを確認します。

    1. ログで ~処理パッケージ エントリを探し、問題のパッケージ ID のパッケージ処理スレッドを特定します。 特定したスレッド ID のDistMgr.logをフィルター処理します。 「 Standard DP にパッケージを配布する 」の手順 4 を確認して、ログの抜粋を確認します。
    2. フィルター処理されたログを確認し、問題の DP 用に DP スレッドが作成されたかどうかをチェックします。 これを容易にするために、スレッド ID の DistMgr.log をフィルター処理します。
    3. フィルター処理されたログを確認し、PkgXferMgr ジョブが作成されたかどうかをチェックします。
  2. DP 存在するサイト (プライマリ/セカンダリ) でPkgXferMgr.logを確認します。

    1. ログ内の ID エントリを含む Found send request を探し、影響を受ける DP/パッケージの組み合わせの送信スレッドを特定します。 識別されたスレッド ID の PkgXferMgr.log をフィルター処理します。 「 Standard DP にパッケージを配布する 」の手順 6 を確認して、ログの抜粋を確認します。
    2. フィルター処理されたログを確認して、コンテンツが DP に正常に転送されたか、エラーが発生したかを確認します。
  3. Standard DP の場合、PkgXferMgr はコンテンツ ファイルを DP にコピーし、WMI メソッドを呼び出してファイルをコンテンツ ライブラリに追加するように DP WMI プロバイダーに指示します。 DP のSMSDPProv.log を確認して、コンテンツがコンテンツ ライブラリに追加されたことを確認します。 「 パッケージを標準 DP に配布する 」の手順 7 を確認して、ログの抜粋を確認します。

    pull DP の場合、PkgXferMgr は pull DP に通知してコンテンツのダウンロードを開始します。 「 パッケージを配布して DP をプルする 」の手順 8 から 16 を確認して、フローを理解し 、PullDP.logDataTransferService.log を確認して、コンテンツが正常にダウンロードされたことを確認します。

  4. 標準の DP の場合、PkgXferMgr は DistMgr にステータス メッセージを送信します。 状態メッセージが正常に処理されたかどうかを確認するには、DistMgr.logを確認します。 「 パッケージを標準 DP に配布する 」の手順 8 を確認して、ログの抜粋を確認します。

    pull DP の場合、pull DP は成功を示す状態メッセージを送信します。 「 パッケージを配布して DP をプルする 」の手順 16 から 22 を確認して、フローを理解し、関連するログを確認して状態メッセージが正常に処理されていることを確認します。

  5. 複数のサイトが関係している場合は、データベース レプリケーションが機能しており、関連するサイト間のデータベース リンクがアクティブであることを確認します。

DistMgr の一般的な問題

  • DistMgr.log は、問題のパッケージ ID に対して次のエントリを示しています。

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

    これは通常、コンテンツがサイト間で転送されている間に一時的に発生します。 Sender/Despooler ログを確認して、サイト通信に問題がないことを確認します。 サイト間通信中にエラー (Scheduler -Sender ->>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 ファイルを処理せず、その結果、パッケージは処理されません。 その結果、DistMgr の受信トレイに PKN ファイルがバックログされます。

    PKN ファイルは メイン DistMgr スレッドによって処理されるため、このような場合は、開始されたSMS_EXECUTIVE SMS_DISTRIBUTION_MANAGERログ エントリを探し、識別されたスレッド ID のDistMgr.logをフィルター処理することで、DistMgr スレッド ID メインを特定すると便利です。

    ほとんどの場合、この問題は、メイン DistMgr スレッドがリモート DP への WMI 呼び出しを行っているが、DP 上の WMI が応答せず、DistMgr が無期限に待機している場合に発生します。 メイン DistMgr スレッドのDistMgr.logをフィルター処理すると、通信しようとしている 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) 表示されます。

    その場合は、DP のSMSDPProv.log を確認して、DP がコンテンツ ライブラリにファイルを追加できなかった理由を特定する必要があります。 SMSDPProv.logファイル/パスが見つからないエラーが表示された場合は、プロセス モニター トレースをキャプチャしてエラーの理由を特定する必要があります。

  • PkgXferMgr.log は、DP への接続が 1 つだけ許可されていることを示しています。

    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 への "1 つの接続のみが許可されています" と表示される場合は、DP が帯域幅調整用に構成されていることを意味します。 この場合、PkgXferMgr は DP に対して 1 つのスレッドのみを使用でき、その結果、DP に送信できるパッケージは一度に 1 つだけです。 詳細については、「 帯域幅の制御とスレッド 」を参照してください。

  • アドレスが 閉じられている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 時にコンテンツの送信を停止し、パッケージ/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 はジョブに 1 つのスレッドを使用しますが、同じジョブに複数のスレッドを使用すると、エラー 0x80070020 (ERROR_SHARING_VIOLATION) のためにコンテンツ転送が失敗し始める可能性があります。 これは、サイト サーバーとサイト データベース サーバーが異なるタイム ゾーンにある場合に発生します。 ここでの解決策は、サイト サーバーとサイト データベース サーバーに同じタイム ゾーンが設定されていることを確認することです。

プル DP に関する一般的な問題

  • PkgXferMgr.log は、Pull 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, '') <> '')
    

    これらのジョブは、プル DP が成功状態メッセージを送信するとき、または状態ポーリングが停止したときに (構成された値に基づいて) テーブルからDistributionJobs削除されます。 プル DP のジョブを表示するには、wbemtest または WMI エクスプローラーを使用して、クラスのインスタンス数をSMS_PullDPNotification確認できます。 プル DP の WMI クラスの ROOT\SCCMDP:SMS_PullDPState インスタンスを確認して、 失敗 状態にあるパッケージを特定し、 PullDP.log を確認したり、 DataTransferService.log してエラーを調査したりすることもできます。

  • SignatureDownload プル DP のジョブが HTTP 404 エラーで失敗します。

    パッケージ C010000D.28 のコンテンツ ID ContentID 用に DTS ジョブ {JOBID} を作成しました。 JobState = NotStarted
    C010000D.28、コンテンツ ジョブ {JOBID}、0x80070002: BITS エラー: 'HTTP 状態 404: 要求された URL がサーバーに存在しません。

    署名ファイルがサイト サーバー上に併置されているソース DP に存在しないため、これは既知の問題です。 この問題は、配布アクションが 再リストされていない場合にのみ発生します。

    この問題を回避するには、以下のいずれかの方法を使用します。

    • パッケージを再配布します (パッケージを再配布する場合、完全なコンテンツがダウンロードされるため、署名をダウンロードする必要はありません)。
    • サイト サーバーに併置されていないソース DP を使用するようにプル DP を構成します。
  • DataTransferService.logは、ソース DP からコンテンツをダウンロードしようとしたときに0x800706D9を表示します。

    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 サーバーから) をキャプチャすることもできます。

  • プル DP は、多数のジョブがあるが、ジョブが処理されていないことを示します。

    場合によっては (通常、すべてのコンテンツがプル DP に送信されるときに、新しいプル DP をインストールした後)、プル DP のジョブ エラーが多すぎると、ジョブの処理がストールする可能性があります。 これらの問題のほとんどは、製品の最近のリリース (バージョン 1810 Configuration Manager) で修正されていますが、一部の環境要因により、プル DP がジョブを処理しない可能性があります。 この場合、WMI クラスに何千もの DTS ジョブ ROOT\ccm\DataTransferService:CCM_DTS_JobEx が表示され、最大 50 以上の BITS ジョブが 失敗 状態になります。 このシナリオでは、プル DP 上の WMI からすべてのジョブ固有項目を削除し、制御された方法でプル DP にコンテンツを再配布し、エラーを調査すると便利です。

    Pull DP で WMI からジョブ固有のすべての項目を削除するには、次の 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 に インストールされていますが 、プル DP の URL と URLSubPath が に設定されていないため、SMB アクセスが有効になっているパッケージに ContentDPMap問題が発生します。

    プル DP は、コンテンツが正常にインストールされると、 のContentDPMap値を更新するために必要なデータを含む状態メッセージをURL/URLSubPath送信します。 これは、プル DP 応答が処理されるときに発生します。 「 DP をプルするパッケージを配布する 」の手順 16 から 22 を確認して、フローを理解し、関連するログを確認して、状態メッセージが処理されない理由を調査します。 この問題の原因として考えられるのは、管理ポイント上の の \MP\outboxes\StateMsg.box 状態メッセージのバックログか、MPFDM がアクセス許可の問題のためにファイルをサイト サーバーにコピーできない場合です。

コンテンツ ライブラリにコンテンツ ファイルがない

コンテンツ ライブラリにコンテンツが見つからない場合があります。 これは、以前のコンテンツ配布の問題や、コンテンツ ライブラリからファイルが誤って削除されたユーザー/何かが原因で発生する可能性があります。 コンテンツ がコンテンツ ライブラリに含まれていないことを確認するには、影響を受けるパッケージを特定し、パッケージのコンテンツを から PkgLibFileLib追跡します。

コンテンツ ライブラリにパッケージに必要なコンテンツが見つからないことを確認したら、コンテンツを再入力する方法については、「 パッケージの圧縮コピーをサイトに再送信 する」を参照してください。

一般的な問題

  • 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
    

    一般的なエラー コード: 0x800700020x80070003

    ファイル/パスが見つからないエラーの場合、問題は、サイト サーバー上のコンテンツ ライブラリにパッケージのコンテンツ ファイルが見つからないことが原因である可能性があります。 その結果、PkgXferMgr は DP にファイルを送信できません。

    このような場合は、ログからコンテンツ ID を識別し、 から のコンテンツ PkgLibFileLib 追跡して、ファイルが存在することを確認できます。 コンテンツ ライブラリ エクスプローラーを使用して、パッケージ コンテンツ ファイルがコンテンツ ライブラリで使用できる場合にチェックすることもできますが、コンテンツ ライブラリエクスプローラーの読み込みに時間がかかる場合があり、コンテンツをから に手動で追跡する方がPkgLibFileLib簡単な場合があります。 または、 プロセス モニター トレースをキャプチャして、必要なファイルがサイト サーバー上のコンテンツ ライブラリに存在しないかどうかを確認することもできます。

    コンテンツ ライブラリにコンテンツがないサイトがパッケージ ソース サイトである場合は、パッケージ ソース バージョンをインクリメントするようにパッケージを更新して、DistMgr がパッケージ ソース ディレクトリからコンテンツのスナップショットをもう一度取得し、見つからないコンテンツを再入力する必要があります。

    コンテンツ ライブラリ内のコンテンツが見つからないサイトがパッケージ ソース サイトと異なる場合は、パッケージ ソース サイトに、影響を受けるサイトにパッケージの圧縮コピーを強制的に再送信できます。 詳細については、「 パッケージの圧縮コピーをサイトに再送信する 」を参照してください。

  • 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.
    

    一般的なエラー コード: 235364

    ネットワーク関連のエラーについては、ログを確認し、エラーが発生したときに通信しようとしているサーバーを特定します。 特定されたら、次のテストを行います。

    1. FQDN/NetBIOS/IP アドレスを使用して、影響を受ける SERVERNAME に ping を実行できますか?
    2. サイト サーバーの SYSTEM アカウントを使用して FQDN/NetBIOS/IP アドレスを使用して \\SERVERNAME\admin$ 共有にアクセスできますか?
    3. サイト サーバーからログインしたユーザーのアカウントを使用して、FQDN/NetBIOS/IP アドレスを使用して \\SERVERNAME\admin$ 共有にアクセスできますか?
    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>
    

    一般的なエラー コード: 50x80070005

    アクセス許可に関連するエラーについては、ログを確認し、エラーが発生したときにアクセスしようとしているパスを特定します。 特定されたら、次のテストを行います。

    1. パスが UNC パスの場合、影響を受ける SERVERNAME に ping を実行できますか?
    2. サイト サーバー コンピューター アカウントには、パスにアクセスするためのアクセス許可がありますか?
    3. サイト サーバーから SYSTEM アカウントを使用する場合、FQDN/NetBIOS/IP アドレスを使用して影響を受けるパスにアクセスできますか?
    4. サイト サーバーからログインしているユーザーのアカウントを使用する場合、FQDN/NetBIOS/IP アドレスを使用して影響を受けるパスにアクセスできますか?
    5. サイト サーバーと影響を受けるサーバーの間にファイアウォールはありますか? 関連ポート (RPC/SMB) は開いていますか?

    上記のテストが成功した場合は、レビューのエラーを再現しながら、サイト サーバーから プロセス モニター トレースをキャプチャします。

  • DistMgr/PkgXferMgr は、実際のコンテンツ ライブラリの \bin\x64\FileLib 場所ではなく、ディレクトリ内のコンテンツを検索します。

    これは、コンテンツ ライブラリ転送ツールの既知の問題が原因です。