Functions/GenXdev.Webbrowser/Get-DefaultWebbrowser.cs

// ################################################################################
// Part of PowerShell module : GenXdev.Webbrowser
// Original cmdlet filename : Get-DefaultWebbrowser.cs
// Original author : René Vaessen / GenXdev
// Version : 3.28.2026
// ################################################################################
// Copyright (c) 2026 René Vaessen / GenXdev
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ################################################################################



using System.Collections;
using System.Management.Automation;
using Microsoft.Win32;

namespace GenXdev.Webbrowser
{
    [System.ComponentModel.Description(@"
.SYNOPSIS
Returns the configured default web browser for the current user.
.DESCRIPTION
* Retrieves information about the system's default web browser by querying
  the Windows Registry.
* Returns a hashtable containing the browser's name, description, icon
  path, and executable path.
* The function checks both user preferences and system-wide browser
  registrations to determine the default browser.
.EXAMPLE
```powershell
Get-DefaultWebbrowser | Format-List
```

Get detailed information about the default browser.
.EXAMPLE
```powershell
$browser = Get-DefaultWebbrowser
& $browser.Path https://www.github.com/
```

Launch the default browser with a specific URL.
")]
    [Cmdlet(VerbsCommon.Get, "DefaultWebbrowser")]
    [OutputType(typeof(Hashtable))]
    public class GetDefaultWebbrowserCommand : PSGenXdevCmdlet
    {
        private string urlHandlerId;

        /// <summary>
        /// Begin processing - retrieve default browser URL handler configuration
        /// </summary>
        protected override void BeginProcessing()
        {
            // Define registry paths for url associations and browser information
            string urlAssocPath = @"SOFTWARE\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice";

            WriteVerbose("Retrieving default browser URL handler configuration");

            // Get the default handler ID for HTTPS URLs from user preferences
            using (RegistryKey hkcu = RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Default))
            {
                using (RegistryKey urlAssocKey = hkcu.OpenSubKey(urlAssocPath))
                {
                    if (urlAssocKey != null)
                    {
                        urlHandlerId = urlAssocKey.GetValue("ProgId") as string;
                    }
                }
            }

            WriteVerbose($"URL handler ID: {urlHandlerId}");
        }

        /// <summary>
        /// Process record - scan installed browsers and return default browser info
        /// </summary>
        protected override void ProcessRecord()
        {
            if (string.IsNullOrEmpty(urlHandlerId))
            {
                return;
            }

            WriteVerbose("Scanning installed browsers in registry");

            // Iterate through all registered browsers in the system
            using (RegistryKey browsersKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\WOW6432Node\Clients\StartMenuInternet"))
            {
                if (browsersKey == null)
                {
                    return;
                }

                foreach (string browserName in browsersKey.GetSubKeyNames())
                {
                    using (RegistryKey browserRoot = browsersKey.OpenSubKey(browserName))
                    {
                        if (browserRoot == null)
                        {
                            continue;
                        }

                        // Construct the full registry path for the current browser
                        string browserRootPath = @"SOFTWARE\WOW6432Node\Clients\StartMenuInternet\" + browserName;

                        // Verify browser has required registry keys for URL handling
                        using (RegistryKey commandKey = browserRoot.OpenSubKey(@"shell\open\command"))
                        {
                            using (RegistryKey urlAssocKey = browserRoot.OpenSubKey(@"Capabilities\URLAssociations"))
                            {
                                if (commandKey == null || urlAssocKey == null)
                                {
                                    continue;
                                }

                                // Get the HTTPS handler ID for this browser
                                string browserHandler = urlAssocKey.GetValue("https") as string;

                                // Check if this browser is the default handler
                                if (browserHandler == urlHandlerId)
                                {
                                    WriteVerbose($"Found default browser: {browserRootPath}");

                                    // Get browser details
                                    using (RegistryKey capabilities = browserRoot.OpenSubKey("Capabilities"))
                                    {
                                        if (capabilities == null)
                                        {
                                            continue;
                                        }

                                        string name = capabilities.GetValue("ApplicationName") as string;
                                        string description = capabilities.GetValue("ApplicationDescription") as string;
                                        string icon = capabilities.GetValue("ApplicationIcon") as string;
                                        string path = (commandKey.GetValue(null) as string)?.Trim('"');

                                        // Return browser details in a hashtable
                                        Hashtable result = new Hashtable
                                        {
                                            ["Name"] = name,
                                            ["Description"] = description,
                                            ["Icon"] = icon,
                                            ["Path"] = path
                                        };

                                        WriteObject(result);
                                        return;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

        /// <summary>
        /// End processing - no cleanup needed
        /// </summary>
        protected override void EndProcessing()
        {
        }
    }
}