venerdì 21 gennaio 2022

PowerShell: Disabilitare l'account locale Guest

Windows viene fornito con un account locale integrato chiamato "Guest". Dal momento che questo account è usato raramente e può essere utilizzato come vettore di attacco è di default disabilitato nelle recenti distribuzioni di Windows.
 
Poiché il nome dell'account è localizzato e può variare leggermente da regione a regione, per identificare l'account e visualizzarne lo stato è consigliabile usare il suo SID:
Get-LocalUser | Where-Object Sid -like 'S-1-5-*-501' 

Get-Localuser
FIG 1 - Get-LocalUser


Per disattivare l'account utilizzare il cmdlet Disable-LocalUser
Get-LocalUser | Where-Object Sid -like 'S-1-5-*-501' | Disable-LocalUser





giovedì 20 gennaio 2022

PowerShell: Identificare le versioni di .NET Framework installate nel sistema

Il .NET Framework è uno strato software ideato per facilitare lo sviluppo e l'esecuzione dei programmi in ambiente Windows. Il framework è costituito dall'ambiente di esecuzione Common Language Runtime (CLR), che fornisce la gestione della memoria e altri servizi di sistema, e dalla Framework Class Library (FCL) un'ampia libreria di classi utilizzabili dai programmatori e contenenti codice per lo sviluppo di applicazioni. Nel corso degli anni il .NET Framework ha conosciuto numerose revisioni e aggiornamenti. Conoscere le versioni di .NET Framework installate sul PC può essere fondamentale soprattutto in quei casi in cui si utilizza un determinato software .NET che funziona solo con una specifica versione del framework.

Per conoscere tutte le versioni di .NET Framework installate sul sistema basta eseguire il seguente comando PowerShell
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where{ $_.PSChildName -Match'^(?!S)\p{L}'} | Select PSChildName, version

Versioni .NET Framework installate
FIG 1 - Versioni .NET Framework installate






mercoledì 19 gennaio 2022

MS Outlook: Macro per stampare un elenco di cartelle di un file di dati

In alcune circostanze può essere utile ottenere l'elenco delle sottocartelle presenti all'interno di un file di dati di Outlook. Di seguito viene mostrata una macro VBA adatta allo scopo. La macro ottiene un elenco dei nomi delle sottocartelle presenti in un file di dati a partire dalla cartella selezionata. L'elenco viene inserito in un nuovo messaggio pronto per essere inviato.

 ' strFoldersList è una stringa multiriga contenente i nomi delle cartelle   
  Public strFoldersList As String   
  ' lCountFolders andrà a contenere il numero di cartelle elaborate   
  Public lCountFolders As Long   
     
     
  Public Sub GetFolderNames()   
   Dim olApp As Outlook.Application   
   Dim olSession As Outlook.NameSpace   
   Dim olStartFolder As Outlook.MAPIFolder   
      
   lCountFolders = 0   
      
   Set olApp = New Outlook.Application   
   Set olSession = olApp.GetNamespace("MAPI")     
     
   'Consente all'utente di selezionare la cartella da cui iniziare la ricerca   
   Set olStartFolder = olSession.PickFolder   
      
   'Verifica se l'utente ha selezionato una cartella da cui partire   
   If Not (olStartFolder Is Nothing) Then   
    ' Se è stata selezionata una cartella, avvia il processo di ricerca.   
    ProcessFolder olStartFolder   
      
    strFoldersList = strFoldersList & vbCrLf & "Totale cartelle elaborate:" & vbTab & lCountFolders   
    ' Crea un nuovo messaggio email contenente l'elenco delle cartelle   
    Set ListFolders = Application.CreateItem(olMailItem)   
    ListFolders.Body = strFoldersList   
    ListFolders.Display     
   End If   
  ' Resetta il contenuto della stringa per una nuova ricerca   
  strFoldersList = ""   
  End Sub   
     
     
  Sub ProcessFolder(CurrentFolder As Outlook.MAPIFolder)   
       
   Dim i As Long   
   Dim olNewFolder As Outlook.MAPIFolder   
   Dim olTempFolder As Outlook.MAPIFolder   
   Dim olTempFolderPath As String   
   Dim lItemsInFolder As Long   
      
   lItemsInFolder = 0   
   ' Esegue un loop sulle cartelle.   
   For i = 1 To CurrentFolder.Folders.Count   
       
    Set olTempFolder = CurrentFolder.Folders(i)   
       
    olTempFolderPath = olTempFolder.FolderPath   
     
   ' Verifica il numero di elementi contenuti nella cartella   
    lItemsInFolder = olTempFolder.Items.Count   
       
       
    ' Crea una stringa multiriga con i nomi delle cartelle.    
    ' olTempFolder contiente il nome della cartella   
    strFoldersList = strFoldersList & vbCrLf & olTempFolderPath & vbTab & "(Items:" & lItemsInFolder & ")"   
       
    lCountFolders = lCountFolders + 1   
       
   Next   
   ' Esegue la ricerca anche nelle sottocartelle della cartella corrente   
   For Each olNewFolder In CurrentFolder.Folders   
     ProcessFolder olNewFolder   
   Next   
      
      
  End Sub   

La macro è molto semplice e i commenti consentono di capire come funziona.  La procedura principale è GetFolderNames() che consente all'utente di selezionare la cartella su cui operare. Successivamente viene richiamata la procedura ProcessFolder che, partendo dalla cartella selezionata dall'utente, elabora tutte le sottocartelle.


Come utilizzare la macro

  • Per utilizzare la macro avviare la finestra Microsoft Visual Basic, Application Edition premendo, dalla finestra principale di Outlook, la combinazione di tasti ALT+F11.
  • Cliccare, con il tasto destro del mouse, su Progetto1 quindi cliccare su Inserisci e selezionare Modulo.
    VBA, Inserisci modulo
    FIG 1 - VBA, Inserisci modulo

  • Copiare il codice sopra riportato e incollarlo nella nuova finestra. Per salvare il codice cliccare sull'icona del dischetto o premere la combinazione di tasti CTRL+S
    VBA, Modulo (codice)
    FIG 2 - VBA, Modulo (codice)

  • Per eseguire la macro cliccare sul tasto play (o premere F5), selezionare la cartella desiderata e premere OK
    Seleziona cartella
    FIG 3 - Seleziona cartella

  • Verrà creato un nuovo messaggio contenente l'elenco delle cartelle. Per ciascuna cartella verrà visualizzato il numero di elementi contenuti e, alla fine dell'elenco, verrà riportato il numero di cartelle elaborato.
    Messaggio contenente l'elenco cartelle
    FIG 4 - Messaggio contenente l'elenco cartelle



Visualizzare la dimensione di ciascuna cartella

Per visualizzare la dimensione di ciascuna cartella basta apportare una semplice modifica al codice della procedura ProcessFolder come mostrato di seguito. Apportando tale modifica bisogna considerare che il tempo di elaborazione della macro può aumentare notevolmente con l'aumentare delle cartelle e item da elaborare.
 Sub ProcessFolder(CurrentFolder As Outlook.MAPIFolder)   
       
   Dim i As Long   
   Dim olNewFolder As Outlook.MAPIFolder   
   Dim olTempFolder As Outlook.MAPIFolder   
   Dim olTempFolderPath As String   
   Dim lItemsInFolder As Long   
    Dim intSize As Long   
   Dim objItems As Items   
   Dim objItem As Object      
      
   lItemsInFolder = 0   
   ' Esegue un loop sulle cartelle.   
   For i = 1 To CurrentFolder.Folders.Count   
       
    Set olTempFolder = CurrentFolder.Folders(i)   
       
    olTempFolderPath = olTempFolder.FolderPath   
     
   ' Verifica il numero di elementi contenuti nella cartella   
    lItemsInFolder = olTempFolder.Items.Count   
     
       Set objItems = olTempFolder.Items   
       
       intSize = 0   
   ' Somma la dimensione di ogni item presente nella cartella   
   For Each objItem In objItems   
    ' Debug.Print olcount, objItem.Subject, objItem.Size   
     intSize = intSize + objItem.Size   
    Next   
       
       
    ' Crea una stringa multiriga con i nomi delle cartelle.    
    ' olTempFolder contiente il nome della cartella   
    strFoldersList = strFoldersList & vbCrLf & olTempFolderPath & vbTab & "(Items:" & lItemsInFolder & ") (Dimensione:" & Int(intSize / 1024) & " KB)"   
       
    lCountFolders = lCountFolders + 1   
       
   Next   
   ' Esegue la ricerca anche nelle sottocartelle della cartella corrente   
   For Each olNewFolder In CurrentFolder.Folders   
     ProcessFolder olNewFolder   
   Next   
      
      
  End Sub   


Esportare l'elenco in un file CSV

Se al posto di creare un nuovo messaggio di posta si intende salvare l'elenco delle cartelle all'interno di un file CSV modificare la procedura GetFolderNames() come indicato di seguito.
 Public Sub GetFolderNames()   
   Dim olApp As Outlook.Application   
   Dim olSession As Outlook.NameSpace   
   Dim olStartFolder As Outlook.MAPIFolder   
      
   lCountFolders = 0   
      
   Set olApp = New Outlook.Application   
   Set olSession = olApp.GetNamespace("MAPI")   
      
   'Consente all'utente di selezionare la cartella da cui iniziare la ricerca   
   Set olStartFolder = olSession.PickFolder   
      
   'Verifica se l'utente ha selezionato una cartella da cui partire   
   If Not (olStartFolder Is Nothing) Then   
   ' Se è stata selezionata una cartella, avvia il processo di ricerca.   
   ProcessFolder olStartFolder   
      
   ' Crea un file CSV nel percorso specificato   
  strPath = Environ("USERPROFILE") & "\Documents\ElencoCartelleOutlook.csv"   
   Set fso = CreateObject("Scripting.FileSystemObject")   
   Set Fileout = fso.CreateTextFile(strPath, True, False)   
   Fileout.WriteLine strFoldersList   
   End If   
  ' Resetta il contenuto della stringa per una nuova ricerca   
  strFoldersList = ""   
  End Sub   




martedì 18 gennaio 2022

PowerShell: Catturare uno screenshot

Tramite PowerShell è possibile catturare lo schermo e salvare lo screenshot all'interno di un file utilizzando i tipi presenti in System.Windows.Forms. Il seguente script mostra come catturare lo schermo virtuale e salvarlo all'interno di un file bitmap per poi aprirlo con il programma associato.
  #specifica il path in cui salvare lo screenshot   
  $Path = "$Env:temp\screenshot.bmp"   
     
  Add-Type -AssemblyName System.Windows.Forms   
     
  #Prepara l'area da catturare   
  $screen = [System.Windows.Forms.SystemInformation]::VirtualScreen   
  $width = $screen.Width   
  $height = $screen.Height   
  $left = $screen.Left   
  $top = $screen.Top   
  #Crea un immagine bitmap   
  $bitmap = [System.Drawing.Bitmap]::new($width, $height)   
  #Crea un nuovo oggetto Graphics dall'oggetto $bitmap   
  $MyDrawing = [System.Drawing.Graphics]::FromImage($bitmap)   
  #Copia il contenuto dello schermo nell'oggetto $bitmap   
  $MyDrawing.CopyFromScreen($left, $top, 0, 0, $bitmap.Size)   
     
  #Salva lo screenshot nel percorso specificato   
  $bitmap.Save($Path)   
  #visualizza l'immagine bmp salvata utilizzando il programma associato   
  Start-Process -FilePath $Path   


Screenshot
FIG 1 - Screenshot

Dal seguente link è possibile scaricare il codice dello script:





lunedì 17 gennaio 2022

Windows Quick Tip: Creare più cartelle dal Prompt dei comandi

Il Prompt dei comandi viene considerato erroneamente obsoleto ma in realtà rappresenta, ancora oggi, un'ottimo strumento per velocizzare operazioni che con la GUI richiederebbero più tempo; una di queste operazioni è la creazione contemporanea di molte cartelle. Tramite l'interfaccia grafica di Esplora file, le cartelle andrebbero create manualmente una alla volta mentre, agendo tramite il Prompt dei comandi, l'obiettivo può essere raggiunto in una frazione del tempo.
Per creare più cartelle dal Prompt dei comandi:
  • Aprire il Prompt dei comandi (WIN+R e digitare CMD seguito da invio) e posizionarsi nella cartella radice in cui creare le cartelle utilizzando il comando CD. Ad esempio, per posizionarsi all'interno della cartella Documenti digitare il comando
    cd %userprofile%\Documents
  • A questo punto basta far seguire al comando MD i nomi delle cartelle da creare (nel caso nei nomi siano presenti spazi è necessario delimitarli con i doppi apici). Ad esempio, volendo creare una cartella per ogni mese dell'anno il comando è 
    md Gennaio Febbraio Marzo Aprile Maggio Giugno Luglio Agosto Settembre Ottobre Novembre Dicembre 
    Per fare in modo che la sequenza venga visualizzata nell'ordine corretto è possibile creare le cartelle aggiungendo un numero prima del nome della cartella come nella seguente sintassi 
    md "01 - Gennaio" "02 - Febbraio" "03 - Marzo" "04 - Aprile" "05 - Maggio" "06 - Giugno" "07 - Luglio" "08 - Agosto" "09 - Settembre" "10 - Ottobre" "11 - Novembre" "12 - Dicembre"

    Creazione cartelle dal prompt dei comandi
    FIG 1 - Creazione cartelle dal prompt dei comandi







domenica 16 gennaio 2022

PowerShell: Statistiche sulla pandemia di Covid-19

Per rimanere aggiornati sulle statistiche della pandemia di Covid-19 utilizzando PowerShell è possibile utilizzare questo semplice webservice

(Invoke-RestMethod -Uri "https://coronavirus-19-api.herokuapp.com/countries") -match "Italy"

PowerShell, Statistiche Covid-19
FIG 1 - PowerShell, Statistiche Covid-19

Ovviamente per visualizzare le statistiche di altri paesi basta sostituire Italy con il paese di proprio interesse.




venerdì 14 gennaio 2022

PowerShell: Rilevare un riavvio in sospeso

Per poter eseguire o completare l'installazione di alcuni tipi di aggiornamenti, Windows potrebbe richiedere il riavvio del sistema. In tale condizione potremmo non riuscire ad installare altri programmi senza prima aver eseguito il riavvio consentendo a Windows di completare le operazioni in sospeso.
Riavvio in sospeso
FIG 1 - Riavvio in sospeso

É possibile rilevare la presenza di un riavvio in sospeso andando ad interrogare la chiave di registro di sistema RebootPending. L'operazione può essere eseguita da PowerShell con il seguente comando:
Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending"

Se il comando restituisce True allora è stato rilevato un riavvio in sospeso in caso contrario il comando restituirà False.
RebootPending
FIG 2 - RebootPending