Audit and Detect existing Edge \ Brave and Chrome Extensions via Intune

# Define browser user data paths
$browsers = @(
    @{ Name = "Edge"; Path = "$env:LocalAppData\Microsoft\Edge\User Data" },
    @{ Name = "Chrome"; Path = "$env:LocalAppData\Google\Chrome\User Data" },
    @{ Name = "Brave"; Path = "$env:LocalAppData\BraveSoftware\Brave-Browser\User Data" }
)

$results = @()
# Track processed ExtensionIDs to avoid duplicates
$processedIds = @{}

foreach ($browser in $browsers) {
    if (Test-Path $browser.Path) {
        $profilePaths = Get-ChildItem -Path $browser.Path -Directory | Where-Object { $_.Name -match '^(Default|Profile \d+)$' } | Select-Object -ExpandProperty FullName

        foreach ($profilePath in $profilePaths) {
            $extensionPath = "$profilePath\Extensions"
            if (Test-Path $extensionPath) {
                Get-ChildItem -Path $extensionPath -Directory | ForEach-Object {
                    $extId = $_.Name
                    # Skip excluded IDs and already processed ExtensionIDs
                    if ($extId -notin $excludeIds -and -not $processedIds.ContainsKey($extId)) {
                        $manifestPath = "$extensionPath\$extId\*\manifest.json"
                        if (Test-Path $manifestPath) {
                            $manifest = Get-Content $manifestPath -Raw | ConvertFrom-Json
                            $name = $manifest.name

                            # Check if name is a localized message (e.g., __MSG_extName__)
                            if ($name -match '^__MSG_(.+)__$') {
                                $messageKey = $matches[1]
                                # Look for messages.json in _locales/en/ (default to English)
                                $localePath = "$extensionPath\$extId\*\_locales\en\messages.json"
                                if (Test-Path $localePath) {
                                    $messages = Get-Content $localePath -Raw | ConvertFrom-Json
                                    # Get the localized name from messages.json
                                    if ($messages.$messageKey.message) {
                                        $name = $messages.$messageKey.message
                                    } else {
                                        $name = "Unknown ($name)" # Fallback if key not found
                                    }
                                } else {
                                    $name = "Unknown ($name)" # Fallback if messages.json not found
                                }
                            }

                            # Add ExtensionID to processed list
                            $processedIds[$extId] = $true

                            [PSCustomObject]@{
                                Browser = $browser.Name
                                Profile = ($profilePath -split '\\')[-1]
                                ExtensionID = $extId
                                Name = $name
                                Version = $manifest.version
                                Permissions = $manifest.permissions -join ", "
                            }
                        }
                    }
                }
            }
        }
    }
}

$results | Format-Table -AutoSize
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading...