我希望能够通过 C# 程序更改默认浏览器(和其他关联),类似于浏览器具有“将浏览器设置为默认”选项的方式。
我尝试更改 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice,但 Windows 仅检测到篡改,即使我将 Hash 和 ProgId 恢复到以前的值也是如此。看来哈希是唯一的、基于时间的
)。本质上,这涉及将文件“C:\Windows\System32\OEMDefaultAssociations.xml”中包含 Microsoft 原始字符串(例如默认浏览器“Edge”)的字符串替换为另一个字符串(例如 IE)。您可以在 C# 中执行相同的操作,这里我使用 PowerShell 执行此操作。我知道这适用于进行此更改后在计算机上创建的任何新用户配置文件。文件“OEMDefaultAssociations.xml”就像新配置文件的配置文件。
#' IE_ratherThan_Edge_MakeDefaultForNewUserProfiles_inWin10.ps1
#' From: https://community.spiceworks.com/topic/1812853-export-xml-with-dism-then-import-with-powershell
#'========================================================
#' This is good for Win10 Build 1709 and 1803
#'Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope LocalMachine
$file_OriginalWithEdge = "C:\Windows\System32\OEMDefaultAssociations.xml"
$file_CopyToKeepInCase = "C:\Windows\System32\OEMDefaultAssociations_ORIG_Edge_BEFORE_replacingWithIE.xml"
$file_Modified_BrowserIE = "C:\Windows\System32\OEMDefaultAssociations_Modified_with_IEratherThanEdge.xml"
#' 1] Copy and rename the file
Copy-Item $file_OriginalWithEdge -Destination $file_CopyToKeepInCase
$stringForEdge_1 = '<Association Identifier=".htm" ProgId="AppX4hxtad77fbk3jkkeerkrm0ze94wjf3s9" ApplicationName="Microsoft Edge" ApplyOnUpgrade="true" OverwriteIfProgIdIs="AppX6k1pws1pa7jjhchyzw9jce3e6hg6vn8d" />'
$stringForIE_1 = '<Association Identifier=".htm" ProgId="htmlfile" ApplicationName="Internet Explorer" ApplyOnUpgrade="true" OverwriteIfProgIdIs="AppX4hxtad77fbk3jkkeerkrm0ze94wjf3s9" />'
$stringForEdge_2 = '<Association Identifier=".html" ProgId="AppX4hxtad77fbk3jkkeerkrm0ze94wjf3s9" ApplicationName="Microsoft Edge" ApplyOnUpgrade="true" OverwriteIfProgIdIs="AppX6k1pws1pa7jjhchyzw9jce3e6hg6vn8d" />'
$stringForIE_2 = '<Association Identifier=".html" ProgId="htmlfile" ApplicationName="Internet Explorer" ApplyOnUpgrade="true" OverwriteIfProgIdIs="AppX4hxtad77fbk3jkkeerkrm0ze94wjf3s9" />'
$stringForEdge_3 = '<Association Identifier="http" ProgId="AppXq0fevzme2pys62n3e0fbqa7peapykr8v" ApplicationName="Microsoft Edge" ApplyOnUpgrade="true" OverwriteIfProgIdIs="AppXehk712w0hx4w5b8k25kg808a9h84jamg" />'
$stringForIE_3 = '<Association Identifier="http" ProgId="IE.HTTP" ApplicationName="Internet Explorer" ApplyOnUpgrade="true" OverwriteIfProgIdIs="AppXq0fevzme2pys62n3e0fbqa7peapykr8v" />'
$stringForEdge_4 = '<Association Identifier="https" ProgId="AppX90nv6nhay5n6a98fnetv7tpk64pp35es" ApplicationName="Microsoft Edge" ApplyOnUpgrade="true" OverwriteIfProgIdIs="AppXz8ws88f5y0y5nyrw1b3pj7xtm779tj2t" />'
$stringForIE_4 = '<Association Identifier="https" ProgId="IE.HTTPS" ApplicationName="Internet Explorer" ApplyOnUpgrade="true" OverwriteIfProgIdIs="AppX90nv6nhay5n6a98fnetv7tpk64pp35es" />'
#' 2] Replace the string
$content = [System.IO.File]::ReadAllText($file_OriginalWithEdge).Replace($stringForEdge_1,$stringForIE_1).Replace($stringForEdge_2,$stringForIE_2).Replace($stringForEdge_3,$stringForIE_3).Replace($stringForEdge_4,$stringForIE_4)
[System.IO.File]::WriteAllText($file_Modified_BrowserIE, $content)
#' 3] Delete the original File
Remove-Item -LiteralPath $file_OriginalWithEdge
#' 4] Copy the modified file to the name of the original file
Copy-Item $file_Modified_BrowserIE -Destination $file_OriginalWithEdge
Hash
值的哈希算法来阻止“以编程方式”更改默认 Web 浏览器的能力. 但是,
第三方实用程序,
SetDefaultBrowser.exe
,已经弄清楚了这种算法,因此允许完全自动更改用户的默认网络浏览器:
有关背景信息和下载链接,请参阅此博文