Back to Basics – ConfigMgr Distribution Points and Boundaries

Per request from a fellow tweep, here is crash course in ConfigMgr Distribution Points, Boundaries, and Boundary Groups.

Distribution Points

In ConfigMgr environments, the Distribution Points, or DPs, are simply there to store packages that client connects to for downloading software like applications, software updates, and OS deployment images etc.. To make sure clients are connected to the best DP, the one closest to the clients, boundaries are boundary groups are used.

Boundaries and Boundary Groups

Boundary Groups are a way to assign resources to clients, for example which DP, or Management Point (MP), or Software Update Point (SUP) to use. Boundary Groups can also be used to assign a client to the correct ConfigMgr site, even though most environments should only have a single primary site.

Anyway, ConfigMgr supports a variety of ways to put clients in a boundary, where the by far best method is to use IP ranges. Other methods (that I don't recommend) are IP subnets, and Active Directory sites. For example, if you have a subnet in New York, that is a subnet, I recommend that you create an IP range boundary of – 192.1698.1.254, assign it to a boundary group named New York, and configure it use a DP in New York.

IP Ranges for New York and Chicago.

Avoid Overlapping Boundaries

One of the most common reason for "weird things happening" in ConfigMgr is when there are overlapping boundaries, or when clients are members of multiple boundary groups, so just simply avoid that. My old football coach used to say KISS, Keep It Simple Stupid, and that goes a long way for ConfigMgr boundaries as well.

Reducing the number of Distribution Points

These days you want to try to reduce the number of DPs and use more peer to peer instead (DO, Peer Cache, and BranchCache). It's simply more efficient using hardware that is already out there, instead of managing yet another server.

Verifying Boundaries

A quick way to verify if clients are using the right Boundary Group, is to enable hardware inventory for the Boundary Group Cache (\\Computername\Root\CCM\LocationServices), and take a look every now and then in the v_GS_BOUNDARYGROUPCACHE view in SQL using the below query:

Select sys.Name0, gs.BoundaryGroupIDs0, ws.LastHWScan from v_GS_BOUNDARYGROUPCACHE as gs
Inner Join v_R_System as sys ON gs.ResourceID = sys.ResourceID
Inner join v_GS_WORKSTATION_STATUS as ws on ws.ResourceID=sys.ResourceID
Adding the BoundaryGroupCache inventory class.
The v_GS_BOUNDARYGROUPCACHE view together with info about the last HW scan.

Another option is to simply ask the client directly using the below PowerShell code, and then collect the result on the server side as described in the A Holistic Approach to ConfigMgr Client Health blog post.

(Get-WmiObject -NameSpace Root\CCM\locationservices -Class boundarygroupcache).BoundaryGroupIDs

Verifying Distribution Points

A quick way to figure out which DP a client has been using is to parse the ContentTransferManager.log on the client with a bit of PowerShell, and then upload that info to a summary report. For example, I recently used this for a customer to figure out that clients in Argentina, was using a DP in Europe due to incorrect boundaries.

# Get Last Used DP
$searchtext = " successfully processed download completion."
$file = "c:\Windows\CCM\Logs\ContentTransferManager.log"
if (Test-Path $file){
    if (Get-Content $file | Select-String -Pattern $searchtext -Quiet){
        $StrResult = (Get-Content $file | Select-String -Pattern $searchtext | Select-Object -Last 1).ToString()
            $LastCTMid = $StrResult.SubString(1,$StrResult.IndexOf('}')) | ForEach-Object{$_.Replace($_.SubString(0,$_.IndexOf('{')),'')}
        $searchtext2 = "CTM job $LastCTMid switched to location "
        $StrResult2 = ""
        $StrResult2 = (Get-Content $file | Select-String -Pattern $searchtext2 -SimpleMatch | Select-Object -Last 1)
            $StrResult2 = $StrResult2.ToString()
            $LastDP = $StrResult2.Split('/')[2]}
            $searchtext3 = "CTM job $LastCTMid (corresponding DTS job {"
            $StrResult3 = ""
            $StrResult3 = (Get-Content $file | Select-String -Pattern $searchtext3 -SimpleMatch | Select-Object -Last 1)
                $StrResult3 = $StrResult3.ToString()
                $LastDP = $StrResult3.Split('/')[2]
Asking a client for the last used DP.
About the author

Johan Arwidmark

5 1 vote
Article Rating
Notify of
Oldest Most Voted
Inline Feedbacks
View all comments
1 year ago

Hi Johan, On the subjects of DPs and boundaries let me throw in another variable – secondary sites. So I know they kind of suck and should be avoided but can you confirm my understanding here? I'm led to believe and have always advised people that the secondary site server has to be in the boundary group of any clients using the MP of secondary site. That's obviously counter-intuitive as normally you don't assign an MP that way but that's how I understand it and what I've been told. Am I correct in my understanding? If I am correct then… Read more »

Dietmar Haimann
1 year ago

Hi! Thanks for this post! I hope I may ask some questions? 🙂 We use a site assignment (SA) boundary group with an AD site boundary and a content location (CL) boundary group with some of the ip ranges in the closer environment. To meet our needs we use ~150 Windows 10 LTSC based client distribution points in our (very small) branches. BranchCache will never work within these locations. So we configured boundaries for every branch (ip ranges) and a corresponding boundary group referenced with one client dp which is located on site. What do you recommend to set on… Read more »

Dietmar Haimann
1 year ago

BranchCache needs three or four clients involved to work I think? If all the clients within a branch start to install SU e.g. no one will use the BranchCache. Am I wrong? What do you think about the settings on Relationship?