Monitorare licenze Terminal License Server

Un Terminal License server è il ruolo che gestice la CAL da assegnare alle risorse, siano esse computers o users.

Oltre allo strumento della console può verificarsi la necessità di dover ricevere informazioni qualora il numero di licenze disponibili scenda sotto una determinata soglia.

Esistono degli strumenti di terze parti che eseguono questi controlli ma, come tutte le cose, hanno un costo non indifferente. Per questo ho creato uno script che informa via SMTP quando lo stato delle licenze diventa "critico" ed è necessario pensare ad un riacquisto.

Lo script è supportato da Windows Server 2008 e superiori.





'******************************************
'Piattaforma: 2008 std e superiori
'****************************************
'Script per controllare ed avvisare sullo stato delle licenze terminal server. Esegue il chk del tipo, se uguale a 5 allora controlla e conta. Se il totale è minore di una certa QTA allora manda la mail.
'TIPI licenza (proprietà KeyPackType degli oggetti appartenenti alla classe Win32_TSLicenseKeyPack):

'0 The Remote Desktop Services license key pack type is unknown.
'1 The Remote Desktop Services license key pack type is a retail purchase.
'2 The Remote Desktop Services license key pack type is a volume purchase.
'3 The Remote Desktop Services license key pack type is a concurrent license.
'4 The Remote Desktop Services license key pack type is temporary.
'5 The Remote Desktop Services license key pack type is an open license.
'6 The Remote Desktop Services license key pack type is built in to support Remote Desktop Services on Windows 2000 Server.


'------------- INIZIALIZZO VARIABILI
strComputer = "."
TotAv_lic = 0  'contatore licenze Disponibili
BodyMsg = ""   'Corpo messaggio MAIL
S_Avlic = 0    'Licenze Disponibili
S_BodyMSG = "" 'Corpo messaggio MAIL SUB
Qta_MinCal = 3 'Limite minimo licenze per inviare l'avviso


'================================ MAIN CODE ====================================
'------------- CREO OGGETTI
    'leggo il repository WMI per accedere alla classe
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")

    'Oggetto CDO per inviare le mail
Set objEmail = CreateObject("CDO.Message")

    'instazio ed inizializzo l'oggetto con classe Win32_TSLicenseKeyPack
Set objShare = objWMIService.ExecQuery("select * from Win32_TSLicenseKeyPack")

    'scorro la collection dei dati raccolti
for each Kobj in objshare

    'controllo tipologia di licenza
    if kobj.KeyPackType = 5 then
   
    'inserisco nel testo della mail le quantità per keypack
        BodyMsg = BodyMSG & "KeyPackID: " & Kobj.KeyPackId & chr(13) & "Versione: " & kobj.ProductVersion  & chr(13) & "Totale licenze: " & kobj.TotalLicenses & chr(13) & "Licenze Emesse: " & kobj.IssuedLicenses & chr(13) & "Licenze disponibili: " & kobj.AvailableLicenses & chr(13) & "--------" & chr(13) & chr(13)
       
    'eseguo controllo licenze presenti e disponibili   
        If  kobj.AvailableLicenses > 0 then
    'sommatoria totale licenze disponibili
                TotAv_lic = TotAv_lic + kobj.AvailableLicenses
        end if       
       
    end if
   
next

    'Se il totale licenze disponibile è minore di Qta_MinCal allora mando la mail di avviso
    If Qta_MinCal >= TotAv_lic then
        Mailsend TotAv_lic, BodyMSG
    end if
'===============================================================================
   
   
'========================= SUB & FUNCTION =====================================
'*********************************************************************
SUB MailSend (S_Avlic, S_BodyMSG)

    'indirizzo mittente
        objEmail.From = "Licenze@MyDomain.it"
       
    'indirizzo destinatario NB: IL DOMINIO DEVE ESSERE ACCETTATO DAL SERVER SMTP
        objEmail.To = "MONITOR@MyDomain.it"
       
    'oggetto messaggio
        objEmail.Subject = "ATTENZIONE: controllare numero CAL Terminal Server"
       
    'Testo messaggio
        objEmail.Textbody = "Il numero delle CAL disponibili è: " & S_Avlic & "." & chr(13) & chr(13) & S_BodyMSG
       
    'Parametri di invio
        objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
        objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "SMTP.MyDomain.local"
        objEmail.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
       
    'scrittura parametri
        objEmail.Configuration.Fields.Update
       
    'invio mail
        objEmail.Send
       
END SUB
'*********************************************************************
'===============================================================================