Thursday, June 27, 2019

Find SCCM Distribution Points in Maintenance Mode in Powershell or SQL + Set Maintenance Mode


Since 1902 SCCM it is possible to set Distribution Point in Maintenance Mode https://docs.microsoft.com/en-us/sccm/core/servers/deploy/configure/install-and-configure-distribution-points#bkmk_maint


In "\Administration\Overview\Distribution Points" you can set  "Enable maintenance mode" / "Disable maintenance mode"



In log MICROSOFT CONFIGURATION MANAGER\LOGS\DISTMGR.LOG when you try to distribute a package to this DP you will find this message when a Distribution Point is in Maintenance mode:
 Skipping distribution point ["Display=\\SRVDP01.mydomain.net\"]MSWNET:["SMS_SITE=XXX"]\\SRVDP01.mydomain.net\ since its in maintenance mode



In Powershell to find Distribution Point in Maintenance mode us Get-CMDistributionPointInfo cmdlet

If you need to know all your Distribution Points in Maintenance Mode in Powershell as in console "\Administration\Overview\Distribution Points" you just need to use Get-CMDistributionPointInfo cmdlet


$allDPinMaintenanceMode = Get-CMDistributionPointInfo | Where-Object { $_.MaintenanceMode -eq 1 }
$allDPinMaintenanceMode | Select-Object Name,Main* | Format-List
Name                         :
SRVDP01.mydomain.net
MaintenanceMode              : 1
MaintenanceModeLastStartTime : 6/19/2019 6:48:00 AM


As you can see:
MaintenanceMode = 1 when Distribution Point Maintenance Mode is Enabled and MaintenanceMode = 0 when Distribution Point Maintenance Mode is Disabled (active Distribution Point)



















In SQL to find Distribution Point in Maintenance mode using View table


In log "MICROSOFT CONFIGURATION MANAGER\LOGS\SMSProv.log" you can find table used in console clicking in "\Administration\Overview\Distribution Points"
CExtProviderClassObject::DoCreateInstanceEnumAsync (SMS_Query)
Execute WQL  =SELECT * FROM SMS_DistributionPointInfo~ 
Execute SQL =select  all SMS_DistributionPointInfo.AddressScheduleEnabled
,SMS_DistributionPointInfo.BindExcept
,SMS_DistributionPointInfo.BindPolicy
,SMS_DistributionPointInfo.BitsEnabled
,SMS_DistributionPointInfo.CertificateType
,SMS_DistributionPointInfo.Communication
,SMS_DistributionPointInfo.Description
,SMS_DistributionPointInfo.DPFlags
,SMS_DistributionPointInfo.Drive
,SMS_DistributionPointInfo.EnableLEDBAT
,SMS_DistributionPointInfo.GroupCount
,SMS_DistributionPointInfo.HasRelationship
,SMS_DistributionPointInfo.HealthCheckEnabled
,SMS_DistributionPointInfo.HealthCheckPriority
,SMS_DistributionPointInfo.HealthCheckSchedule
,SMS_DistributionPointInfo.ID
,SMS_DistributionPointInfo.IdentityGUID
,SMS_DistributionPointInfo.InternetFacing
,SMS_DistributionPointInfo.IsActive
,SMS_DistributionPointInfo.IsMulticast
,SMS_DistributionPointInfo.IsPeerDP
,SMS_DistributionPointInfo.IsProtected
,SMS_DistributionPointInfo.IsPullDP
,SMS_DistributionPointInfo.IsPXE
,SMS_DistributionPointInfo.MaintenanceMode
,SMS_DistributionPointInfo.MaintenanceModeLastStartTime
,SMS_DistributionPointInfo.NALPath
,SMS_DistributionPointInfo.Name
,SMS_DistributionPointInfo.OperatingSystem
,SMS_DistributionPointInfo.PreStagingAllowed
,SMS_DistributionPointInfo.Priority
,SMS_DistributionPointInfo.PXEPassword
,SMS_DistributionPointInfo.RateLimitsEnabled
,SMS_DistributionPointInfo.Region
,SMS_DistributionPointInfo.ResourceType
,SMS_DistributionPointInfo.ResponseDelay
,SMS_DistributionPointInfo.SccmPXE
,SMS_DistributionPointInfo.ServerName
,SMS_DistributionPointInfo.ServiceType
,SMS_DistributionPointInfo.ShareName
,SMS_DistributionPointInfo.SiteCode
,SMS_DistributionPointInfo.SiteName
,SMS_DistributionPointInfo.SupportUnknownMachines
,SMS_DistributionPointInfo.TransferRate
,SMS_DistributionPointInfo.UdaSetting
,SMS_DistributionPointInfo.Version 
from v_DistributionPointInfo AS SMS_DistributionPointInfo  OPTION(USE HINT('FORCE_LEGACY_CARDINALITY_ESTIMATION'))~ 
CExtUserContext::LeaveThread : Releasing IWbemContextPtr=216121456

So to find DP in maintenance mode you just to use this SQL query:

SELECT * FROM v_DistributionPointInfo WHERE MaintenanceMode = '1'











In SQL to find Distribution Point in Maintenance mode using Table (just form information - do not use table directly - use View Table)

To find DP in maintenance mode you can also use this (not recommended) SQL query:

SELECT * FROM DistributionPoints WHERE MaintenanceMode = '1'












In Console, information about Maintenance Mode is in file
 C:\Program Files (x86)\Microsoft Configuration Manager\AdminConsole\XmlStorage\ConsoleRoot\SiteConfigurationNode.xml


In Powershell how to set  Maintenance Mode ?
To find that we can check SMS_DistributionPointInfo method

$smsdpinfo = [WmiClass]"\\SCCMSERVER.mydomain.net\root\SMS\Site_XXX:SMS_DistributionPointInfo"
($smsdpinfo | Get-Member -MemberType method).Definition
System.Management.ManagementBaseObject GetChainedPullDPs(System.String SourceDPNALPath)
System.Management.ManagementBaseObject ReassignDP(System.String NALPath, System.String SiteCode)
System.Management.ManagementBaseObject SetDPMaintenanceMode(System.String NALPath, System.UInt32 Mode)


with XXX = your Primary site Code
with SCCMSERVER.mydomain.net = your Primary SCCM Primary computername


And with some research we can find in Microsoft Documentation some information about SetDPMaintenanceMode
https://docs.microsoft.com/en-us/sccm/develop/reference/core/servers/configure/setdpmaintenancemode-method-in-class-sms-distributionpointinfo

So to set Maintenance Mode use (enabled) use:
$smsdpinfo = [WmiClass]"\\SCCMSERVER.mydomain.net\root\SMS\Site_XXX:SMS_DistributionPointInfo"
$smsdpinfo.SetDPMaintenanceMode('["Display=\\SRVDP01.mydomain.net\"]MSWNET:["SMS_SITE=XXX"]\\SRVDP01.mydomain.net\','1')
with XXX = your Primary site Code
with SCCMSERVER.mydomain.net = your Primary SCCM Primary computername
with SRVDP01.mydomain.net = DP to set in Maintenance Mode

So to remove Maintenance Mode use (diabled) use:
$smsdpinfo = [WmiClass]"\\SCCMSERVER.mydomain.net\root\SMS\Site_XXX:SMS_DistributionPointInfo"
$smsdpinfo.SetDPMaintenanceMode('["Display=\\SRVDP01.mydomain.net\"]MSWNET:["SMS_SITE=XXX"]\\SRVDP01.mydomain.net\','0')

When it is OK, ReturnValue = 0


Seems someone already create a simpliest powershell to set Maintenance Mode. So I will not reinvent wheel (...this time :-) ... ). So please go to
https://sccmf12twice.com/2019/06/set-cmdistributionpointmaintenancemode/
or directly to script
https://github.com/CodyMathis123/CM-Ramblings/blob/master/Set-CMDistributionPointMaintenanceMode.ps1



Monday, January 21, 2019

SCCM Powershell script to add package to Distribution Point - SCCM_AddPackageToDP.ps1

 Below a script permitting to add Package to Distribution Point/Pull DP
Option -ForceToDeletePackageBeforeIfExist delete 1st and add when there is a problem

Example :
.\SCCM_AddPackageToDP.ps1 -DistPoint "SERVER01" -Package "ABC00123"


Example if you want to use a .csv file like this below

"PackageID";"DistributionPoint";"SiteCode"
"XXX00233";"computerdp1";"ABC"
"XXX00233";"computerdp2";"ABC"


 .\SCCM_AddPackageToDP.ps1 -ImportFilePath .\mydp.csv  





<#
.Synopsis
   Add Package to Distribution Point
.EXAMPLE
   SCCM_AddPackageToDP.ps1 -DistPoint "SERVER01" -Package "ABC00123"
#>
[cmdletbinding()]
Param(
    [String]$ImportFilePath=""
    ,[String]$DistPoint=""
    ,[String]$Package=""
    ,[String]$CM="mycm.mydomain.net"
    ,[String]$PrimarySiteCode="XXX"
    ,[switch]$ForceToDeletePackageBeforeIfExist
)

# For Time checking
$MeasureCommandBegin = Get-Date           


$strCurDir = Split-Path -parent $MyInvocation.MyCommand.Path
$strScriptName = $MyInvocation.MyCommand.Name
$date_for_file = Get-Date -format "yyyy-MM-dd_HHmmss"


#Import the Module
Import-Module $env:SMS_ADMIN_UI_PATH.Replace("\bin\i386","\bin\configurationmanager.psd1")





# to do BEFORE cd ABC: sitecode
#
[ARRAY]$arrItems = @()
if ($ImportFilePath -ne "") {
    If ( (Test-Path -Path "$ImportFilePath") -eq $False ) {
        Write-host -ForegroundColor Red "file '$($ImportFilePath)' NOT exist. Please indicate real file path."
        cd $strCurDir
        Exit
    }

    Write-Host "Get '$($ImportFilePath)' content"
    $arrItems = Import-Csv $ImportFilePath -Delimiter ';'        #Import CSV into array
    Write-Host "Number of line: $($arrItems.Count)"
    if ($arrItems.Count -eq 0) {
        Write-host "file '$($ImportFilePath)' NO line. Please check It. Must have this header:" -ForegroundColor Red
        Write-host "DistributionPoint;PackageId"  -ForegroundColor Red
        cd $strCurDir
        Exit
    }
}



$Error.Clear()
if ($PrimarySiteCode) {
    Set-Location "$($PrimarySiteCode):\"
} else {
    $CMSITE = Get-PSDrive -PSProvider CMSITE    # multiple not work
    if ($CMSITE.GetType().Name -eq "Object[]") {
        $sitecodes = ""
        $CMSITE | ForEach-Object { $sitecodes = $_.Name + " " + $sitecodes }
        Write-Host "Please indicate Which Site Code to use in parameter 'PrimarySiteCode'. Choose using one of them: $sitecodes"

        Exit
    } else {
        Set-Location "$($CMSITE.Name):\"
    }
}
if ($Error) {
    $Error
    Write-Host "if not found can be necessary to do a 'Remove-Module ConfigurationManager' "
    cd $strCurDir
    Exit
}







if ($ImportFilePath -eq "") {
    if ($DistPoint -eq "" -or $Package -eq "") {
        Write-Host "You need at least Parameter 1 -DistPoint for 'Distribution Point' and -Package for package(s)"
        Write-Host "either -DistPoint for 'Distribution Point' and -Package for package(s)"
        Write-Host "either -ImportFilePath for path with all DistributionPoint;PackageId lines"
        cd $strCurDir
        Exit
    }

    $Query = "Select NALPath,Name From SMS_DistributionPointInfo Where ServerName Like '%$DistPoint%'"
    [Array] $arrDistributionPoint = @()
    $arrDistributionPoint = @(Get-WmiObject -Namespace "root\SMS\Site_$PrimarySiteCode" -Query $Query -ComputerName $CM)
    if($arrDistributionPoint.Count -ne 1) {       
        Foreach($DP in $arrDistributionPoint) {
            Write-host $DP.Name -ForegroundColor Yellow
        }
        Write-host "Found $($arrDistributionPoint.Count) matching Distribution Points. Please redefine query." -ForegroundColor Red
        cd $strCurDir
        Exit
    }
    else
    {
        $ServerNalPath = $arrDistributionPoint.NALPath -replace "([\[])",'[$1]' -replace "(\\)",'\$1'
        $DPname = $arrDistributionPoint.Name
        Write-Host "Distribution Point: $ServerNalPath"
    }
    Foreach ($pkg in $Package) {
        $item = New-Object –TypeNamePSObject
        $item | Add-Member –MemberTypeNoteProperty –Name DistributionPoint –Value $DPname
        $item | Add-Member –MemberTypeNoteProperty –Name PackageId –Value $pkg
        $arrItems += $item
    }


}

# Get all packages
#
Write-Host "Get all Packages"
[HashTable] $hashPackageType = @{}
$arrSMS_PackageBaseclass = @(Get-WmiObject -Namespace "root\SMS\Site_$PrimarySiteCode" -Class SMS_PackageBaseclass -ComputerName $CM)
Foreach ($SMS_PackageBaseclass in $arrSMS_PackageBaseclass) { 
    if ($hashPackageType.ContainsKey($SMS_PackageBaseclass.PackageID) ) {
        # Should not arrive problem in DB
    } else {
        $hashPackageType[$($SMS_PackageBaseclass.PackageID)] = $($SMS_PackageBaseclass.PackageType)
    }
}

[ARRAY] $arrCmdRemoveContent = @()
[ARRAY] $arrCmdAddContent = @()
[HashTable] $hashDPExist = @{}
[HashTable] $hashDPExistingPackages = @{}
$NbItemStay = $($arrItems.Count)
Foreach ($item in $arrItems) {

    Write-host "-----------------------"
    Write-host "Nb of items remaining: $($NbItemStay)"
    $NbItemStay = $NbItemStay -1
    $bError = $false


    $DistributionPoint = $item.DistributionPoint
    if ($DistributionPoint.length -eq 0) {
        Write-host "Value SiteServer $($DistributionPoint) NOT exist" -ForegroundColor Red
        $bError = $True
    } else {
        if ( $hashDPExist.ContainsKey($DistributionPoint) ){
            # OK already do some actions to verify it exist
        } else {

<#
            # DNS test
            Try {   
                $result = Resolve-DNSName -Name $DistributionPoint -Type A -ErrorAction Stop
                Write-host "SiteServer $($DistributionPoint) DNS OK"
                $hashDPExist[$DistributionPoint]= 1
            } Catch {
                Write-host "Cannot Resolve DNS for $($DistributionPoint) " -ForegroundColor Red
                $bError = $True
            }
#>

            $Query = "Select NALPath,Name From SMS_DistributionPointInfo Where ServerName Like '%$DistributionPoint%'"
            [Array]$arrDistributionPoint = @()
            $arrDistributionPoint = @(Get-WmiObject -Namespace "root\SMS\Site_$PrimarySiteCode" -Query $Query -ComputerName $CM)
            if($arrDistributionPoint.Count -ne 1) {       
                Foreach($DP in $arrDistributionPoint) {
                    Write-host $DP.Name -ForegroundColor Yellow
                }
                Write-host "Found $($arrDistributionPoint.Count) matching Distribution Points. Please redefine query." -ForegroundColor Red
                $bError = $True
            }
            else
            {
                $ServerNalPath = $arrDistributionPoint.NALPath -replace "([\[])",'[$1]' -replace "(\\)",'\$1'
                $DPname = $arrDistributionPoint.Name
                Write-Host "Distribution Point: $ServerNalPath"

                $hashDPExist[$DistributionPoint] = $DPname


                $Query = "Select PackageID From SMS_PackageStatusDistPointsSummarizer Where ServerNALPath Like '$ServerNALPath'"
                [ARRAY]$arrPackages = @()    # to be sure to count to be an array (else string not count work)
                $arrPackages = Get-WmiObject -Namespace "root\SMS\Site_$PrimarySiteCode" -Query $Query -ComputerName $CM
                Foreach ($pkg in $arrPackages) {
                    $hashline = $DPname + "_" + $pkg.PackageID
                    $hashDPExistingPackages[$hashline] = 1
                }

            }


        }
    }

    $PackageID = $item.PackageID
    if ($PackageID.length -eq 0) {
        Write-host "Value SiteServer $($DistributionPoint) NOT exist" -ForegroundColor Red
        $bError = $True
    } else {
        if ( ($PackageID.Substring(3,5) -eq "00003") -or ($PackageID.Substring(3,5) -eq "00008") ) {
            Write-host "Package $PackageID cannot be redistribute - it is hidden package"
            continue
        }
        if ( $hashPackageType.ContainsKey($PackageID) ) {
            # OK already do some actions to verify it exist
        } else {
            Write-host -ForegroundColor Red "Package $($PackageID) NOT exist"
            $bError = $True
        }
    }

    if ($bError) {
        Write-host "Error line $($item) - NOT DONE -" -ForegroundColor Red
        continue
    }




    $DPname = $hashDPExist[$DistributionPoint]
    $DPType = $hashPackageType[$PackageID]

    Write-Host  $DistributionPoint - $DPname - $PackageID - $DPType
    if (!$DPname -or !$PackageID) {
        Write-Host  "Error: DistributionPoint:$($DistributionPoint) - DPname:$($DPname) - PackageID:$($PackageID) - DPType:$($DPType)"
        continue
    }   

    $hashline = $DPname + "_" + $PackageID
    if ( ($hashDPExistingPackages.ContainsKey($hashline)) -and (!$ForceToDeletePackageBeforeIfExist) ) {
        #
        Write-Host " DP '$DPname' has already $PackageID - NOT Distribute it again - Use -Force to remove and add it"
        continue
    } else {
        $hashDPExistingPackages[$hashline] = 1

        $ContDistCmdParam = ""
            Switch ($DPType) {
            0 {
                $DPTypeValue = "Standard Package"
                $ContDistCmdParam = "-PackageID"
            }
            3 {
                $DPTypeValue = "Driver Package"
                $ContDistCmdParam = "-DriverPackageId"
            }
            4 {
                $DPTypeValue = "Task Sequence Package"
                $ContDistCmdParam = "-TaskSequenceId"
            }
            5 {
                $DPTypeValue = "Software Update Package"
                $ContDistCmdParam = "-DeploymentPackageId"
            }
            6 {
                $DPTypeValue = "Device Setting Package"
            }
            7 {
                $DPTypeValue = "Virtual App Package"
            }
            8 {
                $DPTypeValue = "Application Package"
                $ContDistCmdParam = "-ApplicationId"
            }
            257 {
                $DPTypeValue = "Operating system Image Package"
                $ContDistCmdParam = "-OperatingSystemImageId"
            }
            258 {
                $DPTypeValue = "Boot Image Package"
                $ContDistCmdParam = "-BootImageId"
            }
            259 {
                $DPTypeValue = "Operating System Upgrade Package"
                $ContDistCmdParam = "-OperatingSystemInstallerId"
            }
            260 {
                $DPTypeValue = "VHD package"
                Write-Host "Distribute '$DPTypeValue' to DP '$DPname'"
            }
        } # switch end


        if ($ContDistCmdParam) {
            if ($ForceToDeletePackageBeforeIfExist) {
                Write-Host "Force: Remove $PackageID '$DPTypeValue' from DP '$DPname'"
                $cmd = "Remove-CMContentDistribution $ContDistCmdParam $PackageID -DistributionPointName $DPname -Force"
                $arrCmdRemoveContent += $cmd
                #Invoke-Expression $cmd
                #Write-Host "Wait 15 sec"
                #Start-Sleep -s 15
            }

            Write-Host "Distribute $PackageID '$DPTypeValue' to DP '$DPname'"
            $cmd = "Start-CMContentDistribution $ContDistCmdParam $PackageID -DistributionPointName $DPname"
            $arrCmdAddContent += $cmd
            #Invoke-Expression $cmd

        } else {
            Write-Host "NOT Distribute $PackageID '$DPTypeValue' to DP '$DPname'"
        }

    }
}

Foreach ($cmd in $arrCmdRemoveContent) {
    Write-Host $cmd
    Invoke-Expression $cmd
}

Write-Host "Wait 15 sec"
Start-Sleep -s 15

Foreach ($cmd in $arrCmdAddContent) {
    Write-Host $cmd
    Invoke-Expression $cmd
}


cd $strCurDir



$MeasureCommandEnd = Get-Date
$MeasureCommandTime = $MeasureCommandEnd - $MeasureCommandBegin
Write-host "Script Executing in $($MeasureCommandTime.Day) day(s) $($MeasureCommandTime.Hour) hour(s) $($MeasureCommandTime.Minutes) minute(s) $($MeasureCommandTime.Seconds) second(s) "



Thursday, January 10, 2019

SCCM - Package Distribution: identify, enumerate and resolve 'in progress' status

For direct solution  go to the end of this article

A common problem in SCCM is Package 'in progress' in some Distribution Points

Here some of errors we can find and that never been distributed

"2335" = "Distribution Manager instructed Scheduler and Sender to send package "PRI00123" to child site "SEC".






"2372","The content files for package "PRI00123" have not yet arrived from the source site PRI. Distribution Manager will try again later to distribute the content."






"2380","Start to evaluate package "PRI00123" on distribution point "["Display=\\MYCOMPUTER.mydom.net\"]MSWNET:["SMS_SITE=PRI"]\\MYCOMPUTER.mydom.net\"




"30010","User "MYDOM\myuser" modified a distribution point on \\MYPULLDP.mydom.net at site "SEC - MyCompany - SEC Secondary Site" for a package with package ID PRI00123."
"Informational"








As you can see below in \Monitoring\Overview\Distribution Status\Content Status in this "Software Update Package" example, a lot of targeted are "pending"











Here we can see there is 2315 targeted Distribution Point and 219 pending since at least 5 days


Solution 1
You try to redistribute a package  (manually it is  "\Administration\Overview\Site Configuration\Servers and Site System Roles" then in "Distribution Point" properties then in tab "content". Select package then click on button redistribute )
-> here in my example that failed for these 219 servers (sure I use a script to do it)

Solution 2
You try to "Update Distribution Points" with create a new version for your package (manually for Software Updates it is in \Software Library\Overview\Software Updates\Deployment Packages, right button "Update Distribution Points, same thing for package or any other content)
-> here in my example that failed for these 219 servers

Solution3
You delete Package from your Distribution Point, then after waiting some minutes you "Distribute Content"  on the same DP
-> here in my example that work



Things is I surely have other package for some Distribution Point with same problem.

So I decide to find how to find them. Are you ready ?

 I first try to find in SQL some related table



I found DistributionJobs table could be a good table
but when I try my query on my Secondary I finally see number found does correspond to this problem:

"2357","Distribution Manager instructed Package Transfer manager to send package "PRI00233" to distribution point "["Display=\\MYCOMPUTER.mydom.net\"]MSWNET:["SMS_SITE=PRI"]\\MYCOMPUTER.mydom.net\" ." 
and these Distribution Points found in this query seems just works




Below query to find number of DistributionJobs for a package:
Select count(*)
From [DistributionJobs] as DJ
JOIN [DistributionPoints] as DP
ON DJ.DPID = DP.DPID
WHERE PkgID = 'PRI00233'



















For information to see DP name use for example (here secondary XXH have 2 rows with same message):
Select DP.ServerName, DJ.*
From [DistributionJobs] as DJ
JOIN [DistributionPoints] as DP
ON DJ.DPID = DP.DPID
WHERE PkgID = 'PRI00233'

















Then I found a Microsoft Article Understanding and Troubleshooting Content Distribution in Microsoft Configuration Manager https://support.microsoft.com/en-ae/help/4000401/content-distribution-in-mcm
in Useful query with a view
-- All Package/DPs in InProgress state for more than 3 days
SELECT distinct DPSD.DPName, DPSD.PackageID, SP.Name, DPSD.MessageState, DPSD.LastStatusTime, DPSD.SiteCode
FROM vSMS_DPStatusDetails DPSD
JOIN SMSPackages_All SP ON DPSD.PackageID = SP.PkgID
WHERE DPSD.LastStatusTime > DATEAdd(dd,-3,GETDate()) 
AND MessageState = 2 


and another interesting article with table https://blogs.technet.microsoft.com/umairkhan/2014/10/02/the-case-of-the-unexplained-the-package-gets-distributed-successfully-but-does-not-show-in-the-console/
select * from PkgServers_G where pkgid = 'PRI00233'
select * from ContentDistributionNotification where pkgid = 'PRI00233'
select * from ContentDistribution where pkgid = 'PRI00233'




So as you can see in my example table ContentDistributionNotification is OK

SELECT count(*)
FROM [ContentDistributionNotification]
WHERE PkgID = 'PRI00233'

 (No column name)
2315













Table ContentDistribution is OK too in my example


SELECT count(*)
FROM ContentDistribution
WHERE PkgID = 'PRI00233'

(No column name)
2315















Table PkgServers is OK too in my example

SELECT *
FROM PkgServers_G
WHERE PkgID = 'PRI00233'















Table PkgStatus has not same number BUT perhaps it is normal

SELECT count(*) FROM PkgStatus_G as PKGS
JOIN DistributionPoints as DP ON PKGS.PkgServer = DP.NALPath
WHERE ID = 'PRI00233'

(No column name)
2095--
















GOOD CATCH
Try testing some Distribution Points  I see computer NOT in PkgStatus_G table are those with problems


For example we can see below %17% computer displayed in  PkgStatus_G and not %36%

here %36%  Distribution Point is 'in progress'

 here %17%  Distribution Point is 'Success'























So now I give you SQL Query to find ALL Distribution Points with this problem




-- Find Distribution Point 'in progress' with problems
-- by F.RICHARD 2019-01

-- Declare the variables to store the values returned by FETCH. 
DECLARE @PackageID varchar(50); 
DECLARE @tblResult TABLE (PackageID varchar(50), ServerName varchar(255), SiteCode varchar(10));

DECLARE PackageID_cursor CURSOR FOR 
    SELECT DISTINCT PackageId
    FROM vSMS_DPStatusDetails DPSD
    JOIN SMSPackages_All SP ON DPSD.PackageID = SP.PkgID
    WHERE 1=1
        AND DPSD.LastStatusTime < DATEAdd(dd,-3,GETDate())
        AND MessageState = 2




OPEN PackageID_cursor; 
FETCH NEXT FROM PackageID_cursor INTO @PackageID
WHILE @@FETCH_STATUS = 0 
BEGIN 
        print @PackageID



        -- create temp table after drop
        if(OBJECT_ID('tempdb..#TempPkgStatusServerName') Is Not Null)
        Begin
            Drop Table #TempPkgStatusServerName
        End
        CREATE TABLE #TempPkgStatusServerName
        (
            PkgServer Varchar(255)
            ,ServerName Varchar(255)
            ,PkgID varchar(50)
        );

        -- insert data
        INSERT INTO #TempPkgStatusServerName
        SELECT PkgServer
            ,ServerName =
            CASE
                WHEN CHARINDEX('\\', Pkgserver) > 0
                    THEN SUBSTRING(Pkgserver, CHARINDEX('\\', Pkgserver) + 2, CHARINDEX('"]', Pkgserver) - CHARINDEX('\\', Pkgserver) - 3 )
            ELSE
                Pkgserver
            END
            ,ID
        FROM PkgStatus
        WHERE 1=1
        AND ID = @PackageID

        INSERT @tblResult
                SELECT
                PackageID, DPSD.DPName, DPSD.SiteCode
                FROM vSMS_DPStatusDetails DPSD
                JOIN SMSPackages_All SP ON DPSD.PackageID = SP.PkgID
                WHERE 1=1
                    AND DPSD.LastStatusTime < DATEAdd(dd,-3,GETDate())
                    AND MessageState = 2
                    AND PackageID = @PackageID

                AND DPSD.DPName NOT IN
                (
                SELECT TMPTABLE.ServerName FROM #TempPkgStatusServerName as TMPTABLE
                )

        -- drop temp table
        Drop Table #TempPkgStatusServerName

        -- next data
        FETCH NEXT FROM PackageID_cursor INTO @PackageID
END

CLOSE PackageID_cursor;
DEALLOCATE PackageID_cursor;

SELECT PackageID, ServerName, SiteCode FROM @tblResult






















And as I am really a nice guy I give the same in powershell
below

<#
.Synopsis
   SCCM_Get-Problematic-SMS_PackageStatus.ps1

.EXAMPLE
   .\SCCM_Get-Problematic-SMS_PackageStatus.ps1

.NOTES
  Version:        1.0
  Author:        Franck RICHARD
  Creation Date:    2019-01
  Purpose/Change:

#>
[cmdletbinding()]
Param(
     [String]$CM="mycm.mydomain.net"
    ,[String]$PrimarySiteCode="XXX"
)


# *************************

# For Time checking
$MeasureCommandBegin = Get-Date           


$strCurDir = Split-Path -parent $MyInvocation.MyCommand.Path
$strScriptName = $MyInvocation.MyCommand.Name
$date_for_file = Get-Date -format "yyyy-MM-dd_HHmmss"

$strSaveFile = $strCurDir + "\" + $date_for_file + "_" + $Hostname + "_" + $strScriptName.replace(".ps1",".csv")




# Get all packages
#
Write-Host "Get all Packages"
[HashTable] $hashPackageByPackageID = @{}
$arrSMS_PackageBaseclass = @(Get-WmiObject -Namespace "root\SMS\Site_$PrimarySiteCode" -Class SMS_PackageBaseclass -ComputerName $CM)
Foreach ($SMS_PackageBaseclass in $arrSMS_PackageBaseclass) { 
    if (!$hashPackageByPackageID.ContainsKey($SMS_PackageBaseclass.PackageID) ) {
        $hashPackageByPackageID[$($SMS_PackageBaseclass.PackageID)] = $SMS_PackageBaseclass
    }
}
Write-Host "Nb Package : $($hashPackageByPackageID.count)"



# Date Min = date LastStatusTime
#
$Nbdays = 3
$DateMin =  (Get-date).AddDays(-$Nbdays)



# Get all SMS_DPStatusDetails 'in progress'
#
Write-Host "Get all SMS_DPStatusDetails 'in progress' "
$Query = @"
SELECT * FROM SMS_DPStatusDetails as DPS
WHERE DPS.MessageState='2'
AND DPS.LastStatusTime <= '$DateMin' 
AND DPS.PackageID <> ''
"@
$arrSMS_DPStatusDetails = Get-WmiObject -Namespace "root\SMS\Site_$PrimarySiteCode"  -ComputerName $CM -Query $Query
Write-Host "Nb SMS_DPStatusDetails 'in progress' > $Nbdays days: $($arrSMS_DPStatusDetails.count)"




# Get Distinct PackageID 'in progress'
#
Write-Host "Get Distinct PackageID 'in progress' "
[HashTable] $hashDistinctPackageID = @{}
Foreach ($SMS_DPStatusDetails in $arrSMS_DPStatusDetails) { 
    if ($hashPackageByPackageID.ContainsKey($SMS_DPStatusDetails.PackageID) ) {           
        if (!$hashDistinctPackageID.ContainsKey($SMS_DPStatusDetails.PackageID) ) {
            $hashDistinctPackageID[$($SMS_DPStatusDetails.PackageID)] = 1       
        }
    }
}
Write-Host "Nb Distinct PackageID : $($hashDistinctPackageID.count)"


# For each PackageID  we get
#
[ARRAY] $arrInfos=@()
Foreach ($PackageID in $hashDistinctPackageID.Keys) {
        $SMS_PackageBaseclass = $hashPackageByPackageID[$($PackageID)]
        Write-Host "-> Check PackageID $PackageID 'in progress' ($($SMS_PackageBaseclass.Name))"


        # Get All SMS_PackageStatus for $PackageID
        #
        Write-Host "Get All SMS_PackageStatus for $($PackageID)  "
        [HashTable] $hashPackageIDByPkgServer = @{}
        #$Query = @"
        #SELECT * FROM SMS_PackageStatus WHERE PackageID='$PackageID'
        #"@
        #$Query = @"
        $Query = "SELECT PkgServer FROM SMS_PackageStatus WHERE PackageID='$PackageID'"
        #"@
        $arrSMS_PackageStatus = Get-WmiObject -Namespace "root\SMS\Site_$PrimarySiteCode"  -ComputerName $CM  -Query $Query
        Foreach ($SMS_PackageStatus in $arrSMS_PackageStatus) { 
            $ServerNALPath = $SMS_PackageStatus.PkgServer
            # ex: ["Display=\\MYCOMPUTER.mydom.net\"]MSWNET:["SMS_SITE=XXX"]\\MYCOMPUTER.mydom.net\
            # -> MYCOMPUTER.mydom.net
            $PkgServer = $ServerNALPath.Substring($ServerNALPath.LastIndexOf("]")+3).Trim("\")

            if (!$hashPackageIDByPkgServer.ContainsKey($PkgServer) ) {
                $hashPackageIDByPkgServer[$($PkgServer)] = 1        # $SMS_PackageStatus.PackageID
            }
        }

        # Check if exist in SMS_DPStatusDetails but NOT in SMS_PackageStatus
        #
        Write-Host "Check if exist in SMS_DPStatusDetails but NOT in SMS_PackageStatus for $($PackageID) "
        Foreach ($SMS_DPStatusDetails in $arrSMS_DPStatusDetails) { 
            if ($SMS_DPStatusDetails.PackageID -eq $PackageID) {
                if ($hashPackageByPackageID.ContainsKey($SMS_DPStatusDetails.PackageID) ) {
                    if (!$hashPackageIDByPkgServer.ContainsKey($SMS_DPStatusDetails.DPName) ) {
                        $custObj = New-Object -TypeName psobject
                        $custObj | Add-Member -MemberType NoteProperty -Name PackageID -Value $SMS_DPStatusDetails.PackageID
                        $custObj | Add-Member -MemberType NoteProperty -Name DistributionPoint -Value $SMS_DPStatusDetails.DPName
                        $custObj | Add-Member -MemberType NoteProperty -Name SiteCode -Value $SMS_DPStatusDetails.SiteCode

                        $arrInfos += $custObj
                    }
                }
            }
        }

}



Write-Host "Write file with all package informations"
$arrInfos | Export-Csv -NoType -Path $strSaveFile -Delimiter ";"
#$strContent | Out-File -FilePath  "$strSaveFile


$MeasureCommandEnd = Get-Date
$MeasureCommandTime = $MeasureCommandEnd - $MeasureCommandBegin
Write-host "Script Executing in $($MeasureCommandTime.Day) day(s) $($MeasureCommandTime.Hour) hour(s) $($MeasureCommandTime.Minutes) minute(s) $($MeasureCommandTime.Seconds) second(s) "





[EDIT 2019-01-21]

Please here SCCM_AddPackageToDP.ps1 (https://franckrichard.blogspot.com/2019/01/sccm-powershell-script-to-add-package.html) powershell solution to remove and add content and resolve this problem


.\SCCM_AddPackageToDP.ps1 -CM mycm.mydomain.net -PrimarySiteCode XXX -ForceToDeletePackageBeforeIfExist -ImportFilePath file_generated_by_SCCM_Get-Problematic-SMS_PackageStatus.csv



Monday, January 7, 2019

Update Pack Installation Status - Detailed status for Configuration Manager 1810

When you update to 1810 below Detailed status for Configuration Manager 1810 below:

How to update in 1810:
\Administration\Overview\Updates and Servicing
right click on "Configuration Manager 1810" then "Install Update Pack"

Warning: don't forget to upgrade sql server native client before if it is not already done:
https://blogs.technet.microsoft.com/arnabm/2018/11/28/sql-server-native-client-update-warning-prerequisite-for-configmgr-1810/


Download
Process update package            
[Completed]:Processing update package. Check dmpdownloader.log for details.
Download update package cab file    
[Not started]:If your service connection point is online, the update package cab is downloaded. If your service connection point is offline, this step is skipped. Check dmpdownloader.log for details.
Extract update package payload       
[Not started]:Extracting update package payload. Check dmpdownloader.log for details.
Download redist            
[Not started]:If redistributable files are required and not included with the update, they are downloaded.  If files do not need to be downloaded, this step is skipped. Check dmpdownloader.log and ConfigMgrSetup.log for details.
Report Package as downloaded       
[Completed]:The update package has been reported as downloaded. Check dmpdownloader.log and hman.log for details.














































Replication
Create or update software distribution package   
[Completed]:Creating or updating Configuration Manager Update Package. Check hman.log for details.
Update content library           
[Completed]:Saving the content into content library on the site server. Check distmgr.log for details.












































Prerequisite Check
SQL Server Native Client Version   
[Completed]:Verifies that the version of Microsoft SQL Server Native Client installed on the site server meets the minimum requirements to enable TLS 1.2 support.
SQL Server Configuration for site upgrde   
[Completed]:Checks if the specified SQL Server meets the minimum requirements for site upgrade.
Potential SQL server performance issue caused by change tracking retention period
[Completed]:Checks if the specified SQL Server meets the minimum requirements for site upgrade.
Administrative rights on site system
[Completed]:Verifies that the logged on user account has administrative rights on the site system computer.
Administrative rights on central administration site
[Completed]:Verifies that the user running Setup has local administrator rights on the central administration site server.
Connection to SQL Server on the central administration site
[Completed]:Checks if the user account running Setup has sysadmin rights on the SQL Server for the CAS.
Check Server Service is running
[Completed]:Check Server Service (LanmanServer) is running.
Domain membership
[Completed]:Verifies that the computer specified for installation is a member of a Windows domain.
Active Directory domain Functional level Check
[Completed]:Verify that the Active Directory domain functional level is Windows Server 2003 or later.
Free disk space on site server
[Completed]:Checks that the site server computer has sufficient available disk space to install the site server.
Pending system restart
[Completed]:Checks if a system restart is pending.
Read-Only Domain Controller
[Completed]:Checking unsupported Read-Only Domain Controller on site server.
Site Server FQDN Length.
[Completed]:Checking Site Server FQDN Length.
Microsoft XML Core Services 6.0 (MSXML60)
[Completed]:Verifies that the Microsoft Core XML Services (MSXML) version 6.0 or later libraries are installed.
Windows Server 2003-based schannel hotfix
[Completed]:Determines if the Windows Server 2003-based schannel hotfix is installed on the site server.
 Microsoft Remote Differential Compression (RDC) library registered
[Completed]:Verifies that the Microsoft Remote Differential Compression (RDC) library is registered on the computer specified for Configuration Manager site server installation.
Microsoft Windows Installer
[Completed]:Checking Windows Installer Version >= 4.5.
Existing Configuration Manager server components on site server
[Completed]:Checks if the target site server computer already has existing Configuration Manager server components installed.
Firewall exception for SQL Server
[Completed]:Checks if the Windows Firewall is disabled or if a relevant Windows Firewall exception exists for SQL Server.
Firewall exception for SQL Server (stand-alone primary site)
[Completed]:Checks if the Windows Firewall is disabled or if a relevant Windows Firewall exception exists for SQL Server.
SQL Server service running account.
[Completed]:Check SQL Server service running account.
Dedicated SQL Server instance
[Completed]:Check to see if the selected SQL Server instance is already in use by another Configuration Manager site
Parent/child database collation
[Completed]:Verifies that the site server's database collation matches the database collation of its parent site.
Minimum .NET Framework version for Configuration Manager site server
[Completed]:Verifies that the Microsoft .NET Framework version 3.5 is installed on Configuration Manager central administration site servers, primary site servers, and secondary site servers.
Windows Deployment Tools installed
[Completed]:Checks whether the Windows Deployment Tools component of Windows Assessment and Deployment Kit (ADK) for Windows 10 is installed.
User State Migration Tool (USMT) installed
[Completed]:Checks whether the User State Migration Tool (USMT) component of Windows Assessment and Deployment Kit (ADK) for Windows 10 is installed.
Primary FQDN
[Completed]:Checks if the FQDN provided for the site system uses the primary DNS hostname for the computer.
Site code in use
[Completed]:Checks if the specified site code is already in use by another site in your hierarchy.
Verify Central Administration Site Version
[Completed]:Check the parent Central Administration Site has the same version.
Required SQL Server collation
[Completed]:Verifies that the SQL Server instance and Configuration Manager site database (if present) are configured to use a supported collation.
Backlogged inboxes
[Completed]:Verifies that the site server is processing critical inboxes in a timely fashion, and that inboxes do not contain files older than one day.
Distribution point package version
[Completed]:Verifies that all distribution points in the site have the latest version of software distribution packages.
SQL Server database collation
[Completed]:Verifies that the SQL Server database collation settings of the tempdb database and site database to be upgraded are the same.
Share Name in Package
[Completed]:Share Name in Package has invalid character: #.
Software update points in NLB Configuration
[Completed]:Verifies that SUM is not using any virtual locations for active SUPs.
Migration active source hierarchy
[Completed]:Verifies that no active source hierarchy is currently configured for migration.
Unsupported upgrade path
[Completed]:Verifies that all site servers in the hierarchy meet the Configuration Manager minimum version that is required for upgrade
Active MP Replica
[Completed]:No Active MP Replica detected
Parent site replication status
[Completed]:Verifies that the replication status of the parent site is Replication Active (corresponds to status=125).
Unsupported system role 'Out of band service point'
[Completed]:Checking that the site system role 'Out of band service point' is not deployed.
System Health Validation site system role is no longer supported
[Completed]:Checking whether the site system role 'System Health Validator' exists in the hierarchy.
Network Access Protection (NAP) is no longer supported
[Completed]:Checking whether there are software updates that are enabled for NAP
Verify database consistency
[Completed]:Pre-requisite rule to verify database consistency
SQL Server sysadmin rights
[Completed]:Verifies that the user account running Configuration Manager Setup has been granted sysadmin SQL Server role permissions on the SQL Server instance selected for site database installation. SQL Server sysadmin role permissions are required in order to create the site database and configure necessary database role and login permissions for Configuration Manager sites.
SQL Server sysadmin rights for reference site
[Completed]:Verifies that the user account running Configuration Manager Setup has been granted sysadmin SQL Server role permissions on the SQL Server instance selected for reference site database installation. SQL Server sysadmin role permissions are required in order to modify the site database.
Site server compute administrative right
[Completed]:Verifies that the site server computer account has administrative rights on the SQL Server and management point.
SQL Server version
[Completed]:Verifies that the version of Microsoft SQL Server installed on the computer selected to host the site database meets the minimum requirements.
SQL Server Edition
[Completed]:Checking the site SQL Server is not Express Edition.
SQL Server Tcp Port
[Completed]:Checking the site SQL Server Tcp is enabled and set to Static port.
Case-insensitive collation on SQL Server
[Completed]:Checks if the SQL Server hosting the Configuration Manager site database is using a case-insensitive collation.
Validate FQDN of SQL Server
[Completed]:Check that the specified FQDN for the SQL Server computer is valid.
Windows Preinstallation Environment installed
[Completed]:Checks whether the Windows Preinstallation Environment component of Windows Assessment and Deployment Kit (ADK) for Windows 10 is installed.
SMS Provider machine has same domain as site server
[Completed]:Checks if SMS Provider machine has same domain as site server.
Custom Client Agent Settings have NAP enabled
[Completed]:Checking whether there are custom Client Agent Settings that enable NAP
Default Client Agent Settings have NAP enabled
[Completed]:Checking whether the default Client Agent Settings enable NAP
SQL availability group configured for readable secondaries
[Completed]:Checking secondary read state of availability group replicas
SQL availability group configured for manual failover
[Completed]:Checking failover state of availability group replicas
SQL availability group replicas on default instance
[Completed]:Checking availability group replicas for instance configuration
SQL Index Create Memory option
[Completed]:Checks if default value is set for SQL Index Create Memory
SQL Server  supported version
[Completed]:Starting with version 1702, Configuration Manager does not support SQL Server 2008 R2. https://go.microsoft.com/fwlink/?linkid=841654. This check verifies that the version of Microsoft SQL Server installed on the computer selected to host the site database meets the minimum requirements of SQL Server 2012 with SP2.
Software Update Points using a Load Balancer (NLB/HLB) is no longer supported
[Completed]:Starting with version 1702, Configuration Manager does not support Software Update Points on Loadbalancers (NLB/HLB).
Upgrade Assessment Toolkit is no longer supported
[Completed]:Starting with version 1706, Upgrade Assessment Toolkit is no longer supported. https://go.microsoft.com/fwlink/?linkid=841654
Unsupported site server operating system version for Setup
[Completed]:Verifies that the site server operating system meets the minimum requirement for site server installation. https://go.microsoft.com/fwlink/?linkid=841654
Unsupported operating system version for site system role
[Completed]:Verifies that the site system to be upgraded meets the minimum operating system requirement for site system installation. https://go.microsoft.com/fwlink/?linkid=841654
Using HTTP management point with cloud management gateway is not supported
[Completed]:Checking if HTTP management point is enabled for cloud management gateway
SQL Server Always On availability groups
[Completed]:Checks if the specified SQL Server meets the minimum requirements to host an Always On availability group. https://go.microsoft.com/fwlink/?linkid=873403
Max Text Repl Size for SQL Server Always On availability groups
[Completed]:Checks if the max text repl size for the specified SQL Server is configured properly. https://go.microsoft.com/fwlink/?linkid=873403
Pending configuration item policy updates
[Completed]:Checks if there are many pending configuration item policy updates. https://go.microsoft.com/fwlink/?linkid=2006830
SQL Server Configuration for site upgrade
[Completed]:Checks if the specified SQL Server meets the minimum requirements for site upgrade.
SQL Server Native Client version
[Completed]:Verifies that the version of Microsoft SQL Server Native Client installed on the site server meets the minimum requirements to enable TLS 1.2 support. https://go.microsoft.com/fwlink/?linkid=2026746
Potential SQL server performance issue caused by change tracking retention period
[Completed]:The site database has a backlog of SQL change tracking data. For more information, see https://go.microsoft.com/fwlink/?linkid=2027576









































Installation
Check Site Server readiness
[Completed]:Checking if Site Server is ready to apply the update. Check hman.log for details.
Stop CONFIGURATION_MANAGER_UPDATE service
[Completed]:Stopping CONFIGURATION_MANAGER_UPDATE service. Check hman.log for details.
Update CONFIGURATION_MANAGER_UPDATE service
[Completed]:Updating CONFIGURATION_MANAGER_UPDATE service. Check hman.log for details.
Start CONFIGURATION_MANAGER_UPDATE service
[Completed]:Starting CONFIGURATION_MANAGER_UPDATE service. Check hman.log for details.
Extract Update package
[Completed]:Extracting update package from content library on site server. Check cmupdate.log for details.
Validate redistributable
[Completed]:Validating redistributable files. Check cmupdate.log for details.
Check site readiness
[Completed]:Checking if CONFIGURATION_MANAGER_UPDATE service is updated. Check hman.log and cmupdate.log for details.
Check Service Window
[Completed]:Checking if update is allowed to be applied. Check cmupdate.log for details.
Turn off SQL Server Service Broker
[Completed]:Turning off SQL Server Service Broker. Check cmupdate.log for details
Stop ConfigMgr services
[Completed]:Stopping ConfigMgr services. Check cmupdate.log for details.
Unload WMI provider
[Completed]:Unloading WMI provider. Check cmupdate.log for details.
Delete SMSDBMON triggers
[Completed]:Deleting SMSDBMON triggers. Check cmupdate.log for details.
Save site control settings
[Completed]:Saving site control settings. Check cmupdate.log for details.
Upgrade ConfigMgr database
[Completed]:Upgrading ConfigMgr database. Check cmupdate.log for details.
Update SQL registry
[Completed]:Updating SQL Server’s registry. Check cmupdate.log for details.
Update RCM registry
[Completed]:Updating RCM registry. Check cmupdate.log for details.
Install files
[Completed]:Installing files required for the update. Check cmupdate.log for details.
Install language pack
[Completed]:Installing required language pack(s). Check cmupdate.log for details.
Install component
[Completed]:Installing required components. Check cmupdate.log for details.
Install controls
[Completed]:Installing required controls. Check cmupdate.log for details.
Upgrade site control settings
[Completed]:Upgrading site control settings. Check cmupdate.log for details.
Configure SQL Server Service Broker
[Completed]:Configuring SQL Server Service Broker. Check cmupdate.log for details.
Installing ConfigMgr configurations
[Completed]:Installing required ConfigMgr configurations. Check cmupdate.log for details.
Start WMI
[Completed]:Starting WMI provider. Check cmupdate.log for details.
Install services
[Completed]:Installing required services. Check cmupdate.log for details.
Update Sites table
[Completed]:Updating Sites table. Check cmupdate.log for details.
Update Admin Console binaries
[Completed]:Updating Admin Console binaries. Check cmupdate.log for details.
Turn on SQL Server Service Broker
[Completed]:Turning on activation of SQL Server Service Broker queues. Check cmupdate.log for details.







































Post Installation
Installing SMS_EXECUTIVE service
[Completed]:Installing SMS_EXECUTIVE service on Site Server. Check sitecomp.log for details.
Installing SMS_DATABASE_NOTIFICATION_MONITOR componen
[Completed]:Installing SMS_DATABASE_NOTIFICATION_MONITOR component on Site Server. Check sitecomp.log and smsexec.log for details.
Installing SMS_HIERARCHY_MANAGER component
[Completed]:Installing SMS_HIERARCHY_MANAGER component on Site Server. Check sitecomp.log and smsexec.log for details.
Installing SMS_REPLICATION_CONFIGURATION_MONITOR component
[Completed]:Installing SMS_REPLICATION_CONFIGURATION_MONITOR component on Site Server. Check sitecomp.log and smsexec.log for details.
Monitoring replication initialization
[Completed]:Monitoring database replication initialization. Check cmupdate.log and rcmctrl.log for details.
Updating Configuration Manager Client Preproduction Package
[Completed]:Updating StagingClient folder used by Configuration Manager Client Preproduction Package. Check hman.log for details.
Updating Client folder on Site Server
[Completed]:Updating Client folder on the Site Server from the installed Configuration Manager Update Package. Check hman.log for details.
Updating Configuration Manager Client Package
[Completed]:Updating Client folder used by Configuration Manager Client Package. Check hman.log for details.
Turning on Features
[Completed]:Turning on Features. Please reopen ConfigMgr Console to see the new features. Check hman.log for details.