none
Microsoft Security Essentials: forzare o pianificare gli aggiornamenti RRS feed

  • Discussione generale

  • Microsoft Security Essentials (MSE) è un ottimo antimalware ed oltre ad usare il meccanismo delle "dynamic signatures", utilizza anche dei normali aggiornamenti che vengono scaricati ad intervalli più o meno regolari... ora, può capitare che, per vari motivi, si desideri forzare un controllo/aggiornamento delle firme ad intervalli di tempo ben definiti; a tale scopo si potrà utilizzare un oggetto esposto dal "motore" di Microsoft Update (lo stesso usato sia per i normali aggiornamenti che per le firme di MSE) e documentato qui; come è facile capire, per usare tale oggetto è necessario mettere insieme un minimo di codice ed è proprio a questo scopo che ho scritto quanto segue

     

    '
    ' MSE update script
    '
    
    Option Explicit
    
    ' file I/O
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    
    '__boot() {
      Dim arg, fso
      Dim gsLogFile
      
      Set arg = WScript.Arguments
      Set fso = CreateObject("Scripting.FileSystemObject")
      WScript.Quit main(arg.Count, arg)
    '}  
      
    ' main entry  
    Function main(argc, argv)
      Dim nRet
    
      On Error Resume Next
      nRet = 0
      main = nRet
        
      ' log file (auto rollover)
      gsLogFile = fso.GetFolder(".") & "\" & _
                  "mseupdate-" & _
                  Right("00" & Month(Now), 2) & _
                  ".log"
      
      ' update MSE
      nRet = UpdateMSE()
    
      ' exit (errorlevel)
      main = nRet
    End Function
    
    ' log to file
    Sub logmsg(sMsg)
      Dim fp, sBuff
    
      On Error Resume Next
      ' add day and time
      sBuff = Right("00" & Day(Now), 2) & " " & _
              Time() & " " & _
              sMsg
      Set fp = fso.OpenTextFile(gsLogFile, ForAppending, True)
      fp.WriteLine sBuff
      fp.Close
    End Sub
    
    ' log to console
    Sub printf(sTxt)
      On Error Resume Next
      WScript.StdOut.WriteLine sTxt
      logmsg sTxt
    End Sub
    
    ' print error
    Sub perror(sSrc)
      Dim sErr
      
      sErr = "Error: 0x" & Hex(Err.Number) & " " & Err.Description
      If Len(sSrc) > 0 Then
        sErr = sErr & " - " & sSrc
      End If
      printf sErr
    End Sub
    
    ' updates MSE
    Function UpdateMSE()
      Dim objUPDSession, objUPDSearch
      Dim colResults, objUpdate
      Dim colDownloads, objDownload
      Dim colInstall, objInstaller
      Dim objInstallResult
      Dim i, j, bFound
    
      ' init
      On Error Resume Next
      UpdateMSE = 0
      Err.Clear
    
      ' init WU
      printf "Initializing Microsoft Update engine..."
      Set objUPDSession = CreateObject("Microsoft.Update.Session")
      Set objUPDSearch = objUPDSession.CreateUpdateSearcher
      If Err.Number <> 0 Then
        perror "Init WU engine"
        Exit Function
      End If    
      
      ' force online searching (bypass WSUS)
      objUPDSearch.ServerSelection = 2 ' ssWindowsUpdate
      objUPDSearch.Online = True       ' go online
      
      ' run a search
      printf "Searching for updates..."
      Set colResults = objUPDSearch.Search("IsInstalled=0 and Type='Software'")
      If Err.Number <> 0 Then
        perror "Search"
        Exit Function
      End If    
      
      ' scan updates, only select MSE ones
      printf "Checking the list of available updates..."  
      Set colDownloads = CreateObject("Microsoft.Update.UpdateColl")
      For i = 0 To colResults.Updates.Count - 1
        Set objUpdate = colResults.Updates.Item(i)
        bFound = False
        For j = 0 To objUpdate.Categories.Count - 1
          ' only deal with MSE updates
          If objUpdate.Categories.Item(j).Name = "MS Security Essentials" Then
            bFound = True
            Exit For
          End If
        Next
        If bFound Then
          printf "Found update: " & colResults.Updates.Item(i).Title
          colDownloads.Add objUpdate
        End If
      Next    
    
      ' check if there are any updates
      If colDownloads.Count < 1 Then
        printf "No available update, exiting."
        UpdateMSE = 1 ' no updates
        Exit Function
      Else
        printf colDownloads.Count & " update(s) found !"
      End If
      
      ' download updates
      printf "Downloading updates..."
      Set objDownload = objUPDSession.CreateUpdateDownloader
      objDownload.Updates = colDownloads
      objDownload.Download
      If Err.Number <> 0 Then
        perror "Download"
        Exit Function
      End If    
    
      ' check downloaded updates
      printf "Checking downloaded updates..."
      Set colInstall = CreateObject("Microsoft.Update.UpdateColl")
      For I = 0 To colResults.Updates.Count - 1
        Set objUpdate = colResults.Updates.Item(i)
        If objUpdate.IsDownloaded = True Then
          'objUpdate.AcceptEula
          colInstall.Add objUpdate
        Else
          printf "* Warning: update NOT downloaded => " & objUpdate.Title
        End If
      Next
      
      ' install updates
      printf "Installing " & colInstall.Count & " update(s)..."
    	Set objInstaller = objUPDSession.CreateUpdateInstaller
    	objInstaller.Updates =  colInstall
    	Set objInstallResult = objInstaller.Install
      If Err.Number <> 0 Then
        perror "Install"
        Exit Function
      End If    
    
      ' final summary
      printf "===== UPDATE SUMMARY ====="
      printf "Installation result.......: " & objInstallResult.ResultCode
      printf "Reboot required...........: " & objInstallResult.RebootRequired
      printf ""
    	For i = 0 To colInstall.Count - 1
    	 Set objUpdate = colInstall.Item(i)
    	 printf "Update title..............: " & objUpdate.Title
    	 prinff "       description........: " & objUpdate.Description
    	 printf "       id and revision....: " & objUpdate.Identity.UpdateID & "/" & objUpdate.Identity.RevisionNumber
    	 printf "       KB ID(s)...........: " & objUpdate.KBArticleIDs.Item(0)
    	 printf "       bulletins..........: " & objUpdate.SecurityBulletinIDs.Item(0)
    	 printf "       more infos.........: " & objUpdate.MoreInfoUrls.Item(0)
    	 printf "       installed..........: " & objUpdate.IsInstalled
    	 printf "       status.............: " & objInstallResult.GetUpdateResult(i).ResultCode
    	 printf "       needs reboot.......: " & objInstallResult.GetUpdateResult(i).RebootRequired
      Next
      printf ""
    
      ' all done, updates installed
      UpdateMSE = 2
    End Function
    
    

     

    lo script di cui sopra è una variazione di quello presentato nell'articolo technet (vedasi link precedente) ma a differenza di quello script, che gestisce tutti gli update, questo considera solo gli aggiornamenti relativi ad MSE permettendo così di gestire solo questi ultimi, sia che si tratti di nuove firme, sia che si tratti di aggiornamenti relativi ad MSE stesso; per utilizzare lo script, sarà sufficiente salvarlo come "mseupdate.vbs" in una qualsiasi cartella e quindi, dopo aver aperto un prompt comandi, lanciarlo immettendo il comando

     

    cscript mseupdate.vbs
    

     

    il programma si avvierà mostrando una serie di messaggi, procederà alla verifica dell'esistenza di aggiornamenti relativi ad MSE ed in tal caso, scaricherà ed installerà gli stessi (la corretta installazione potrà essere verificata al termine dello script aprendo l'interfaccia di MSE e controllando la versione delle firme... che corrisponderà a quella installata dallo script); lo script inoltre genera dei logs di nome "mseupdate-MM.log" dove MM è il numero del mese corrente; tali logs contengono gli stessi messaggi visibili durante l'esecuzione del programma e possono essere utili nel caso in cui si decida usare lo schedulatore (operazioni pianificate) di windows per eseguire lo script stesso automaticamente agli intervalli (o negli orari) desiderati.

    Tutto qui, niente di speciale,  spero possa essere utile. 

     

     


    • Spostato Anca Popa mercoledì 14 dicembre 2011 15:15 spostato nel forum di Annunci (Da:Off topic)
    • Modificato ObiWan mercoledì 14 dicembre 2011 15:21
    mercoledì 14 dicembre 2011 11:30

Tutte le risposte

  • Mi sembra interessante ed utile.
    Magari potresti postarlo anche nel Forum Scripting Guys all'indirizzo http://social.technet.microsoft.com/Forums/en-us/ITCG/threads.

    Ciao.


    Luigi Bruno - Microsoft Community Contributor 2011 Award
    mercoledì 14 dicembre 2011 12:36
  • Mi sembra interessante ed utile.
    Magari potresti postarlo anche nel Forum Scripting Guys all'indirizzo http://social.technet.microsoft.com/Forums/en-us/ITCG/threads.


    Si, conosco la rubrica "the scripting guy" sin dalla "fondazione" :) è che... sinceramente, non so se possa essere appropriato; vedi l'idea è quella di dare una mano alle piccole utenze che usano MSE allo scopo di mantenere le "firme" aggiornate nel caso di "valanghe" di malware o aggiornamenti al "motore" di scansione e, sinceramente, non so se uno script così "specifico" possa essere utile nell'ambito di "scripting guy" che, di solito, contiene scripts più ... come dire ... di uso generale :)

     

    mercoledì 14 dicembre 2011 13:45
  • Ciao Obi,

    Accolgo con piacere il post, mi permetto solo di spostarlo nell'area articoli dove puo' avere piu' visibilita'.

    Grazie di aver aiutato la community :-)


    Anca Popa Follow ForumTechNetIt on Twitter

    Evento 36888 origine Schannel su Windows Server 2008 R2 con IIS

    Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto viene fornito “così come è” e non comporta alcuna responsabilità da parte dell'azienda

    mercoledì 14 dicembre 2011 15:14
  • Ciao Obi,

    Accolgo con piacere il post, mi permetto solo di spostarlo nell'area articoli dove puo' avere piu' visibilita'.

    Grazie di aver aiutato la community :-)

    Hai fatto benissimo a spostarlo (del resto lo avevo scritto all'inizio :D) ho provveduto ad eliminare quel "non sono sicuro che il forum sia corretto" iniziale dato che credo che ora il messaggio sia al suo posto ... grazie a te :D

    In ogni caso, Anca, non mi ringraziare, se andiamo a vedere sono un "lazzarone" visto che lo script lo avevo realizzato per risolvere alcuni problemi, quindi... non mi è costato nulla postarlo qui :D ... grazie a te ed a tutti coloro che contribuiscono a mantenere vivi questi forums :D

     

    mercoledì 14 dicembre 2011 15:23
  • Sempre un piacere, Obi. Fortunatamente i forum sono fatti proprio per essere "vivi" altrimenti sai che noia :D

    Anca Popa Follow ForumTechNetIt on Twitter

    Evento 36888 origine Schannel su Windows Server 2008 R2 con IIS

    Microsoft offre questo servizio gratuitamente, per aiutare gli utenti e aumentare il database dei prodotti e delle tecnologie. Il contenuto viene fornito “così come è” e non comporta alcuna responsabilità da parte dell'azienda

    giovedì 15 dicembre 2011 09:48