WindowsSearchHelper.psm1

# WindowsSearchHelper

function Get-FileTypePersistentHandler {
    # .SYNOPSIS
    # Queries all file types with associated filter handlers and lists their respective filter handlers.
    # .DESCRIPTION
    # Queries all file types with associated filter handlers and lists their respective filter handlers.
    # .OUTPUTS
    # List of PSObject.
    [CmdletBinding()]
    [OutputType([System.Collections.Generic.List[PSObject]])]
    param()

    $Records = [System.Collections.Generic.List[PSObject]]::new()

    try {
        $ClassesKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('Software\Classes', $False)
        $Extensions = $ClassesKey.GetSubKeyNames()
        foreach ($extension in $Extensions) {
            if (-not $extension.StartsWith('.')) { continue }
            Write-Verbose "Extension $extension"

            try {
                $extensionKey = $ClassesKey.OpenSubKey($extension, $False)
                if ($Null -eq $extensionKey) { continue }
                $progId = $extensionKey.GetValue('')

                try {
                    $phKey = $extensionKey.OpenSubKey('PersistentHandler', $False)
                    if ($Null -ne $phKey) {
                        $Records.Add([PSCustomObject]@{
                                Extension                 = $extension
                                ProgID                    = $Null
                                ProgIDCLSID               = $Null
                                DefaultPersistentHandler  = $phKey.GetValue('')
                                OriginalPersistentHandler = $phKey.GetValue('OriginalPersistentHandler')
                            })
                    }
                }
                finally { if ($Null -ne $phKey) { $phKey.Close() } }
            }
            finally { if ($Null -ne $extensionKey) { $extensionKey.Close() } }

            if (-not [string]::IsNullOrWhiteSpace($progId)) {
                try {
                    $progIdClsidKey = $ClassesKey.OpenSubKey("$progId\CLSID", $False)
                    if ($Null -ne $progIdClsidKey) {
                        $clsid = $progIdClsidKey.GetValue('')

                        try {
                            $phKey = $ClassesKey.OpenSubKey("CLSID\$clsid\PersistentHandler", $False)
                            if ($Null -ne $phKey) {
                                $Records.Add([PSCustomObject]@{
                                        Extension                 = $extension
                                        ProgID                    = $progId
                                        ProgIDCLSID               = $clsid
                                        DefaultPersistentHandler  = $phKey.GetValue('')
                                        OriginalPersistentHandler = $phKey.GetValue('OriginalPersistentHandler')
                                    })
                            }
                        }
                        finally { if ($Null -ne $phKey) { $phKey.Close() } }
                    }
                }
                finally { if ($Null -ne $progIdClsidKey) { $progIdClsidKey.Close() } }
            }
        }
    }
    finally { if ($Null -ne $ClassesKey) { $ClassesKey.Close() } }
    return $Records
}

function Disable-FileTypeContentIndexing {
    # .SYNOPSIS
    # Associates all file types that have associated filter handlers with the Null filter handler.
    # .DESCRIPTION
    # Associates all file types that have associated filter handlers with the Null filter handler.
    [CmdletBinding(SupportsShouldProcess = $true)]
    param()

    $EmptyHandler = [Guid]::Empty.ToString('B')
    $NullHandler = '{098f2470-bae0-11cd-b579-08002b30bfeb}'

    try {
        $ClassesKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('Software\Classes', -not $WhatIfPreference)
        $Extensions = $ClassesKey.GetSubKeyNames()
        foreach ($extension in $Extensions) {
            if (-not $extension.StartsWith('.')) { continue }
            Write-Verbose "Extension $extension"
            $phKeyExist = $False
            $default = $Null
            $defaultExist = $False
            $original = $Null

            try {
                $extensionKey = $ClassesKey.OpenSubKey($extension, $False)
                if ($Null -eq $extensionKey) { continue }
                $progId = $extensionKey.GetValue('')

                try {
                    $phKey = $extensionKey.OpenSubKey('PersistentHandler', $False)
                    if ($Null -ne $phKey) {
                        $phKeyExist = $True
                        $default = $phKey.GetValue('')
                        if ($default -notin $Null, $EmptyHandler) {
                            $defaultExist = $True
                        }
                        $original = $phKey.GetValue('OriginalPersistentHandler')
                    }
                }
                finally { if ($Null -ne $phKey) { $phKey.Close() } }
            }
            finally { if ($Null -ne $extensionKey) { $extensionKey.Close() } }

            if ((-not $defaultExist) -and (-not [string]::IsNullOrWhiteSpace($progId))) {
                try {
                    $progIdClsidKey = $ClassesKey.OpenSubKey("$progId\CLSID", $False)
                    if ($Null -ne $progIdClsidKey) {
                        $clsid = $progIdClsidKey.GetValue('')

                        try {
                            $phKey = $ClassesKey.OpenSubKey("CLSID\$clsid\PersistentHandler", $False)
                            if ($Null -ne $phKey) {
                                $default = $phKey.GetValue('')
                            }
                        }
                        finally { if ($Null -ne $phKey) { $phKey.Close() } }
                    }
                }
                finally { if ($Null -ne $progIdClsidKey) { $progIdClsidKey.Close() } }
            }

            if ($default -notin $Null, $EmptyHandler, $NullHandler) {
                $name = $extension.PadRight(10)
                try {
                    if ($phKeyExist) {
                        $phKey = $ClassesKey.OpenSubKey("$extension\PersistentHandler", -not $WhatIfPreference)
                    }
                    else {
                        Write-Host "Extension $name Create PersistentHandler" -ForegroundColor Cyan
                        if ($PSCmdlet.ShouldProcess("HKLM:\Software\Classes\$extension\PersistentHandler", 'CreateSubKey')) {
                            $phKey = $ClassesKey.CreateSubKey("$extension\PersistentHandler")
                        }
                    }
                    Write-Host "Extension $name Set PersistentHandler to $NullHandler" -ForegroundColor Cyan
                    if ($PSCmdlet.ShouldProcess("HKLM:\Software\Classes\$extension\PersistentHandler\(Default)", 'SetValue')) {
                        $phKey.SetValue('', $NullHandler)
                    }
                    if ($Null -eq $original) {
                        $original = if ($defaultExist) { $default } else { $EmptyHandler }
                        Write-Host "Extension $name Set OriginalPersistentHandler to $original" -ForegroundColor Cyan
                        if ($PSCmdlet.ShouldProcess("HKLM:\Software\Classes\$extension\PersistentHandler\OriginalPersistentHandler", 'SetValue')) {
                            $phKey.SetValue('OriginalPersistentHandler', $original)
                        }
                    }
                }
                finally { if ($Null -ne $phKey) { $phKey.Close() } }
            }
        }
    }
    finally { if ($Null -ne $ClassesKey) { $ClassesKey.Close() } }
}

function Enable-FileTypeContentIndexing {
    # .SYNOPSIS
    # Re-associates all file types previously associated with a non-Null filter handler back to their original filter handlers.
    # .DESCRIPTION
    # Re-associates all file types previously associated with a non-Null filter handler back to their original filter handlers.
    [CmdletBinding(SupportsShouldProcess = $true)]
    param()

    $EmptyHandler = [Guid]::Empty.ToString('B')
    $NullHandler = '{098f2470-bae0-11cd-b579-08002b30bfeb}'

    try {
        $ClassesKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('Software\Classes', $False)
        $Extensions = $ClassesKey.GetSubKeyNames()
        foreach ($extension in $Extensions) {
            if (-not $extension.StartsWith('.')) { continue }
            Write-Verbose "Extension $extension"

            try {
                $phKey = $ClassesKey.OpenSubKey("$extension\PersistentHandler", -not $WhatIfPreference)
                if ($Null -eq $phKey) { continue }
                $default = $phKey.GetValue('')
                $original = $phKey.GetValue('OriginalPersistentHandler')

                if (($NullHandler -eq $default) -and ($original -notin $Null, $NullHandler)) {
                    $name = $extension.PadRight(10)
                    if ($EmptyHandler -ne $original) {
                        Write-Host "Extension $name Set PersistentHandler to $original" -ForegroundColor Cyan
                        if ($PSCmdlet.ShouldProcess("HKLM:\Software\Classes\$extension\PersistentHandler\(Default)", 'SetValue')) {
                            $phKey.SetValue('', $original)
                        }
                    }
                    else {
                        Write-Host "Extension $name Delete PersistentHandler eq $default" -ForegroundColor Cyan
                        if ($PSCmdlet.ShouldProcess(
                                "HKLM:\Software\Classes\$extension\PersistentHandler\(Default)", 'DeleteValue')) {
                            $phKey.DeleteValue('')
                        }
                    }
                    Write-Host "Extension $name Delete OriginalPersistentHandler eq $original" -ForegroundColor Cyan
                    if ($PSCmdlet.ShouldProcess(
                            "HKLM:\Software\Classes\$extension\PersistentHandler\OriginalPersistentHandler", 'DeleteValue')) {
                        $phKey.DeleteValue('OriginalPersistentHandler')
                    }
                }
            }
            finally { if ($Null -ne $phKey) { $phKey.Close() } }
        }
    }
    finally { if ($Null -ne $ClassesKey) { $ClassesKey.Close() } }
}

Export-ModuleMember -Function `
    Get-FileTypePersistentHandler, `
    Disable-FileTypeContentIndexing, `
    Enable-FileTypeContentIndexing