Microsoft Edge
Define a list of protocols that can launch an external application from listed origins without prompting the user
Supported on Microsoft Edge version 85, Windows 7 or later
What it does
Allows you to set a list of protocols, and for each protocol an associated list of allowed origin patterns, that can launch an external application without prompting the user. The trailing separator shouldn't be included when listing the protocol and the protocol should be all lower case. For example, list "skype" instead of "skype:", "skype://" or "Skype". If you configure this policy, a protocol is only permitted to launch an external application without prompting by policy if: - the protocol is listed - the origin of the site trying to launch the protocol matches one of the origin patterns in that protocol's allowed_origins list. If either condition is false, the external protocol launch prompt isn't omitted, by policy. If you don't configure this policy, no protocols can launch without a prompt. Users can opt out of prompts on a per-protocol/per-site basis unless the 'ExternalProtocolDialogShowAlwaysOpenCheckbox' (Show an "Always open" checkbox in external protocol dialog) policy is set to Disabled. This policy has no impact on per-protocol/per-site prompt exemptions set by users. The origin-matching patterns use a similar format to those for the 'URLBlocklist' (Block access to a list of URLs) policy, which are documented at https://go.microsoft.com/fwlink/?linkid=2095322. However, origin-matching patterns for this policy can't contain "/path" or "@query" elements. Any pattern that contains a "/path" or "@query" element is ignored. This policy doesn't work as expected with file://* wildcards. Example value: [ { "allowed_origins": [ "example.com", "http://www.example.com:8080" ], "protocol": "spotify" }, { "allowed_origins": [ "https://example.com", "https://.mail.example.com" ], "protocol": "msteams" }, { "allowed_origins": [ "*" ], "protocol": "msoutlook" } ]
What it writes
- Hive
- HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER
- Registry key
Software\Policies\Microsoft\Edge
Options
| Option | Type | Registry value | Allowed values |
|---|---|---|---|
| Define a list of protocols that can launch an external application from listed origins without prompting the user | Text | AutoLaunchProtocolsFromOrigins |
Up to 1000000 characters |
Configure and deploy
Choose a state and the option values; the output below is generated from the template for exactly that.
Enabled · Computer · template defaults
Registry file (.reg)
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge]
"AutoLaunchProtocolsFromOrigins"=""
PowerShell
$ErrorActionPreference = 'Stop'
function Set-RegistryValue {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name,
[Parameter(Mandatory = $true)][string] $PropertyType,
[Parameter(Mandatory = $true)][object] $Value
)
if (-not (Test-Path -LiteralPath $Path)) {
New-Item -Path $Path -Force | Out-Null
}
New-ItemProperty -LiteralPath $Path -Name $Name -PropertyType $PropertyType -Value $Value -Force | Out-Null
}
function Remove-RegistryValue {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name
)
if (Test-Path -LiteralPath $Path) {
Remove-ItemProperty -LiteralPath $Path -Name $Name -Force -ErrorAction SilentlyContinue
}
}
function Clear-RegistryKeyValues {
param(
[Parameter(Mandatory = $true)][string] $Path
)
if (-not (Test-Path -LiteralPath $Path)) {
return
}
foreach ($propertyName in (Get-Item -LiteralPath $Path).Property) {
Remove-ItemProperty -LiteralPath $Path -Name $propertyName -Force -ErrorAction SilentlyContinue
}
}
# Policy: Define a list of protocols that can launch an external application from listed origins without prompting the user
# Name: AutoLaunchProtocolsFromOrigins
# Scope: Machine
# State: Enabled
# Source: msedge.admx
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge' -Name 'AutoLaunchProtocolsFromOrigins' -PropertyType 'String' -Value ''
- The OMA-URI is an inferred ADMX-backed Policy CSP candidate derived from the source ADMX file name and policy name.
- Some Microsoft policies use built-in Policy CSP pages whose area names don't match the ADMX file name, so verify the candidate against Microsoft Learn before deployment.
- The generated payload is incomplete because one or more ADMX element values were not supplied: AutoLaunchProtocolsFromOrigins
ADMX profile candidate (OMA-URI)
./Device/Vendor/MSFT/Policy/Config/ADMX_msedge/AutoLaunchProtocolsFromOriginsIntune remediation scripts
Detection
$ErrorActionPreference = 'Stop'
$reasons = [System.Collections.Generic.List[string]]::new()
function Test-RegistryValueExists {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name
)
if (-not (Test-Path -LiteralPath $Path)) {
return $false
}
return $null -ne (Get-ItemProperty -LiteralPath $Path -Name $Name -ErrorAction SilentlyContinue)
}
function Test-RegistryValueEquals {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name,
[Parameter(Mandatory = $true)][string] $Kind,
[Parameter(Mandatory = $true)][object] $Expected
)
if (-not (Test-Path -LiteralPath $Path)) {
return $false
}
$valueObject = Get-ItemProperty -LiteralPath $Path -Name $Name -ErrorAction SilentlyContinue
if ($null -eq $valueObject) {
return $false
}
$actual = $valueObject.$Name
switch ($Kind) {
'String' { return [string]$actual -ceq [string]$Expected }
'ExpandString' { return [string]$actual -ceq [string]$Expected }
'DWord' { return [uint32]$actual -eq [uint32]$Expected }
'QWord' { return [uint64]$actual -eq [uint64]$Expected }
'MultiString' {
$actualArray = @($actual)
$expectedArray = @($Expected)
if ($actualArray.Count -ne $expectedArray.Count) { return $false }
for ($index = 0; $index -lt $actualArray.Count; $index++) {
if ([string]$actualArray[$index] -cne [string]$expectedArray[$index]) { return $false }
}
return $true
}
'Binary' {
$actualArray = [byte[]]$actual
$expectedArray = [byte[]]$Expected
if ($actualArray.Length -ne $expectedArray.Length) { return $false }
for ($index = 0; $index -lt $actualArray.Length; $index++) {
if ($actualArray[$index] -ne $expectedArray[$index]) { return $false }
}
return $true
}
default { return [string]$actual -ceq [string]$Expected }
}
}
# Policy: Define a list of protocols that can launch an external application from listed origins without prompting the user
# Name: AutoLaunchProtocolsFromOrigins
# Scope: Machine
# State: Enabled
# Source: msedge.admx
$isMatch = Test-RegistryValueEquals -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge' -Name 'AutoLaunchProtocolsFromOrigins' -Kind 'String' -Expected ''
if (-not $isMatch) {
$reasons.Add('Value mismatch: HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge\AutoLaunchProtocolsFromOrigins') | Out-Null
}
if ($reasons.Count -eq 0) {
Write-Output 'Compliant'
exit 0
}
$reasons | ForEach-Object { Write-Output $_ }
exit 1
Remediation
$ErrorActionPreference = 'Stop'
function Set-RegistryValue {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name,
[Parameter(Mandatory = $true)][string] $PropertyType,
[Parameter(Mandatory = $true)][object] $Value
)
if (-not (Test-Path -LiteralPath $Path)) {
New-Item -Path $Path -Force | Out-Null
}
New-ItemProperty -LiteralPath $Path -Name $Name -PropertyType $PropertyType -Value $Value -Force | Out-Null
}
function Remove-RegistryValue {
param(
[Parameter(Mandatory = $true)][string] $Path,
[Parameter(Mandatory = $true)][string] $Name
)
if (Test-Path -LiteralPath $Path) {
Remove-ItemProperty -LiteralPath $Path -Name $Name -Force -ErrorAction SilentlyContinue
}
}
function Clear-RegistryKeyValues {
param(
[Parameter(Mandatory = $true)][string] $Path
)
if (-not (Test-Path -LiteralPath $Path)) {
return
}
foreach ($propertyName in (Get-Item -LiteralPath $Path).Property) {
Remove-ItemProperty -LiteralPath $Path -Name $propertyName -Force -ErrorAction SilentlyContinue
}
}
# Policy: Define a list of protocols that can launch an external application from listed origins without prompting the user
# Name: AutoLaunchProtocolsFromOrigins
# Scope: Machine
# State: Enabled
# Source: msedge.admx
Set-RegistryValue -Path 'Registry::HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge' -Name 'AutoLaunchProtocolsFromOrigins' -PropertyType 'String' -Value ''
History 37 retained releases
- 150.0.4078.8016 Jul 2026
- Already present in the first release ChangeIntel keeps.
36 later releases left it unchanged.
Template
- Internal name
AutoLaunchProtocolsFromOrigins- Namespace
Microsoft.Policies.Edge- Template file
msedge.admx- Release
- Microsoft Edge 155.0.4283.62 · file set
0a733b0040dbbf02…
Definition, editor controls and support
Definition
<policy class="Both" displayName="$(string.AutoLaunchProtocolsFromOrigins)" explainText="$(string.AutoLaunchProtocolsFromOrigins_Explain)" key="Software\Policies\Microsoft\Edge" name="AutoLaunchProtocolsFromOrigins" presentation="$(presentation.AutoLaunchProtocolsFromOrigins)" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions">
<parentCategory ref="Microsoft.Policies.Edge:microsoft_edge" />
<supportedOn ref="Microsoft.Policies.Edge:SUPPORTED_WIN7_V85" />
<elements>
<text id="AutoLaunchProtocolsFromOrigins" maxLength="1000000" valueName="AutoLaunchProtocolsFromOrigins" />
</elements>
</policy>Editor controls
<presentation id="AutoLaunchProtocolsFromOrigins" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions"><textBox refId="AutoLaunchProtocolsFromOrigins"><label>Define a list of protocols that can launch an external application from listed origins without prompting the user</label></textBox></presentation>Supported platforms and category
Microsoft.Policies.Edge:category:microsoft_edge
<category displayName="$(string.microsoft_edge)" name="microsoft_edge" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions" />
Microsoft.Policies.Edge:definition:SUPPORTED_WIN7_V85
<definition displayName="$(string.SUPPORTED_WIN7_V85)" name="SUPPORTED_WIN7_V85" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions" />
Microsoft.Policies.Edge:category:microsoft_edge
<category displayName="$(string.microsoft_edge)" name="microsoft_edge" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions" />
<strings><string id="Microsoft.Policies.Edge:microsoft_edge">Microsoft Edge</string></strings>
Microsoft.Policies.Edge:definition:SUPPORTED_WIN7_V85
<definition displayName="$(string.SUPPORTED_WIN7_V85)" name="SUPPORTED_WIN7_V85" xmlns="http://schemas.microsoft.com/GroupPolicy/2006/07/PolicyDefinitions" />
<strings><string id="Microsoft.Policies.Edge:SUPPORTED_WIN7_V85">Microsoft Edge version 85, Windows 7 or later</string></strings>