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.
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 |
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 Configuration → Preferences → Windows Settings → Files → 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:
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 Configuration → Preferences → Windows Settings → Control Panel Settings → Scheduled 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):
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 :-)
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! :-)