• Scripts para executar o Disaster Recorver do Lync 2013 (Pool Pairing)

    Os scripts abaixo podem ser usado para similar um disaster recover do Lync Server 2013 configurado com Pool Pairing, ou seja, 2 Pools Ativo-Ativo.

    Neste cenário o CMS está no pool Lyncsdt01.contoso.com e os usuários estão divididos entre os 2 Pools (Lyncsdt01.contoso.com  e Lyncsdt02.contoso.com).

    O script migra o CMS para o pool Lyncsdt02.contoso.com  e ativa todos os usuários do pool Lyncsdt01.contoso.com  no pool Lyncsdt02.contoso.com..

    Cenário onde a parade do pool Lyncsdt01.contoso.com  é programada.

    Start-CsWindowsService -ComputerName LYNCSTD01.contoso.com
    Start-CsWindowsService -ComputerName LYNCSTD02.contoso.com
    Get-CsBackupServiceStatus -PoolFqdn lyncstd01.contoso.com
    Get-CsBackupServiceStatus -PoolFqdn lyncstd02.contoso.com
    Invoke-CsManagementServerFailover -BackupSqlInstanceName RTC -BackupSqlServerFqdn lyncSTD02.contoso.com -Force:$False -Confirm:$False
    Invoke-CsPoolFailOver -PoolFqdn lyncstd01.contoso.com -DisasterMode:$False -Confirm:$False

    O script abaixo volta o CMS para o pool Lyncsdt01.contoso.com e reativa os usuários no pool Lyncsdt01.contoso.com.


    Invoke-CsPoolFailBack -PoolFqdn lyncstd01.contoso.com -DisasterMode:$False -Confirm:$False
    Invoke-CsManagementServerFailover -BackupSqlInstanceName RTC -BackupSqlServerFqdn lyncSTD01.contoso.com -Force:$False -Confirm:$False
    Get-CsBackupServiceStatus -PoolFqdn lyncstd01.contoso.com
    Start-CsWindowsService -ComputerName LYNCSTD01.contoso.com
    Start-CsWindowsService -ComputerName LYNCSTD02.contoso.com

    Cenário onde o pool Lyncsdt01.contoso.com ficou indisponível (não programado).

    OBS.: a única diferença do script acima é que os parâmetros Force (comando Invoke-CsManagementServerFailover ) e DisasterMode (comando Invoke-CsPoolFailOver) devem ser configurados como True, pois o Lyncsdt01.contoso.com  não está disponível. No script de failback (segunda parte) não há diferença, pois considera-se que na hora de fazer o failback ambos os pools estão disponíveis.

    Start-CsWindowsService -ComputerName LYNCSTD01.contoso.com
    Start-CsWindowsService -ComputerName LYNCSTD02.contoso.com
    Get-CsBackupServiceStatus -PoolFqdn lyncstd01.contoso.com
    Get-CsBackupServiceStatus -PoolFqdn lyncstd02.contoso.com
    Invoke-CsManagementServerFailover -BackupSqlInstanceName RTC -BackupSqlServerFqdn lyncSTD02.contoso.com -Force:$True -Confirm:$False
    Invoke-CsPoolFailOver -PoolFqdn lyncstd01.contoso.com -DisasterMode:$True-Confirm:$False

    Invoke-CsPoolFailBack -PoolFqdn lyncstd01.contoso.com -DisasterMode:$False -Confirm:$False
    Invoke-CsManagementServerFailover -BackupSqlInstanceName RTC -BackupSqlServerFqdn lyncSTD01.contoso.com -Force:$False -Confirm:$False
    Get-CsBackupServiceStatus -PoolFqdn lyncstd01.contoso.com
    Start-CsWindowsService -ComputerName LYNCSTD01.contoso.com
    Start-CsWindowsService -ComputerName LYNCSTD02.contoso.com

  • Como listar o Routing Groups do Lync Server 2103

    Um das novidades do Lync Server 2013 são os Routing Groups, mais detalhes vocês encontram em:(http://blogs.technet.com/b/rischwen/archive/2014/02/24/lync-2013-high-availability-deep-dive-architecture.aspx).

    Atualmente, não existem cmdlets que mostram detalhes dos Routing Groups, nem mesmo listam eles. Pois isso, consolidei o conteúdo de várias fontes e gerei um script PowerShell que conecta no SQL Server e apresenta a lista dos Routing Groups, nome do servidor Front End e usuários associados ao Routing Group.

    Para rodar o script abaixo, basta modificar a primeira linha do script ($SqlServer = ), usando o format “FrondEndServer\SQLInstance”.

    #***** Inicio do script *******

    $SqlServer = "lyncent01\rtclocal"
    $SqlDatabase = "rtc"
        
    $SqlQuery = "Select RoutingGroupAssignment.RoutingGroupName, FrontEnd.Fqdn, Resource.UserAtHost from [rtc].[dbo].ResourceDirectory
    INNER JOIN [rtc].[dbo].Resource
    ON ResourceDirectory.ResourceId=Resource.ResourceId
    INNER JOIN [rtc].[dbo].RoutingGroupAssignment
    ON ResourceDirectory.RoutingGroupId=RoutingGroupAssignment.RoutingGroupId
    INNER JOIN [rtc].[dbo].FrontEnd
    ON RoutingGroupAssignment.FrontEndId=FrontEnd.FrontEndId
    ORDER BY [rtc].[dbo].RoutingGroupAssignment.RoutingGroupId"

    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Server = $SqlServer; Database =
    $SqlDatabase; Integrated Security = True"
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = $SqlQuery
    $SqlCmd.Connection = $SqlConnection
    $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
    $SqlAdapter.SelectCommand = $SqlCmd
    $DataSet = New-Object System.Data.DataSet
    $SqlAdapter.Fill($DataSet)
    $SqlConnection.Close()
    Clear
    #output the data
    $DataSet.Tables[0]

    #***** Final do script *******

    O resultado esperado é algo como:


    RoutingGroupName                      Fqdn                    UserAtHost
    ----------------                      ----                    ----------
    fd09e63c-8643-5799-bd0c-9bd54af88858  LYNCENT03.contoso.com   RtcApplication-3dd1..
    fd09e63c-8643-5799-bd0c-9bd54af88858  LYNCENT03.contoso.com   GC-1-PersistentChat..
    fd09e63c-8643-5799-bd0c-9bd54af88858  LYNCENT03.contoso.com   Yan@contoso.com
    cc509a2a-6ebc-50e2-9ee1-140cf72076bb  LYNCENT01.contoso.com   Jeff@contoso.com
    406f2b07-bb5b-563c-a588-ae387660b98b  LYNCENT01.contoso.com   Jim@contoso.com
    a83fca89-c2a8-56fb-9a38-9f8ec8e2a983  LYNCENT03.contoso.com   Jon@contoso.com
    255e1329-a560-52b2-98d3-67c49ec81d38  LYNCENT02.contoso.com   Mike@contoso.com
    94a40ddd-e63d-50b7-a8b8-b8733245053b  LYNCENT02.contoso.com   Nate@contoso.com
    5ea41329-5003-560a-bd08-90f2cfa2560e  LYNCENT02.contoso.com   Toby@contoso.com

    Ref.: http://blogs.technet.com/b/rischwen/rss.aspx