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.