CmdLets/Master/Add-AntivirusExclusions.ps1

Function Add-AntivirusExclusions 
 {
<#
.SYNOPSIS
    Adds Windows Defender antivirus exclusions for Omnissa Horizon Agent, Dynamic Environment Manager,
    App Volumes, and FSLogix components.
 
.DESCRIPTION
    The Add-AntivirusExclusions function automates the configuration of Windows Defender exclusions
    required for Virtual Desktop Infrastructure (VDI) environments. It validates the presence of known
    executables and system paths related to Omnissa Horizon, App Volumes (CloudVolumes), and FSLogix
    profile containers, then registers them with Windows Defender using Add-MpPreference.
 
.PARAMETER FSLogixPaths
    An optional array of directory paths (such as network shares hosting user profiles) to include
    when generating recursive VHD/VHDX file and lock file exclusions for FSLogix.
 
.EXAMPLE
    Add-AntivirusExclusions
     
    Description:
    Runs the function to scan for and apply default exclusions for Omnissa Horizon and App Volumes components.
 
.EXAMPLE
    Add-AntivirusExclusions -FSLogixPaths "\\fs01\profiles", "\\fs02\redirectedfolders"
     
    Description:
    Runs the function including specific FSLogix profile storage repository paths for VHD and VHDX exclusion rules.
 
.NOTES
    Prerequisites:
    - Requires administrative privileges to modify Windows Defender preferences.
    - Requires the 'Defender' PowerShell module.
 
.LINK
    https://learn.microsoft.com/en-us/microsoft-365/security/defender-endpoint/
#>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory=$False)]
            $FSLogixPaths
    )
    Import-Module Defender
    $Exclusions = @()
    $Paths = @(
        "C:\Program Files (x86)\Common Files\Omnissa\DeviceRedirectionCommon\ftnlping.exe",
        "C:\Program Files (x86)\Common Files\Omnissa\USB\\omnissa-usbarbitrator64.exe",
        "C:\Program Files\Common Files\Omnissa\DeviceRedirectionCommon\ftnlping.exe",
        "C:\Program Files\Common Files\Omnissa\DeviceRedirectionCommon\ftnlsv.exe",
        "C:\Program Files\Common Files\Omnissa\ScannerRedirection\diagutil32.exe",
        "C:\Program Files\Common Files\Omnissa\ScannerRedirection\diagutil64.exe",
        "C:\Program Files\Common Files\Omnissa\ScannerRedirection\ftscansvchv.exe",
        "C:\Program Files\Common Files\Omnissa\ScannerRedirection\scanmd.exe",
        "C:\Program Files\Common Files\Omnissa\ScannerRedirection\scanner.exe",
        "C:\Program Files\Common Files\Omnissa\SerialPortRedirection\Agent\hznsprrdctl.exe",
        "C:\Program Files\Common Files\Omnissa\SerialPortRedirection\Agent\hznsprrdp.exe",
        "C:\Program Files\Common Files\Omnissa\SerialPortRedirection\Agent\hznsprrdpsrv.exe",
        "C:\Program Files\Common Files\Omnissa\SerialPortRedirection\Agent\hznsprrdpUI.exe",
        "C:\Program Files\Common Files\Omnissa\Teradici PCoIP Server\x64\\pcoip_server_win32.exe",
        "C:\Program Files\Omnissa\Horizon Agents\Horizon Agent\bin\\SecurityGateway.exe",
        "C:\Program Files\Omnissa\Horizon Agents\Horizon Agent\bin\\tsdrvdisvc.dll",
        "C:\Program Files\Omnissa\Horizon Agents\Horizon Agent\bin\\ws_scripthost.exe",
        "C:\Program Files\Omnissa\Horizon Agents\Horizon Agent\bin\\wsnm.exe",
        "C:\Program Files\Omnissa\Horizon Agents\Horizon Agent\bin\\wsnm_jms.exe",
        "C:\Program Files\Omnissa\Horizon Agents\Horizon Agent\Blast\\VMBlastS.exe",
        "C:\Program Files\Omnissa\Horizon Agents\Horizon Agent\Blast\\VMBlastW.exe",
        "C:\Program Files\Omnissa\Horizon\Agent\VMBlastS.exe",
        "C:\Program Files\Omnissa\Horizon\Agent\VMBlastW.exe",
        "C:\Program Files\Omnissa\Horizon\Agent\bin\tsdrvdisvc.dll",
        "C:\Program Files\Omnissa\Horizon\Agent\bin\ws_scripthost.exe",
        "C:\Program Files\Omnissa\Horizon\Agent\bin\wsnm_jms.exe",
        "C:\Program Files\Omnissa\Horizon\Agent\bin\wssm.exe",
        "C:\Program Files\Omnissa\Horizon\Agent\bin\UrlRedirection\\horizon-url-filtering-plugin.dll",
        "C:\Program Files\Omnissa\Horizon\Agent\bin\UrlRedirection\\horizon-url-filtering-plugin-x64.dll",
        "C:\Program Files\Omnissa\Horizon\Agent\bin\UrlRedirection\\horizon-url-protocol-intercept.dll",
        "C:\Program Files\Omnissa\Horizon\Agent\bin\UrlRedirection\\horizon-url-protocol-launch-helper.exe",
        "C:\Program Files\Omnissa\Horizon\Agent\bin\UrlRedirection\x64\\horizon-url-protocol-intercept.dll",
        "C:\Program Files\Omnissa\Horizon\Agent\DCT\hzdct.exe",
        "C:\Program Files\Omnissa\Horizon\Agent\DCT\ws_diag.exe",
        "C:\Program Files\Omnissa\Horizon\Instant Clone Agent\omnissa-ic-ga.exe",
        "C:\Program Files\Immidio\Flex Profiles\FlexEngine.exe",
        "C:\Program Files\Immidio\Flex Profiles\FlexService.exe",
        "C:\Program Files\Immidio\Flex Profiles\Flex+ Self-Support.exe"
    )
    ForEach ($Path in $Paths) {
        Write-Verbose "Testing: $Path"
        $File = Get-Item $Path -ErrorAction SilentlyContinue
        if ($File) {
            Write-Verbose "`tAdding to Exclusions"
            $Exclusions += @{ ExclusionProcess = $File.FullName }
        }
    }

    If (Test-Path "C:\Program Files (x86)\CloudVolumes\Agent\svservice.exe") {
        Write-Verbose "Adding CloudVolumes Exclusions"
        $Exclusions = $Exclusions + @(
            @{ ExclusionPath = "C:\Program Files (x86)\CloudVolumes\Agent\svservice.exe" },
            @{ ExclusionPath = "C:\Program Files\Omnissa\AppVolumes\svservice.exe" },
            @{ ExclusionPath = "C:\Program Files\Omnissa\AppVolumes\Agent\svservice.exe" },
            @{ ExclusionPath = "C:\SnapVolumesTemp\svservice.exe" },
            @{ ExclusionPath = "C:\SVROOT\svservice.exe" },
            @{ ExclusionPath = "C:\{00000000-0000-0000-0000-000000000000}\SVROOT\svservice.exe" }
        )
    }

    If ($FSLogixPaths) {
        Write-Verbose "Adding FSLogix Exclusions"
        $Exclusions = $Exclusions + @(
            @{ ExclusionPath = "%TEMP%\*\*.VHD" },
            @{ ExclusionPath = "%TEMP%\*\*.VHDX" },
            @{ ExclusionPath = "%Windir%\TEMP\*\*.VHD" },
            @{ ExclusionPath = "%Windir%\TEMP\*\*.VHDX" },
            @{ ExclusionPath = "%ProgramFiles%\FSLogix\Apps\frxdrv.sys" },
            @{ ExclusionPath = "%ProgramFiles%\FSLogix\Apps\frxdrvvt.sys" },
            @{ ExclusionPath = "%ProgramFiles%\FSLogix\Apps\frxccd.sys" },
            @{ ExclusionPath = "%ProgramFiles%\FSLogix\Apps\frxccd.exe" },
            @{ ExclusionProcess = "%ProgramFiles%\FSLogix\Apps\frxccds.exe" },
            @{ ExclusionProcess = "%ProgramFiles%\FSLogix\Apps\frxsvc.exe" }
        )

        $FSLogixPaths | ForEach-Object {
            $Exclusions = $Exclusions + @(
                @{ ExclusionPath = (Join-Path $_ "*\*.VHD") },
                @{ ExclusionPath = (Join-Path $_ "*\*.VHD.lock") },
                @{ ExclusionPath = (Join-Path $_ "*\*.VHD.meta") },
                @{ ExclusionPath = (Join-Path $_ "*\*.VHD.metadata") },
                @{ ExclusionPath = (Join-Path $_ "*\*.VHDX") },
                @{ ExclusionPath = (Join-Path $_ "*\*.VHDX.lock") },
                @{ ExclusionPath = (Join-Path $_ "*\*.VHDX.meta") },
                @{ ExclusionPath = (Join-Path $_ "*\*.VHDX.metadata") }
            )
        }
    }
    
    $Exclusions | ForEach-Object { 
        Write-Host "Adding Exclusion: $($_.Values)"
        Add-MpPreference @_ 
    }

}