Set default download behavior for BITS jobs on costed networks
Verified with Windows 11 25H2 — updated on July 30, 2026
Supported on: Windows 8 or Windows Server 2012 or Windows RT or computers with BITS 5 installed.
Path in the GPO console
Computer Configuration\Administrative Templates\Network\Background Intelligent Transfer Service (BITS) Description
This policy setting defines the default behavior that the Background Intelligent Transfer Service (BITS) uses for background transfers when the system is connected to a costed network (3G, etc.). Download behavior policies further limit the network usage of background transfers. If you enable this policy setting, you can define a default download policy for each BITS job priority. This setting does not override a download policy explicitly configured by the application that created the BITS job, but does apply to jobs that are created by specifying only a priority. For example, you can specify that background jobs are by default to transfer only when on uncosted network connections, but foreground jobs should proceed only when not roaming. The values that can be assigned are: - Always transfer - Transfer unless roaming - Transfer unless surcharge applies (when not roaming or overcap) - Transfer unless nearing limit (when not roaming or nearing cap) - Transfer only if unconstrained - Custom--allows you to specify a bitmask, in which the bits describe cost states allowed or disallowed for this priority: (bits described here) 0x1 - The cost is unknown or the connection is unlimited and is considered to be unrestricted of usage charges and capacity constraints. 0x2 - The usage of this connection is unrestricted up to a certain data limit 0x4 - The usage of this connection is unrestricted up to a certain data limit and plan usage is less than 80 percent of the limit. 0x8 - Usage of this connection is unrestricted up to a certain data limit and plan usage is between 80 percent and 100 percent of the limit. 0x10 - Usage of this connection is unrestricted up to a certain data limit, which has been exceeded. Surcharge applied or unknown. 0x20 - Usage of this connection is unrestricted up to a certain data limit, which has been exceeded. No surcharge applies, but speeds are likely reduced. 0x40 - The connection is costed on a per-byte basis. 0x80 - The connection is roaming. 0x80000000 - Ignore congestion.
Registry
Software\Policies\Microsoft\Windows\BITS\TransferPolicy MDM / Intune (CSP)
./Device/Vendor/MSFT/Policy/Config/BITS/CostedNetworkBehaviorBackgroundPriority Multiple CSP matches are possible; the first one was selected.
Microsoft Learn documentation Mapping data: Microsoft Learn (CC BY 4.0)
CSP values
-
1 (Default)- Always transfer. -
2- Transfer unless roaming. -
3- Transfer unless surcharge applies (when not roaming or over cap). -
4- Transfer unless nearing limit (when not roaming or nearing cap). -
5- Transfer only if unconstrained.
Export Builder
BETAConfigure the state, scope and options, then generate .reg, PowerShell, Intune and SCCM outputs — or add the setting to a multi-setting collection.
These exports write the registry — this is not a managed GPO. ⓘ
.reg file
Windows Registry Editor Version 5.00
; Exported from gporais.com
; Policy: Set default download behavior for BITS jobs on costed networks
; State: Enabled
; Supported on: Windows 8 or Windows Server 2012 or Windows RT or computers with BITS 5 installed.
[HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\BITS\TransferPolicy]
"ForegroundTransferPolicy"=dword:800000ff
"ForegroundTransferPolicyCustom"=dword:000000ff
"HighTransferPolicy"=dword:000000ff
"HighTransferPolicyCustom"=dword:000000ff
"NormalTransferPolicy"=dword:000000ff
"NormalTransferPolicyCustom"=dword:000000ff
"LowTransferPolicy"=dword:000000ff
"LowTransferPolicyCustom"=dword:000000ff More formats (PowerShell, Intune, SCCM)
PowerShell
# Exported from gporais.com
# Policy: Set default download behavior for BITS jobs on costed networks
# State: Enabled
# Supported on: Windows 8 or Windows Server 2012 or Windows RT or computers with BITS 5 installed.
$path = 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy'
New-Item -Path $path -Force | Out-Null
Set-ItemProperty -Path $path -Name 'ForegroundTransferPolicy' -Value 2147483903 -Type DWord
Set-ItemProperty -Path $path -Name 'ForegroundTransferPolicyCustom' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'HighTransferPolicy' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'HighTransferPolicyCustom' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'NormalTransferPolicy' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'NormalTransferPolicyCustom' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'LowTransferPolicy' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'LowTransferPolicyCustom' -Value 255 -Type DWord Intune XML
OMA-URI: ./Device/Vendor/MSFT/Policy/Config/BITS/CostedNetworkBehaviorBackgroundPriority
Data type: String
Value:
<enabled/>
<data id="BITS_TransferPolicyForegroundPriorityValue" value="2147483903"/>
<data id="BITS_TransferPolicyForegroundPriorityValueCustom" value="255"/>
<data id="BITS_TransferPolicyHighPriorityValue" value="255"/>
<data id="BITS_TransferPolicyHighPriorityValueCustom" value="255"/>
<data id="BITS_TransferPolicyNormalPriorityValue" value="255"/>
<data id="BITS_TransferPolicyNormalPriorityValueCustom" value="255"/>
<data id="BITS_TransferPolicyLowPriorityValue" value="255"/>
<data id="BITS_TransferPolicyLowPriorityValueCustom" value="255"/> Intune Remediation
# === Detection script ===
# Exported from gporais.com
# Policy: Set default download behavior for BITS jobs on costed networks
# State: Enabled
# Supported on: Windows 8 or Windows Server 2012 or Windows RT or computers with BITS 5 installed.
function Test-RegistryValue {
param(
[Parameter(Mandatory = $true)][string]$Path,
[Parameter(Mandatory = $true)][string]$Name,
[object]$Expected,
[ValidateSet('String', 'DWord', 'MultiString')][string]$Kind = 'String',
[switch]$Absent
)
try {
$item = Get-ItemProperty -LiteralPath $Path -Name $Name -ErrorAction Stop
} catch {
return $Absent.IsPresent
}
if ($Absent.IsPresent) { return $false }
$actual = $item.$Name
if ($Kind -eq 'DWord') { return ([int64]$actual) -eq ([int64]$Expected) }
if ($Kind -eq 'MultiString') {
$actualValues = @($actual)
$expectedValues = @($Expected)
if ($actualValues.Count -ne $expectedValues.Count) { return $false }
for ($i = 0; $i -lt $expectedValues.Count; $i++) {
if ([string]$actualValues[$i] -ne [string]$expectedValues[$i]) { return $false }
}
return $true
}
return [string]$actual -eq [string]$Expected
}
$checks = @(
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'ForegroundTransferPolicy' -Expected 2147483903 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'ForegroundTransferPolicyCustom' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'HighTransferPolicy' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'HighTransferPolicyCustom' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'NormalTransferPolicy' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'NormalTransferPolicyCustom' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'LowTransferPolicy' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'LowTransferPolicyCustom' -Expected 255 -Kind DWord)
)
if ($checks -notcontains $false) {
Write-Output 'Compliant'
exit 0
}
Write-Output 'Non-compliant'
exit 1
# === Remediation script ===
# Exported from gporais.com
# Policy: Set default download behavior for BITS jobs on costed networks
# State: Enabled
# Supported on: Windows 8 or Windows Server 2012 or Windows RT or computers with BITS 5 installed.
$path = 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy'
New-Item -Path $path -Force | Out-Null
Set-ItemProperty -Path $path -Name 'ForegroundTransferPolicy' -Value 2147483903 -Type DWord
Set-ItemProperty -Path $path -Name 'ForegroundTransferPolicyCustom' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'HighTransferPolicy' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'HighTransferPolicyCustom' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'NormalTransferPolicy' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'NormalTransferPolicyCustom' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'LowTransferPolicy' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'LowTransferPolicyCustom' -Value 255 -Type DWord SCCM scripts
# Exported from gporais.com
# Policy: Set default download behavior for BITS jobs on costed networks
# State: Enabled
# Supported on: Windows 8 or Windows Server 2012 or Windows RT or computers with BITS 5 installed.
# SCCM Configuration Item guidance:
# Create a Configuration Item of type "Setting: Script".
# Discovery script: use the Detection script below.
# Remediation script: use the Remediation script below.
# Compliance rule: the Discovery script output equals 'Compliant'.
# === Detection script ===
# Exported from gporais.com
# Policy: Set default download behavior for BITS jobs on costed networks
# State: Enabled
# Supported on: Windows 8 or Windows Server 2012 or Windows RT or computers with BITS 5 installed.
function Test-RegistryValue {
param(
[Parameter(Mandatory = $true)][string]$Path,
[Parameter(Mandatory = $true)][string]$Name,
[object]$Expected,
[ValidateSet('String', 'DWord', 'MultiString')][string]$Kind = 'String',
[switch]$Absent
)
try {
$item = Get-ItemProperty -LiteralPath $Path -Name $Name -ErrorAction Stop
} catch {
return $Absent.IsPresent
}
if ($Absent.IsPresent) { return $false }
$actual = $item.$Name
if ($Kind -eq 'DWord') { return ([int64]$actual) -eq ([int64]$Expected) }
if ($Kind -eq 'MultiString') {
$actualValues = @($actual)
$expectedValues = @($Expected)
if ($actualValues.Count -ne $expectedValues.Count) { return $false }
for ($i = 0; $i -lt $expectedValues.Count; $i++) {
if ([string]$actualValues[$i] -ne [string]$expectedValues[$i]) { return $false }
}
return $true
}
return [string]$actual -eq [string]$Expected
}
$checks = @(
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'ForegroundTransferPolicy' -Expected 2147483903 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'ForegroundTransferPolicyCustom' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'HighTransferPolicy' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'HighTransferPolicyCustom' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'NormalTransferPolicy' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'NormalTransferPolicyCustom' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'LowTransferPolicy' -Expected 255 -Kind DWord)
(Test-RegistryValue -Path 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy' -Name 'LowTransferPolicyCustom' -Expected 255 -Kind DWord)
)
if ($checks -notcontains $false) {
Write-Output 'Compliant'
exit 0
}
Write-Output 'Non-compliant'
exit 1
# === Remediation script ===
# Exported from gporais.com
# Policy: Set default download behavior for BITS jobs on costed networks
# State: Enabled
# Supported on: Windows 8 or Windows Server 2012 or Windows RT or computers with BITS 5 installed.
$path = 'HKLM:\Software\Policies\Microsoft\Windows\BITS\TransferPolicy'
New-Item -Path $path -Force | Out-Null
Set-ItemProperty -Path $path -Name 'ForegroundTransferPolicy' -Value 2147483903 -Type DWord
Set-ItemProperty -Path $path -Name 'ForegroundTransferPolicyCustom' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'HighTransferPolicy' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'HighTransferPolicyCustom' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'NormalTransferPolicy' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'NormalTransferPolicyCustom' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'LowTransferPolicy' -Value 255 -Type DWord
Set-ItemProperty -Path $path -Name 'LowTransferPolicyCustom' -Value 255 -Type DWord Building a multi-setting collection? Add this setting and generate combined .reg / PowerShell / GPO scripts.