Kace: una rispolverata a NotifyKace.vbs (0.5) e uso delle GPO

| |

Di NotifyKace ne abbiamo già parlato un paio di volte in passato. Tutto è nato da una migrazione dell’appliance e relativa necessità di verificare che gli agent fossero correttamente installati e comunicanti con essa. Nel frattempo NotifyKace è cresciuto, si è evoluto e ha dato maggiori informazioni, permettendomi anche di richiamarlo facilmente in fase di login al dominio (inizialmente) o GPO (oggi). Ti racconto le ultime novità introdotte, così che anche tu possa sostituirlo a quello che forse hai in uso attualmente, ammesso che calzi a pennello la nuova soluzione adottata.

Kace: una rispolverata a NotifyKace.vbs (0.5) e uso delle GPO

Parti dalle basi

Se non hai idea di cosa sto parlando, ti invito a leggere l’articolo originale scritto un anno fa circa, è ancora valido e ti insegna alcuni trucchi per gestire i tuoi agenti Quest Kace, tutto sommato è ciò su cui baso lo sviluppo di NotifyKace:

Kace: un alert in caso di client mancante o inventario troppo vecchio

Ciò detto

Si può passare alla nuova versione dello script VBS, arrivata alla 0.5, che integra una funzione per l’invio della mail di allerta, un nuovo controllo riguardo l’esistenza del database di inventario e la rimozione delle esclusioni hostname perché oggi, a differenza di ieri, uso una GPO per arrivare direttamente sulle macchine interessate, lo script non viene quindi eseguito su endpoint che non devono avere l’agente Quest a bordo.

Il tutto si traduce con questo:


' Verifica esistenza servizio QUEST Kace (KONEA) e ultimo inventario
' ———————————————————————————————————–
' Author: GSolone
' Version: 0.5
' Last modified: 22-10-2018
' Credits: https://www.symantec.com/connect/downloads/vbscript-delete-old-files
' http://www.robvanderwoude.com/vbstech_network_ip.php
' http://www.robvanderwoude.com/vbstech_network_names_computer.php
' https://social.technet.microsoft.com/Forums/en-US/a8d29535-217e-46c0-bd94-0a203a322015/current-logged-in-user-using-vbscript?forum=ITCG
' https://gallery.technet.microsoft.com/scriptcenter/01fcf945-ad73-44e0-8cb5-152432bc6bcf
' https://rcmtech.wordpress.com/2011/04/15/vbscript-instr-with-the-and-operator/
' https://stackoverflow.com/questions/11879612/qtp-checking-if-an-array-of-strings-contains-a-value
' https://stackoverflow.com/questions/3031497/how-to-verify-if-file-exist-with-vb-script
' http://www.morpheusweb.it/html/manuali/vbscript/vbscript_procedure.asp
' ————————————————————————————————————
' UPDATES:
' 0.5- rimosso controllo macchine da escludere, la GPO viene applicata solo sulle macchine dove serve far girare lo script. Corretto inoltre riferimento a utente connesso (che nel nuovo caso GPO è sempre SYSTEM), da "Utente connesso" a "Utente che ha lanciato il check".
' 0.4- ho aggiunto un check in più relativo all'esistenza del kinventory.db (ancora prima di verificarne l'ultima data di aggiornamento). Ho isolato l'invio mail in una funzione (MailtoKacelog) e la richiamo dove serve.
' 0.3- allineato con Kace 8.0.318 e bundle agenti 8.0.152, la cartella di installazione dell'agent è adesso sotto %ProgramFiles(x86)%\Quest (si abbandona la \Dell). Modifico i puntamenti.
' 0.2 rev1- ho aggiunto una esclusione in lista e ho splittato l'array nella modalità "1 riga, 1 esclusione" (in ordine alfabetico)
' 0.2- ho fatto merge di tutti gli ignore dei vari domini (un solo script, copiato ovunque), utilizzando un Array di hostname da escludere.
Dim oFSO, oFolder, sDirectoryPath
Dim oFileCollection, oFile, sDir
Dim iDaysOld
sDirectoryPath = "C:\ProgramData\Quest\Kace"
Set objNTInfo = CreateObject("WinNTSystemInfo")
Set objMessage = CreateObject("CDO.Message")
Set oFSO = CreateObject("Scripting.FileSystemObject")
Set wshShell = CreateObject("WScript.Shell")
Set oFolder = oFSO.GetFolder(sDirectoryPath)
Set oFileCollection = oFolder.Files
Set objNetwork = CreateObject("Wscript.Network")
Set objSysInfo = Createobject("ADSystemInfo")
iDaysOld = 10
strComputerName = wshShell.ExpandEnvironmentStrings("%COMPUTERNAME%")
' ===== FUNCTION MAILTO KACELOG GROUP ===============================================================================================
Function MailtoKacelog(Destination, DestinationCC, DestinationBCC, MailBody, Subject)
strQuery = "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE MACAddress > ''"
Set objWMIService = GetObject( "winmgmts://./root/CIMV2" )
Set colItems = objWMIService.ExecQuery( strQuery, "WQL", 48 )
For Each objItem In colItems
If IsArray(objItem.IPAddress) Then
If UBound(objItem.IPAddress) = 0 Then
strIP = "<li>IP macchina: <strong>" & objItem.IPAddress(0) & "</strong></li>"
Else
strIP = "<li>IP macchina: <strong>" & Join( objItem.IPAddress, ", " ) & "</strong></li>"
End If
End If
Next
MailBody = MailBody & strIP &_
"<li>Utente che ha lanciato il check (se rilevato): <strong>" & objNetwork.UserName & "</strong></li>" &_
"<li>DN utente connesso (se rilevato): <strong>" & objSysInfo.UserName & "</strong></li>"
objMessage.Subject = Subject
objMessage.From = "Management – Alert Kace <kacelog@contoso.com>"
objMessage.To = Destination
objMessage.Cc = DestinationCC
objMessage.Bcc = DestinationBCC
objMessage.HTMLBody = MailBody
objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
objMessage.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.contoso.com"
objMessage.Configuration.Fields.Update
objMessage.Send
End Function
' ===== VERIFICA ESISTENZA SERVIZIO KONEA, QUINDI VERIFICA ULTIMO INVENTARIO ========================================================
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colRunningServices = objWMIService.ExecQuery("Select * from Win32_Service Where Name='konea'")
nItems = colRunningServices.Count
' If the collection count is greater than zero the service will exist.
If nItems > 0 Then
'Test esistenza %ProgramData%\Quest\Kace\kinventory.db
If (oFSO.FileExists(sDirectoryPath & "\kinventory.db")) Then
'MsgBox("Debug: kinventory.db found " & strComputerName)
Else
Destination = "kacelog@contoso.com"
DestinationCC = ""
DestinationBCC = ""
MailBody = "KACE Agent: kinventory.db non rilevato, verificare quanto prima da console.<br /><br />" &_
"<li>Workstation: <strong>" & strComputerName & "</strong></li>"
Subject = "KACE Agent: kinventory.db non trovato su " & strComputerName
Call MailtoKacelog(Destination, DestinationCC, DestinationBCC, MailBody, Subject)
End If
For each oFile in oFileCollection
'DEBUG: il file cacert.pem è sempre più vecchio dei 10 giorni (su macchine già avviate da tempo), si può utilizzare per verificare che lo script lo rilevi e invii alert mail:
'If oFile.Name = "cacert.pem" Then
If oFile.Name = "kinventory.db" Then
If oFile.DateLastModified < (Date() – iDaysOld) Then
Destination = "kacelog@contoso.com"
DestinationCC = ""
DestinationBCC = ""
MailBody = "KACE Agent <strong>non connesso o non aggiornato</strong>, verificare quanto prima da console.<br /><br />" &_
"<li>Workstation: <strong>" & strComputerName & "</strong></li>"
Subject = "KACE Agent non aggiornato o non connesso su " & strComputerName
Call MailtoKacelog(Destination, DestinationCC, DestinationBCC, MailBody, Subject)
End If
End If
Next
Set oFSO = Nothing
Set oFolder = Nothing
Set oFileCollection = Nothing
Set oFile = Nothing
Else
Destination = "kacelog@contoso.com"
DestinationCC = ""
DestinationBCC = ""
MailBody = "KACE Agent <strong>non installato</strong>, installare quanto prima.<br /><br />" &_
"<li>Workstation: <strong>" & strComputerName & "</strong></li>"
Subject = "KACE Agent non installato " & strComputerName
Call MailtoKacelog(Destination, DestinationCC, DestinationBCC, MailBody, Subject)
End If

view raw

NotifyKace.vbs

hosted with ❤ by GitHub

Della GPO per l’esecuzione programmata ne parliamo tra poco, nel frattempo i passaggi che più possono interessarti sono quelli relativi all’invio della comunicazione (a mezzo a posta elettronica), ora eseguito tramite funzione dedicata Call MailtoKacelog(Destination, DestinationCC, DestinationBCC, MailBody, Subject) e la verifica dell’esistenza del file di inventario (che puoi rinominare temporaneamente per verificare che lo script funzioni in maniera corretta):

'Test esistenza %ProgramData%\Quest\Kace\kinventory.db
If (oFSO.FileExists(sDirectoryPath & "\kinventory.db")) Then
'MsgBox("Debug: kinventory.db found " & strComputerName)

Il MsgBox commentato è lasciato lì volutamente nel caso in cui tu volessi vedere a video un popup di debug a conferma dell’esistenza del file; in uno script di produzione non ha invece senso lasciarlo senza commento. Ciò detto, null’altro cambia ma rimane più snello e pulito, con il rilevamento di indirizzo IP e ulteriori dettagli integrati nella funzione di MailtoKacelog.

Esecuzione programmata

Che poi è un po’ il succo del discorso che più cambia rispetto al passato. L’evoluzione della verifica consiste nella sua “rimozione” dalla fase di login, portandola invece all’interno dell’Utilità di pianificazione di Windows. L’operazione è costituita da due passaggi: il primo ti permetterà di copiare il file dello script all’interno dei tuoi PC, il secondo consisterà nell’inserimento dell’operazione programmata, che potrà essere poi eseguita secondo tue esigenze.

Copia del file

Crea una nuova GPO (o modificane una esistente che riguarda Kace) e naviga in Computer ConfigurationPreferences Windows SettingsFiles → Aggiungi un file da copiare sulla destinazione (che equivale al PC raggiunto dalla GPO), è qui che dovrai dirgli dove andare a recuperare il file VBS e in che cartella finale copiarlo. Ti propongo il riassunto catturato dalla GPO che stiamo attualmente utilizzando:

Kace: una rispolverata a NotifyKace.vbs (0.5) e uso delle GPO 1

Il file NotifyKace.vbs si trova in una share di rete raggiungibile da ogni nostro PC, verrà quindi copiato all’interno della cartella %ProgramData%\Quest, destinazione già presente sulle macchine proprio perché creata e quotidianamente utilizzata dall’agente Quest. Da qui si potrà certamente eseguire manualmente il controllo, oppure procedere con la seconda parte, quella della programmazione dell’operazione automatica.

Operazione programmata tramite Utilità di pianificazione

La seconda parte della GPO è quella che puoi creare e mettere in funzione navigando Computer ConfigurationPreferences Windows SettingsControl Panel SettingsScheduled Tasks → Crea un nuovo Scheduled Task (At least Windows 7) chiamato come meglio credi (nel mio caso è KACE check) e fagli eseguire un programma, puntandolo ovviamente a %ProgramData%\Quest\NotifyKace.vbs con i privilegi elevati e l’attivazione quotidiana all’orario che preferisci (nel mio caso le 12:00):

Kace: una rispolverata a NotifyKace.vbs (0.5) e uso delle GPO 2

In conclusione

Salvo errori, la configurazione del tuo nuovo controllo è terminata. Applica la GPO alle unità organizzative che contengono i PC del tuo dominio, attendi quindi che questa si propaghi e che inizi a svolgere il suo mestiere. Fai qualche test su macchine non in produzione, accertati che tutto funzioni correttamente, gioca con il file di inventario (magari rinominandolo in modo da non farlo rilevare al VBS e farti inviare così la mail di allerta per database non trovato), poi procedi con tutto il resto del parco macchine.

In caso di dubbi o anomalie, l’area commenti è a tua totale disposizione.

Buon lavoro :-)

Correzioni, suggerimenti? Lascia un commento nell'apposita area qui di seguito o contattami privatamente.
Ti è piaciuto l'articolo? Offrimi un caffè! ☕ :-)

L'articolo potrebbe non essere aggiornato

Questo post è stato scritto più di 5 mesi fa, potrebbe non essere aggiornato. Per qualsiasi dubbio ti invito a lasciare un commento per chiedere ulteriori informazioni! :-)

Condividi l'articolo con i tuoi contatti:
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Commenti
Inline Feedbacks
View all comments