Home » Archive » Skype for Business– Migrate-CsAnnouncements

Skype for Business– Migrate-CsAnnouncements

Those of you familiar with Skype for Business voice functionality will be aware of the use of announcements. Announcements are pre-determined messages that can be played when a user dials an incorrect number, unallocated number and they can even be used to route into response groups and other third party applications.

These announcements are created and assigned to a particular application server pool i.e a front end pool. This assignment means that the application server is responsible for the announcement and the response group service of that application server is used in order to play the announcement to the caller.

When this application server pool is down, the announcement service will also fail. Pool pairing and automated failover scenarios out of the box do not handle the failover of announcements to the DR application pool. Therefore, in a pure failover scenario, the announcement service is not resilient.

Many customers can often have numerous announcements for whatever reason, and the normal process of migrating these is sadly to recreate them on another pool. Even migrating from previous versions of Lync, the announcements are not automatically migrated and there is no move-csannouncement PowerShell commandlet to help.

Announcing the new function Migrate-CsAnnouncements

The purpose of this script, Migrate-CsAnnouncements.ps1 is to facilitate the copying of announcements from one application pool to another in order to save administrative effort. The function will not update unassigned number ranges as there are scenarios whereby admins may not want to.

To download the function please visit https://gallery.technet.microsoft.com/lync/Migrate-Skype-for-Business-670b4db8#content

Run the script in elevated PowerShell and then type

Migrate-CsAnnouncements –SourcePool <PoolA.domain.com> –TargetPool <PoolB.domain.com>

This will automatically copy the announcements from the source pool to the target pool.

The script supports both TextToSpeech and custom AudioFilePrompts and will import the audio prompts that are found in the source pool application folder


Here we can see that we have a number of announcements assigned to an application server pool


As we can see, we have two announcements that have audio file prompts. The audio file prompts are stored in \\pool-fileshare\share\1-ApplicationServer-X\AppServerFiles\Rgs\AS


Note: simply copying these to the target pool file share will not work, they must be re-imported as locations are written into the RGS database

Next we load the PowerShell Script Migrate-CsAnnouncements.ps1 into PowerShell


Import-Module “pathto:\Migrate-CsAnnouncements.ps1”

Next, we call the function Migrate-CsAnnouncements and specify both source and destination pools

Migrate-CsAnnouncements –SourcePool poola.domain.com –TargetPool poolb.domain.com


The script will output the announcements it copies


Running Get-CsAnnouncement and we can now see the announcements have been copied over


and on the target pool file share we can see the audio prompts have also been copied over


We can now assign the announcements from the target pool against unassigned numbers and manually failover when needed



  1. Thank you for this announcement migration script.
    Ik need it to move from 2013 to 2015
    However I get a error, maybe you know what is going wrong:

    Set-CsAnnouncement : Cannot validate argument on parameter ‘Identity’. The argument is null or empty. Provide an
    argument that is not null or empty, and then try the command again.
    Migrate-CsAnnouncements.ps1:61 char:42
    + Set-CsAnnouncement -Identity $new.Identity -TargetUri $item.TargetUr …
    + ~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (:) [Set-CsAnnouncement], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.Rtc.Management.Internal.SetAnnouncementCmdlet

  2. Exelent idea!!! but you missed a scenario: when Announcement has nor T2S neither File playback. I use that kind of annuncements to, for instance, forward multiple numbers to the same response group.

    All that your script needs it another “else” under “If (!$check)”. I added this line there:


    New-CsAnnouncement -Parent “Service:ApplicationServer:$($TargetPool)” -Name “$($item.Name)”


    At that way, you get the announcement created in the Target Pool no matter it has not T2S or File playback configured.

    BTW, this probably solves the issue that han.ten.hage@missingpiece.nl has (I had the same error and my solution was this)

  3. Hi Mark,

    Thanks for the Script. Just wanted to check if this has been updated to fix the scenario mentioned by Hen.Ten.Hage.

Leave a Reply to Zeva Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: