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 current branch, 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ł dystrybuowany do punktu dystrybucji, ale pakiet jest w stanie Niepowodzenie lub W toku dla programu DP.
Najpierw przejrzyj DistMgr.log w lokacji (głównej/pomocniczej), w której znajduje się dp.
- Poszukaj pozycji ~Processing package w dzienniku i zidentyfikuj wątek przetwarzania pakietu dla danego identyfikatora pakietu. Filtruj DistMgr.log dla zidentyfikowanych identyfikatorów wątku. Zapoznaj się z krokiem 4 w temacie Dystrybucja pakietu do standardowego programu DP , aby wyświetlić fragmenty dziennika.
- Przejrzyj filtrowany dziennik i sprawdź, czy wątek dp został utworzony dla danego serwera DP. Filtruj DistMgr.log identyfikatora wątku, aby ułatwić to działanie.
- Przejrzyj filtrowany dziennik i sprawdź, czy utworzono zadanie programu PkgXferMgr.
Przejrzyj PkgXferMgr.log w lokacji (głównej/pomocniczej), w której znajduje się program DP.
- Wyszukaj pozycję Znaleziono żądanie wysyłania z wpisami identyfikatora w dzienniku i zidentyfikuj wątek wysyłający dla kombinacji objętej programu DP/pakietu. Filtruj PkgXferMgr.log dla zidentyfikowanych identyfikatorów wątku. Zapoznaj się z krokiem 6 w temacie Dystrybucja pakietu do standardowego programu DP , aby wyświetlić fragmenty dziennika.
- Przejrzyj filtrowany dziennik, aby sprawdzić, czy zawartość została pomyślnie przeniesiona do programu DP lub czy wystąpił błąd.
W przypadku standardowych dostawców DPs program PkgXferMgr kopiuje pliki zawartości do programu DP, instruuje dostawcę WMI programu DP, aby dodać plik do biblioteki zawartości przez wywołanie metod WMI. Przejrzyj SMSDPProv.log w programie DP, aby upewnić się, że zawartość została dodana do biblioteki zawartości. Zapoznaj się z krokiem 7 w temacie Dystrybucja pakietu do standardowego programu DP , aby wyświetlić fragmenty dziennika.
W przypadku ściąganych dostawców DPs program PkgXferMgr powiadamia ściąganie programu DP w celu zainicjowania pobierania zawartości. Przejrzyj kroki 8–16 w temacie Dystrybucja pakietu, aby ściągnąć program DP , aby zrozumieć przepływ i przejrzeć PullDP.log i DataTransferService.log , aby upewnić się, że zawartość została pomyślnie pobrana.
W przypadku standardowych dostawców DSP program PkgXferMgr wysyła komunikat o stanie do programu DistMgr. Przejrzyj DistMgr.log , aby sprawdzić, czy komunikat o stanie został pomyślnie przetworzony. Zapoznaj się z krokiem 8 w temacie Dystrybucja pakietu do standardowego programu DP , aby wyświetlić fragmenty dziennika.
W przypadku ściągania dostawców DPs ściąganie programu DP wysyła komunikat o stanie wskazujący powodzenie. Przejrzyj kroki 16–22 w temacie Dystrybucja pakietu, aby ściągnąć program DP , aby zrozumieć przepływ i przejrzeć odpowiednie dzienniki, aby upewnić się, że komunikat o stanie został pomyślnie przetworzony.
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łany z jednej witryny do innej. Przejrzyj dzienniki nadawcy/despoolera, aby upewnić się, że nie ma problemów z komunikacją lokacji. 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. Zapoznaj się z artykułem Dystrybucja pakietu do programu DP między lokacjami , aby zrozumieć przepływ dziennika.
Jeśli nie ma żadnych błędów, może być konieczne wymusić ponowne wysłanie pakietu do witryny, której dotyczy problem, w witrynie nadrzędnej. Aby uzyskać więcej informacji, zobacz Ponowne wysyłanie skompresowanej kopii pakietu do witryny .
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 zobaczysz, przejrzyj bieżące wątki przetwarzania pakietów w DistMgr.log , aby sprawdzić, czy są zablokowane. Możesz również przejrzeć wartości rejestru kolejki przetwarzania pakietów i pakietów przetwarzanych w następującym kluczu 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 Pakiety przetwarzane nie zmieniają się i są zablokowane przez długi czas, możliwe, że program DistMgr zawiesza się/blokuje. 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, a w rezultacie pakiety nie są przetwarzane. Spowoduje to utworzenie listy prac plików PKN w skrzynce odbiorczej programu DistMgr.
Pliki PKN są przetwarzane przez główny wątek DistMgr, więc w tych przypadkach warto zidentyfikować główny identyfikator wątku programu DistMgr, wyszukując wpis dziennika uruchomiony SMS_EXECUTIVE SMS_DISTRIBUTION_MANAGER , a następnie filtrować DistMgr.log zidentyfikowanego identyfikatora wątku.
W większości przypadków ten problem występuje, gdy główny wątek DistMgr wykonuje wywołanie WMI do zdalnego programu DP, ale usługa WMI w programie DP nie odpowiada, powodując, że program DistMgr czeka na nieokreślono. Filtrowanie DistMgr.log głównego wątku DistMgr może dostarczyć wskazówek dotyczących programu DP, z którymi próbuje się komunikować. Po zidentyfikowaniu sprawdź, czy program DP odpowiada, a usługa WMI działa w programie DP. W razie potrzeby uruchom ponownie program DP, aby sprawdzić, czy to pomoże.
Jeśli filtrowany DistMgr.log nie udostępnia żadnych wskazówek, przechwyć zrzut procesu SMSExec.exe podczas przeglądania stanu problemu.
Typowe problemy z programem PkgXferMgr
PkgXferMgr.log wyświetla błąd podczas dodawania plików do biblioteki zawartości w programie 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 kopiuje plik zawartości do programu DP, wykonuje metody WMI w celu poinstruowania zdalnego programu DP w celu dodania pliku do biblioteki zawartości. Jeśli zdalny program DP nie może dodać pliku do biblioteki zawartości, w PkgXferMgr.log zostanie wyświetlony ogólny błąd usługi WMI (0x80041001 = WBEM_E_FAILED).
W takim przypadku należy przejrzeć SMSDPProv.log w dp, aby zidentyfikować przyczynę niepowodzenia dodania pliku do biblioteki zawartości przez dp. Jeśli w SMSDPProv.log zobaczysz błędy Nie znaleziono pliku/ścieżki, należy przechwycić ślad monitora procesów, aby określić przyczynę niepowodzenia.
PkgXferMgr.log pokazuje, że do dp może być dozwolone tylko jedno połączenie:
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" do programu DP, oznacza to, że program DP jest skonfigurowany do ograniczania przepustowości. W takim przypadku program PkgXferMgr może używać tylko jednego wątku dla programu DP, a w rezultacie wysyłać tylko jeden pakiet do programu DP w danym momencie. 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 program DP jest pod kontrolą przepustowości, a adres do programu DP został zamknięty, gdy transfer zawartości był w toku. W powyższym przykładzie harmonogram programu DP został skonfigurowany dla ustawienia Zezwalaj na wysoki priorytet tylko w godzinach 8:00–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 zakończyć 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 programem DP ściągania
PkgXferMgr.log pokazuje, że program Pull DP jest w pojemności, a do ściągania programu DP nie są wysyłane żadne zadania:
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
Program PkgXferMgr uruchamia następujące zapytanie, aby sprawdzić, ile zadań jest obecnie w stanie niedokończonym w ściągnięciu programu DP. Jeśli zapytanie zwróci więcej niż 50 zadań, nie wyśle więcej zadań do ściągania programu 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 programu 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 programu DP, możesz użyć narzędzia wbemtest lub eksploratora WMI, aby przejrzeć liczbę wystąpień dlaSMS_PullDPNotification
klasy. Możesz również przejrzeć wystąpieniaROOT\SCCMDP:SMS_PullDPState
klasy WMI w ściąganiu programu DP, aby zidentyfikować pakiety, które znajdują się w stanie Niepowodzenie , i przejrzeć PullDP.log , a także DataTransferService.log w celu zbadania błędów.SignatureDownload
Zadanie ściągania programu DP kończy się niepowodzeniem z powodu błędu HTTP 404.Utworzono zadanie SignatureDownload DTS {JOBID} dla pakietu C010000D.28, identyfikator zawartości ContentID. JobState = NotStarted
Komunikat o błędzie DTS odebrany 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 podpisów nie są obecne w źródłowym programie 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:
- Redystrybuuj pakiet (redystrybucja pakietu nie wymaga pobierania podpisów, ponieważ pobierana jest pełna zawartość).
- Skonfiguruj ściąganie programu DP, aby używać źródłowego programu DP, który nie jest kolokowany na serwerze lokacji.
DataTransferService.log pokazuje 0x800706D9 podczas próby pobrania zawartości ze źródłowego programu 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 oznacza, że nie ma więcej punktów końcowych dostępnych z mapowania 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 sieciowy (z ściągania programu DP oraz źródłowego serwera DP) podczas odtwarzania błędu do przeglądu.
Ściąganie programu DP pokazuje, że ma dużą liczbę zadań, ale zadania nie są przetwarzane.
W niektórych przypadkach (zwykle po zainstalowaniu nowego ściągania programu DP, gdy cała zawartość jest wysyłana do ściągania programu DP), zbyt wiele błędów zadań w ściąganiu programu DP może zakończyć się zatrzymanym przetwarzaniem zadań. Chociaż większość z tych problemów została rozwiązana w ostatnich wersjach produktu (Configuration Manager w wersji 1810), niektóre czynniki środowiskowe mogą powodować brak przetwarzania zadań ściągania programu DP. W takim przypadku prawdopodobnie w klasie WMI zobaczysz tysiące zadań
ROOT\ccm\DataTransferService:CCM_DTS_JobEx
DTS i ok. 50 (lub więcej) zadań usługi BITS w stanie Niepowodzenie . W tym scenariuszu korzystne może być usunięcie wszystkich elementów specyficznych dla zadania z usługi WMI w ściąganiu programu DP i ponowne dystrybuowanie zawartości do ściągania programu DP w kontrolowany sposób i badanie błędów.Aby usunąć wszystkie elementy specyficzne dla zadania z usługi WMI w programie 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ść jest wyświetlana jako zainstalowana w ściąganiu programu DP, ale adres URL i adres URLSubPath dla ściągania programu DP nie jest wypełniany w
ContentDPMap
pliku , co powoduje problemy z pakietami z włączonym dostępem SMB.Gdy program DP ściągania pomyślnie zainstalował zawartość, wysyła komunikat o stanie zawierający dane niezbędne do zaktualizowania
URL/URLSubPath
wartości w programieContentDPMap
. Dzieje się tak, gdy jest przetwarzana odpowiedź ściągania dp. Przejrzyj kroki 16–22 w temacie Dystrybucja pakietu, aby ściągnąć program DP , aby zrozumieć przepływ i przejrzeć odpowiednie dzienniki, aby zbadać, dlaczego komunikat o stanie nie jest przetwarzany. Najbardziej prawdopodobną przyczyną tego problemu jest lista prac komunikatów o stanie w\MP\outboxes\StateMsg.box
punkcie zarządzania lub program MPFDM, który nie może skopiować plików na serwer lokacji z powodu problemów z uprawnieniami.
Brak plików zawartości w bibliotece zawartości
Czasami zauważysz, że w bibliotece zawartości brakuje 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. Aby potwierdzić, że w bibliotece zawartości brakuje 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 Resend compressed copy of a package to a site (Ponowne wysyłanie skompresowanej kopii pakietu do witryny ), aby uzyskać informacje na temat ponownego wypełniania zawartości.
Problemy ogólne
Dziennik DistMgr lub PkgXferMgr zawiera 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 prawdopodobnie wynika z faktu, że biblioteka zawartości na serwerze lokacji nie zawiera plików zawartości pakietu. W związku z tym program PkgXferMgr nie może wysłać plików do programu DP.
W takich przypadkach można zidentyfikować identyfikator zawartości z dziennika i śledzić zawartość z
PkgLib
, abyFileLib
upewnić się, że pliki istnieją. Za pomocą Eksploratora biblioteki zawartości można również sprawdzić, czy pliki zawartości pakietu są dostępne w bibliotece zawartości, jednak ładowanie eksploratora bibliotek zawartości może zająć trochę czasu i może być łatwiejsze ręczne śledzenie zawartości zPkgLib
doFileLib
programu . Alternatywnie można przechwycić ślad monitora procesów, aby sprawdzić, czy w bibliotece zawartości na serwerze lokacji brakuje niezbędnych plików.Jeśli witryna, w ramach którego brakuje zawartości w bibliotece zawartości, jest lokacją źródłową pakietu, należy zaktualizować pakiet w celu rozszerzenia wersji źródła pakietu, aby program DistMgr ponownie zrobił migawkę zawartości z katalogu źródłowego pakietu i ponownie wypełni brakującą zawartość.
Jeśli w witrynie brakuje zawartości w bibliotece zawartości różni się od lokacji źródłowej pakietu, możesz wymusić ponowne wysłanie skompresowanej kopii pakietu do witryny, której dotyczy problem. Aby uzyskać więcej informacji, zobacz Ponowne wysyłanie skompresowanej kopii pakietu do witryny .
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:
- Czy można wysłać polecenie ping do nazwy SERWERA, którego dotyczy problem, przy użyciu nazwy FQDN/NetBIOS/adresu IP?
- Czy można uzyskać dostęp do udziału \\SERVERNAME\admin$ przy użyciu nazwy FQDN/NetBIOS/adresu IP przy użyciu konta SYSTEM z serwera lokacji?
- Czy można uzyskać dostęp do udziału \\SERVERNAME\admin$ przy użyciu nazwy FQDN/NetBIOS/adresu IP przy użyciu konta zalogowanego użytkownika z serwera lokacji?
- Czy istnieje zapora między serwerem lokacji a serwerem, którego dotyczy problem? Czy odpowiednie porty (RPC/SMB) są otwarte?
Jeśli powyższe testy zakończyły się pomyślnie, przechwyć ślad sieci (z serwera lokacji, a także serwer, 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:
- Czy możesz wysłać polecenie ping do nazwy SERWERA, którego dotyczy problem, jeśli ścieżka jest ścieżką UNC?
- Czy konto komputera serwera lokacji ma uprawnienia dostępu do ścieżki?
- Czy można uzyskać dostęp do ścieżki, której dotyczy problem, przy użyciu nazwy FQDN/NetBIOS/adresu IP podczas korzystania z konta SYSTEM z serwera lokacji?
- Czy możesz uzyskać dostęp do ścieżki, której dotyczy problem, przy użyciu nazwy FQDN/NetBIOS/adresu IP podczas korzystania z konta zalogowanego użytkownika z serwera lokacji?
- Czy istnieje zapora między serwerem lokacji a serwerem, którego dotyczy problem? Czy odpowiednie porty (RPC/SMB) są otwarte?
Jeśli powyższe testy zakończyły się pomyślnie, przechwyć ślad monitora procesów z serwera lokacji podczas odtwarzania błędu do przeglądu.
DistMgr/PkgXferMgr wyszukuje zawartość w
\bin\x64\FileLib
katalogu zamiast rzeczywistej lokalizacji biblioteki zawartości.Jest to spowodowane znanym problemem w narzędziu do transferu biblioteki zawartości.