How to list all PSTN calls in OCS 2007R2

Problem

I needed a list of all calls leaving and entering the organisation via the Mediation servers IP trunk for invoice control. We suddenly detected a large increase in the volume of external calls through our OCS, and wanted to make sure the calls were actual calls and not misconfigured call redirection or something else. We had already deployed the monitoring role, but it was not logging any calls. This was due to an MSMQ error, which meant that the monitoring server could not receive any log messages. I fixed that and waited a couple of days for the data to accumulate. Then I had to find a report to give me the data I wanted. The default OCS reporting services reports allows me to list all the calls for a specific user, but I wanted to list all PSTN calls for all users.

Solution

First I tried to modify the included reports, but they were closely linked to several stored procedures, who again called other stored procedures and gave me far to much data anyhow. So I gave up that approach and started looking at the tables in the database. At http://technet.microsoft.com/en-us/library/dd819961(office.13).aspx I found a nice reference of all the QOE database tables. This enabled me to construct the following query:

USE [QoEMetrics]
GO

select us.URI as CallerURI, us2.URI as CalleeURI, StartTime, EndTime, 
datediff(Second, StartTime, EndTime) as DurSeconds ,
CONVERT(varchar(6), datediff(Second, StartTime, EndTime)/3600)
+ ':' + RIGHT('0' + CONVERT(varchar(2), (datediff(Second, StartTime, EndTime) % 3600) / 60), 2)
+ ':' + RIGHT('0' + CONVERT(varchar(2), datediff(Second, StartTime, EndTime) % 60), 2) as DurHMS, CallerEndpoint, CalleeEndpoint

from Session se
join [User] us on se.CallerURI = us.UserKey
join [User] us2 on se.CalleeURI = us2.UserKey
where (CalleeEndpoint = 1 or CalleeEndpoint = Null or CallerEndpoint = 1 or CallerEndpoint = Null) and StartTime Between '2011-03-08' and '2011-03-09'

The where statement is where the magic happens. You have to tailor this to your needs.

First it checks the endpoints, which identifies the caller and callee type. The endpoint ID’s are found in the Endpoint table. In my case, ID 1 translates to the mediation server. If you have more than one mediation server, you will have to add entries for all of them. A PSTN call will have the mediation server as an endpoint if the number is registered in Active Directory. Otherwise, the endpoint will be null. If the endpoint has a value other than null or the mediation server’s id, it refers to another computer running the OCS client. The endpoint table lists the computernames.

The second part of the where statement defines the timeframe from 00:00 on the first date to 00:00 on the second date. StartTime Between ‘2011-03-08’ and ‘2011-03-09’ will return all calls made between 2011.03.08 00:00:00 and 2011.03.09 00:00:00.

Running this query will list the calls made in the specified timeframe where one of the parties is on the PSTN. If you want to list outbound calls only, use this version:

USE [QoEMetrics]
GO

select us.URI as CallerURI, us2.URI as CalleeURI, StartTime, EndTime, 
datediff(Second, StartTime, EndTime) as DurSeconds ,
CONVERT(varchar(6), datediff(Second, StartTime, EndTime)/3600)
+ ':' + RIGHT('0' + CONVERT(varchar(2), (datediff(Second, StartTime, EndTime) % 3600) / 60), 2)
+ ':' + RIGHT('0' + CONVERT(varchar(2), datediff(Second, StartTime, EndTime) % 60), 2) as DurHMS, CallerEndpoint, CalleeEndpoint

from Session se
join [User] us on se.CallerURI = us.UserKey
join [User] us2 on se.CalleeURI = us2.UserKey
where (CalleeEndpoint = 1 or CalleeEndpoint = Null) and StartTime Between '2011-03-08' and '2011-03-11'

Klart det kan virtualiseres!

Det er svaret man får i 19 av 20 tilfeller om man spør noen som skal ha greie på virtualisering om en gitt tjeneste kan virtualiseres. Og de har stort sett rett. Problemet er at man stiller feil spørsmål. Isteden må man spørre seg: “Bør jeg virtualisere tjeneste x i mitt virtualiseringsmiljø? Og “Passer det med min virtualiseringsstrategi?”

Det er nemlig ikke gitt at forskjellige tjenester passer sammen i det samme virtuelle miljøet. Særlig ikke om man har satset og investert tungt i automatisk lastbalansering og høy oppetid.

Virtualisering er fremtiden, ingen tvil om det. Det gjør at man kan utnytte hardware mye mer effektivt en før, man kan spare store penger på strømutgifter og hardwarekostnader, og man kan oppfylle målsetninger om grønn IT og lavere karbonfotavtrykk. Det er ikke uvanlig å kjøre over 20 virtuelle servere på en fysisk vertsmaskin. Nå skal man riktignok ikke legge for mye i slike tall, for dersom man måtte kjøpe fysiske maskiner isteden hadde man sannsynligvis hatt færre servere med flere tjenester på hver server.

Man får også andre fordeler, som muligheten til å skifte ut hardware uten at serveren merker det, og muligheten til å flytte en virtuell server mellom flere vertsmaskiner mens den går slik at vedlikehold blir enklere. Det er rett og slett et stort fremskritt, noe som gjør at man lett sier at alt skal virtualiseres så langt det lar seg gjøre. Og det kan man stort sett oppnå, men det er ikke sikkert at det alltid er like lurt. Dersom man har et cluster med vertsmaksiner der gjennomsnittsserveren er tildelt 5GiB minne er det ikke sikkert at man bør legge inn servere som drar 50GiB i samme cluster.

Jeg skal ikke påstå å ha inngående kjennskap til virtualiseringsplattformer, men jeg har jobbet med optimalisering av Windows-servere siden NT 4, og en server med en gitt tjeneste trenger en viss mengde ressurser uansett om den er fysisk eller virtuell. Denne artikkelen handler mest om mine erfaringer med drift av forskjellige servertyper i virtuelle miljø. Se også artikkelen om Memory Overcommit der jeg skriver om problemer som kan oppstå om man ikke følger med på hvor mye minne som er i bruk på vertsmaskinene.

Continue reading “Klart det kan virtualiseres!”

Failed extract of third-party root list from auto update cab

Background

This is an annoying message that shows up in the Event Log on Windows servers and computers and won’t go away. The error was initially caused by a certificate update published by Microsoft at the end of 2010 containing expired root certificates. The error has continued to surface on systems though, so I am starting to wonder if it has more than one cause. One theory is that this happens when an administrator is logged or has an active but disconnected session on the computer while another administrator or some form of automation tries to install updates from Windows Update.

Symptoms and findings

The error is detected in the Application Event Log. On Windows server 2008 it looks like this:

SNAGHTML1083d214

Event 11 from Microsoft-Windows-CAPI2

Or like this:

SNAGHTML8f7d7b

Event 4017 from CAPI2

On Windows Server 2003:

SNAGHTML108e5b5f

Event 11 from crypt32

Solution

Microsoft has released a fixit that has solved this problem for me on most of the servers I have applied it to: Fix it 50531. See KB 2328240 for details and a manual method. This fixit only works on Windows 2008/7 though, but the manual method should work for older versions as well, provided you substitute “Documents and settings” were it says “Users” in the KB.

The solution is to delete the files in the folders referenced in the KB. You have to check all users and system accounts, unless you know which user ran windows update when the problem first appeared on your system.

Service account profile folder locations:

  • %windir%\ServiceProfiles\[Service Account]\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content
  • %windir%\ServiceProfiles\[Service Account]\AppData\LocalLow\Microsoft\CryptnetUrlCache\MetaData

User account profile folder locations:

    • C:\Users\[Account]\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content
    • C:\Users\[Account]\AppData\LocalLow\Microsoft\CryptnetUrlCache\MetaData

    SNAGHTML895cf0

    After deleting the files, check back a couple of hours and see if the error resurfaces. If you want to test it immediately, download the “authrootstl.cab” file from the link in the event and try to install it.

    Update: 20121018

    A colleague of mine has written a small powershell script that seems to do the trick on Win2008R2 servers:

    get-childitem -path 'c:\users' | where-object { $_.psiscontainer -eq $true } | foreach-object {
        $contentfolder  = join-path -path $_.fullname -childpath 'appdata\locallow\microsoft\cryptneturlcache\content\'
        $metadatafolder = join-path -path $_.fullname -childpath 'appdata\locallow\microsoft\cryptneturlcache\metadata'
        if (test-path -path $contentfolder ) { remove-item -path "$contentfolder\*"  -force -verbose }
        if (test-path -path $metadatafolder) { remove-item -path "$metadatafolder\*" -force -verbose }
        }
    

    This is quicker to implement than the “Fix it” or manual approach, and all our attempts have been successful so far.

    Virtual Server memory Oversubscription og Overcommit, en oppskrift på katastrofe?

    Etter å ha feilsøkt en del sære feil på virtuelle maskiner i et ESX miljø, bestemte jeg meg for å finne ut mer om hvordan minnehåndtering fungerer i virtuelle miljøer generelt og VMWare spesielt. Jeg har ikke så mye erfaring med oppsett av virtuelle miljøer for produksjon. For meg er det mest en plattform som en del av serverne jeg drifter kjører på, og som jeg må forholde meg til fra den siden. Etter å ha forsket litt på saken kom jeg frem til at en del av mine problemer nok skyldtes Memory Overcommit og det beslektede Memory Oversubscription. Memory Overcommit er et mye brukt uttrykk som virker å ha forskjellig betydning ut fra hvilken bakgrunn man har, derfor begynner jeg med å definere begrepene slik jeg ser dem.

    Continue reading “Virtual Server memory Oversubscription og Overcommit, en oppskrift på katastrofe?”

    How I finally upgraded the firmware on a Polycom CX700 running 1.0.522.73

    SNAGHTML244d5f8bA long and sad story about trouble upgrading the firmware in Office Communication Server enabled phones, specifically the Polycom CX700. This particular problem manifests itself as follows: The phone logs on to the server successfully and gets almost to the end of the login process. Then it crashes and automatically reboots. This goes on in an endless loop, and is caused by the phone running software not compatible with OCS 2007 R2. I post this hoping that it will be of help to others on a similar quest.

    The problem

    For about a year now, since we started our OCS pilot, I’ve had a Polycom CX700 on my desk. Actually, it has spent the bulk of that time on a shelf at my desk. It was purchased as a test device along with a collection of headsets and other OCS enabled devices. Most of them worked fine, but this one I just couldn’t seem to get working. After a lot of fiddling about I was able to log in successfully with a test user that had never ever logged on to any other device or computer. I happily thought I had it fixed, but as soon as I switched to another user it went back to the same old pattern: logon, crash and reboot in an endless loop.

    Continue reading “How I finally upgraded the firmware on a Polycom CX700 running 1.0.522.73”

    Cluster disker på passiv node og WWN på HBA

    Ved feilsøking av noen rare clusterproblemer begynte jeg plutselig å lure på hvordan clusterdisker var representert på den passive noden i et Windows 2008 cluster. De var nemlig ikke å se i Disk Management, og forsøk på failover av diskressurser feilet spektakulert og fullstendig. Litt forskning viste kjapt at joda, de skulle vært listet omtrent som dette:

    image

    Dermed måtte feilen være et annet sted. Litt mer fundering avslørte at vi hadde oppdatert bios og managementprosessor på dette clusteret for kort tid siden, og vi begynte å ane hvor grevlingen var. Av en eller annen grunn hadde ikke serveren fått satt riktig WWN ved omstart. Dette er et IBM HS22 blade med Qlogic HBA som får sine WWN fra managementmodulen, og en rask sjekk i SanSurfer avslørte at WWN ikke stemte overens med det som var definert i SANet. Dermed trengs en kaldstart av managementmodueln i bladet, noe som betyr å slå av serveren, trekke ut bladet, vente et minutt og sette det inn igjen. Deretter må man vente en 5 minutters tid mens IMM booter. Man kan se at den er ferdig ved at powerlyset i front av bladet begynner å blinke med betydelig langsommere takt. Først da vil bladet la seg slå på.

    Update: Det har også fungert i enkelte tilfeller å ta en full shutdown av bladet, vente to minutter og så starte det igjen. Det er verdt et forsøk, da man sparer en tur til serverrommet.

    Samme situasjon har jeg tidligere opplevd på HP BL460 blade. Disse har vanligvis Emulex-kort som liker å komme opp med blank WWN (00-00-00-…), eller med en WWN som begynner på 1 istedenfor 5. Dette er noe som er litt lettere å oppdage enn et nummer som er tilsynelatende riktig. Løsningen er den samme, ut med bladet for å få kaldstartet managementmodulen.

    SNAGHTML109f57a

    Dersom feilen oppstår på en helt ny server/nytt HostBusAdapter er det vanligvis firmware på HBA som er utdatert eller på annen måte ikke samsvarer med firmware til bladets managementmodul. Emulex liker å splitte denne i flere deler, en HBA bios og en HBA firmware, pass på at du oppdaterer alle. Og oppdater firmware på bladet samtidig. Det anbefales å bruke firmware fra bladeprodusenten og ikke fra Qlogic/Emulex. Pass også på at du oppdaterer firmwaren til den sentrale managementmodulen på IBM Bladecenter samtidig. Denne kalles AMM. På HP C7000 har man ofte Virtual Connect fibermoduler istedenfor fiberswitcher fra feks Brocade. Rent teknisk er det store forskjeller på AMM og Virtual Connect, men i denne sammenhengen er det viktigste at versjonene stemmer overens.

    Outlook 2010 i buffret modus mot Exchange 2003

    Problem

    Oppdatering av offline adress book og teamkalender tar lang tid eller skjer ikke dersom Outlook 2010 er satt opp til å bruke bufret modus mot en Exchange 2003 server med front-end og back-end.

    Problemet kan enklest reproduseres ved å booke en ressurs. Dersom man har satt opp direktebooking riktig, (se http://plo.lokna.net/?p=477), vil ressursens kalender bli oppdatert. Dog vil man ikke se det samme dersom man har ressursens kalender åpen i egen Outlook (teamkalender) før man restarter Outlook, bytter nettverkstilkobling eller restarter maskinen. Hva som skal til for å trigge en synk varierer.

    Jeg har ikke lykkes i å identifisere årsaken til dette, men problemet er reproduserbart hos min arbeidsgiver. Løsningen har jeg derimot funnet, så jeg har ikke søkt så lenge etter årsaken.

    Løsning 1 – Gi blaffen i bufret modus

     

    Dersom man bruker online modus fungerer alt uten problemer. Om man har en stasjonærmaskin tilknyttet direkte i samme nettverk som Exchange-serveren er det egentlig ikke nødvendig å bruke bufret modus. Man får dog litt tregere søk i innboksen, og dersom man har en stor postkasse kan dette påvirke ytelsen til systemet. Dette er dermed egentlig ikke å anbefale, men det fungerer.

    Løsning 2 – Sette opp proxy for bufret modus

    Aller først må man sjekke at bufret modus er på:

    SNAGHTML5c2a448

    Deretter må man sette opp frontend-server proxyinnstillingene som følger:

    image

    Altså:

    • Slå på SSL og sertifikatautentisering
    • Aktiver NTLM-godkjenning
    • Velg HTTP først uansett nettverkshastighet

    Problemer med reservasjon av ressurser mot Exchange 2003 via Outlook 2010

    Problem

    Dersom man har møterom eller andre ressurser i Exchange 2003 som er aktivert for direct booking hender det at Outlook 2010 ikke klarer å registrere reservasjoner, og de blir liggende i innboksen til ressursen som ubesvart/tentativ. Det hender at reservasjonen går igjennom etter noe tid, og det hender at det virker fint, men av og til så virker det bare ikke. Dette kommer av at Outlook 2010 ikke aktiverer støtte for DirectBooking som standard, men istedenfor sender forespørselen på mail til ressursen. Siden de fleste ressurskontoer er “hodeløse” og aldri blir åpnet av en klient er man avhengig av offlineprossesering på serveren. Continue reading “Problemer med reservasjon av ressurser mot Exchange 2003 via Outlook 2010”

    Datofeltenes forbannelse

    Av og til må man hente ut data fra en tabell basert på dato eller tid. Slike tabeller har gjerne en egen tidsmerkekolonne, eller timestamp som det egentlig heter. Problemet er at datatypen som passer i de aller fleste databasemotorer også har en tidskomponent, slik at det er forskjell på 20100830153312 og 20100830073658 selv om de begge er fra samme dag. Man kan selvsagt jukse og sette denne til null, slik at alt blir merket med dato sånn og sånn klokken 00:00:00, men det er ikke så praktisk og krever at man tar hensyn til det hver gang man legger inn data. Og for å gjøre dette morsommere finnes det knapt noen datofunksjoner som er standardiserte på tvers av databaseplattformer, så man må finne de som passer til den versjonen man har. Dette har gitt meg mye “glede” opp gjennom årene, og siden jeg jobber med sånt forholdsvis sjelden forsøker jeg nå å dokumentere noe av det jeg stadig må finne opp på nytt.

    Continue reading “Datofeltenes forbannelse”

    Kopiere en MSSQL-database

    Bakgrunn

    Prosedyren beskriver to metoder for å ta en fullstendig kopi (snapshot) av en database på filnivå. En slik backup gir hurtig restore, og kan med fordel brukes før man tester oppgraderinger eller om man ønsker en kopi av databasen for testformål. Eksemplene er fra en MSSQL 2008 server, men prosedyren kan brukes på de fleste MSSQL versjoner. Grensesnittet er varierer på de forskjellige versjonene, men det bør ikke være så vanskelig å finne igjen bildene på en nyere eller eldre utgave. Continue reading “Kopiere en MSSQL-database”