26 stycznia 2020

Response Groups Service - agenci widma

Jedną z ciekawszych funkcjonalności dla połączeń głosowych, istniejących w Skype for Business (która zresztą była dostępna już w OCS) jest Response Group Service. W RGS definiowane są kolejki, do których przypisujemy grupy agentów, do których kierowane są rozmowy. Niestety, wyłączenie użytkownika w SfB nie usuwa agenta z grupy (jest w niej zapisywany adres SIP URI agenta), co oczywiście może powodować problemy, przy próbie zestawienia rozmowy z takim kontem. Podobnie można wyłączyć użytkownikowi Enterprise Voice, jednak to również nie usuwa agenta z grupy, co również będzie powodowało nieoczekiwane problemy w działaniu usługi.
Jak możemy zweryfikować, czy w naszych grupach agentów znajdują się niepoprawne obiekty? Ciekawy artykuł i skrypt do wykrywania takich agentów zombie udostępnił na swoim blogu Greig Sheridan. Pomysł oparł na zweryfikowaniu istnienia zdarzeń typu Warning o numerach 31137 lub 31137 w Event Logu.  Zdarzenia te ostrzegają właśnie o znalezieniu agenta z wyłączonym EV lub nieistniejącego w AD. W zależności od użytego przełącznika możemy wykonać raport lub od razu usunąć niepoprawnych agentów.
Jednak przy dużej ilości serwerów Front End w organizacji, weryfikacja logów na wszystkich serwerach może nie być specjalnie efektywna. Alternatywnie można wykorzystać inną metodę weryfikacji agentów. Jedną z metod jest odpytanie serwera backend SQL, gdzie w bazie rgsconfig jest tabela z listą agentów, w której możemy sprawdzić status EV agenta, poniższą komendą:
SELECT *
  FROM [rgsconfig].[dbo].[Agents]
  Where EnterpriseVoiceEnabled = 0
Możemy również użyć skryptu, który będzie sprawdzał właściwości poszczególnych agentów, poprzez sprawdzenie w pętli członków grup agentów (cmdlet Get-CsRgsAgentGroup). Ja napisałem sobie do tego funkcję:
function checkRGSpool {
    param (
        [string]$poolname
    $agentgroups = Get-CsRgsAgentGroup | Where-Object OwnerPool -eq $poolname
    ForEach ($agentgr in $agentgroups) {
        $groupname = $agentgr.Name
        write-host "Processing $groupname"
        if ($agentgr.AgentsByUri.count -gt 0) {
            $agents = $agentgr.AgentsByUri
            foreach ($agent in $agents) {
                $agent = $Agent.tostring()
                # write-host "Agent $agent"
                Try {
                    $currentagent = get-csuser $agent -ErrorAction Stop
                }
                Catch [Exception] {
                    write-host "Ghost agent found: $agent" -ForegroundColor Yellow
                }
                $agentlist += $agent
            }
        }
        else {
            write-host "$groupname has no Agents" -ForegroundColor Yellow
        }
    }
}

Możemy oczywiście funkcję rozbudować również o weryfikację statusu EV, ale to w kolejnej iteracji.