When running Exchange AV solutions in an internal network segment which does not have any direct internet connection available, anti-virus pattern files need to be distributed manually.

This script deletes pattern files in the target location, copies new pattern files from a dedicated source location to the targets and optionally restarts the AV service on each Exchange server.

The script has been developed to focus on Trend Micro Scanmail for Exchange 11.

The script has been tested with Exchange 2010 and Exchange 2013, but it should work with Exchange 2016 without any changes.

Find the source code at Github: https://github.com/Apoc70/Copy-AntiVirusPattern


    Copy Trend Micro pattern files to multiple Exchange Servers and restart SMEX master Service  
       Copyright (c) Thomas Stensitzki 
    Version 1.02015-05-19 
    Ideas, comments and suggestions to support@granikos.eu  
    More information can be found at http://www.granikos.eu/en/scripts  
    This script copies pattern files from a given source location to dedicated Exchange Server file  
    locations. The target file locations must be the same across all servers. The list of Exchange  
    Servers is created using the Get-ExchangeServer cmdlet. 
    - Windows Server 2012 or Windows Server 2012 R2   
    Revision History  
    1.0     Initial community release  
    .PARAMETER RestartService 
    Restart the AV service on the target server after copying pattern files 
    Copy pattern files to Exchange 2013 servers and restart service 
    .\Copy-AntiVirusPattern -RestartService 
    Copy pattern files to Exchange 2010 and 2013 servers and restart service 
    .\Copy-AntiVirusPattern -RestartService -IncludeExchange2010 
    [parameter(Mandatory=$false,ValueFromPipeline=$false,HelpMessage='Restart AV service at target server')][switch]$RestartService,   
    [parameter(Mandatory=$false,ValueFromPipeline=$false,HelpMessage='Use automatic folder detection for Exchange and IIS log paths')][switch]$IncludeExchange2010 
Set-StrictMode -Version Latest 
$SourcePath = "D:\TrendMicroActiveUpdate\pattern\*.*" 
$TargetDrive = "d$" 
$TargetPathLatest = "\Program Files\Trend Micro\Smex\engine\vsapi\latest\pattern" 
$TargetPathPrimary = "\Program Files\Trend Micro\Smex\engine\vsapi\primary\pattern" 
$ServiceName = "ScanMail_Master" 
function Copy-Files { 
    $TargetFolders = @("\\" + $Server + "\" + $TargetDrive + $TargetPathLatest) 
    $TargetFolders += "\\" + $Server + "\" + $TargetDrive + $TargetPathPrimary 
    foreach($TargetServerFolder in $TargetFolders) { 
        Write-Verbose "Testing target $($TargetServerFolder)" 
        if(Test-Path $TargetServerFolder) { 
            $Files = Get-ChildItem -Path $TargetServerFolder 
            $c = ($Files | Measure-Object).Count 
            Write-Verbose "$($c) files will be deleted!" 
            foreach ($File in $Files) { 
                Remove-Item $File.FullName -ErrorAction SilentlyContinue -Force | out-null 
            Write-Verbose "Copying files to $($TargetServerFolder)" 
            Copy-Item -Path $SourcePath -Destination $TargetServerFolder -Force 
function Restart-RemoteService { 
    try { 
        # try to restart the AV service on target server 
        Get-Service -Name $ServiceName -ComputerName $Server | Restart-Service 
    catch { 
        Write-Error "Error restarting $($ServiceName) on server $($Server)" 
if($IncludeExchange2010) { 
    # select Exchange 2010 and 2013 servers  
    $Servers = Get-ExchangeServer | Where {$_.IsE14OrLater -eq $true} | Sort-Object Name 
else { 
    # select Exchange 2013 servers only 
    $Servers = Get-ExchangeServer | Where {$_.IsE15OrLater -eq $true} | Sort-Object Name 
foreach ($Server in $Servers) { 
    Write-Output "Updating Server $($Server)" 
    if($RestartService) { 
    else { 
        Write-Output "Not restarting any remote service on server $($Server)"