sabato 30 aprile 2022

PowerShell: Identificazione del dominio connesso

Un modo rapido per determinare il nome del dominio a cui è connesso il sistema è WMI. Dalla finestra PowerShell eseguire:
Get-CimInstance -ClassName Win32_NTDomain

Il comando visualizza il nome del dominio a cui il sistema è connesso, il DNS Forest Name e il nome del Domain Controller. Se il sistema non è connesso ad un dominio, il risultato sarà un oggetto vuoto.
Identificazione del dominio connesso
FIG 1 - Identificazione del dominio connesso






venerdì 29 aprile 2022

PowerShell: Estrarre l'icona da un file eseguibile

Quasi la totalità dei file eseguibili contiene al suo interno un'icona che lo contraddistingue dagli altri file. Tramite PowerShell è possibile estrarre l'icona presente all'interno di un file eseguibile e salvarla in un file con estensione .ico. Per eseguire tale operazione bastano poche righe di codice:

 # Specifica la cartella dove verrà salvato il file .ico  
 $dest = "c:\Temp"  
   
 # Crea la cartella se non presente  
 mkdir $dest -ErrorAction Ignore  
   
 # Carica la classe di .NET Framework: System.Drawing   
 Add-Type -AssemblyName System.Drawing  
   
 # Estrae l'icona di regedit.exe  
 $fileExe = "$env:windir\regedit.exe"  
 $fileIco = "$dest\regedit.ico"  
 [System.Drawing.Icon]::ExtractAssociatedIcon($fileExe).ToBitmap().Save($fileIco)  
   
 # Visualizza in Esplora file la cartella contenente l'icona estratta  
 explorer $dest   

Per estrarre l'icona da un file viene utilizzata la classe .NET Framework System DrawingIl codice sopra riportato è molto semplice e i commenti aiutano a capire il suo funzionamento.





giovedì 28 aprile 2022

PowerShell: Download di file da Internet

Nell'articolo PowerShell: Visualizzare l'intestazione HTTP di un sito web è stato mostrato come, utilizzando il cmdlet Invoke-WebRequest, recuperare le informazioni contenute all'interno dell'intestazione HTTP di un sito web. 
Invoke-WebRequest, oltre a consentire di inviare richieste a servizi web, può essere utilizzato anche per comunicare con sistemi remoti e per il trasferimento di dati. Le istruzioni mostrate di seguito utilizzano il cmdlet Invoke-WebRequest per per scaricare un file da Internet (in questo caso si tratta di un'immagine) in un modo molto semplice:
 $url = 'https://images-assets.nasa.gov/image/iss066e174306/iss066e174306~orig.jpg'  
 $dest= "c:\temp\picture_iss.jpg"  
   
 Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $dest   
   
 Invoke-Item -Path $dest  

Le prime due righe permettono di specificare il percorso del file da scaricare (variabile $url) e il percorso dove salvarlo (variabile $dest).
Nella riga successiva viene eseguito il cmdlet Invoke-Webrequest a cui vengono passate le variabili $url e $dest inizializzate precedentemente. Il parametro -UseBasicParsing impedisce al cmdlet di usare il vecchio e deprecato modello di oggetto "Internet Explorer" che può causare problemi. Prima di utilizzare il codice sopra riportato è bene ricordare che Invoke-WebRequest potrebbe non funzionare con i vecchi protocolli di rete e TLS.

L'ultima riga non fa altro che aprire l'immagine scaricata con il visualizzatore predefinito.





mercoledì 27 aprile 2022

Windows: Ripristinare i criteri di Windows Firewall

Per resettare i criteri di Windows Firewall reimpostando i valori predefiniti è possibile utilizzare netsh advfirewall. Avviare il Prompt dei comandi come amministratore ed eseguire il comando
netsh advfirewall reset  
Reset policy Windows Firewall
FIG 1 - Reset policy Windows Firewall

Per eseguire il backup dei criteri correnti prima di ripristinare quelli predefiniti si utilizza il parametro export a cui va passato il nome del file in cui si intendono salvare i criteri
netsh advfirewall export "C:\BackupPolicyFirewall.wfw"

Per importare i criteri salvati da un file si utilizza il comando
netsh advfirewall import "C:\BackupPolicyFirewall.wfw"




martedì 26 aprile 2022

PowerShell: Attivare/Disattivare la funzione Posta in arrivo Evidenziata di Outlook

La funzione Posta in arrivo Evidenziata di Outlook separa la posta in arrivo in due schede: Evidenziata, contenente le email considerate più importanti, ed Altra contenente le restanti email. Non sempre questa separazione funziona correttamente e potremmo ritrovarci con email importanti spostate nella scheda Altra.

In MS Outlook per Windows, Posta in arrivo Evidenziata è disponibile solo per gli account Microsoft 365, Exchange e Outlook.com. La funzione può essere attivata/disattivata in maniera molto semplice da Outlook selezionando la cartella Posta in arrivo e cliccando sull'apposito pulsante presente nel menu Visualizza.
Posta in arrivo Evidenziata
FIG 1 - Posta in arrivo Evidenziata


L'attivazione/disattivazione di tale funzionalità in Outlook viene controllata dal valore 000b04a5 presente nel registro di sistema all'interno di una delle sotto-chiavi del profilo di posta. Il nome della sotto-chiave di registro contenente tale valore, per questioni di sicurezza, varia e va ricercata all'interno della chiave
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office\16.0\Outlook\Profiles\<nome_profilo_Outlook>

L'operazione può essere automatizzata con il seguente script PowerShell. Lo script va a cercare il valore 000b04a5 all'interno del profilo Outlook predefinito e chiede all'utente se disattivare/attivare la funzione. I commenti aiutano nella comprensione del codice.
 # Percorso chiavi di registro e profili relativi ad Outlook   
  $outlook = "HKCU:\Software\Microsoft\Office\16.0\Outlook"   
  # Variabili contenenti i valori binari per l'attivazione/disattivazione della funzione Posta Evidenziata   
  $Enable=([byte[]](0x01,0x00))   
  $Disable=([byte[]](0x00,0x00))   
  # Verifico il profilo outlook predefinito   
  # Verifico se è presente il valore stringa DefaulProfile   
  if ((Get-ItemProperty -Path $outlook -Name "DefaultProfile" -ErrorAction SilentlyContinue)){   
    # Recupero il valore contenuto in DefaultProfile   
    $defaultProfile = (Get-ItemProperty -Path $outlook -Name "DefaultProfile").'DefaultProfile'   
    # Se DefaulProfile è vuoto allora non è specificato un profilo outlook predefinito   
    if ($defaultProfile -ne ""){   
         $CurrentProfile = "$Outlook" + '\Profiles\'+ "$defaultProfile" + '\*'   
         # All'interno del profilo outlook predefinito ricerco il valore 000b04a5   
         $FocusValue = (Get-ItemProperty -Path $CurrentProfile -Name "000b04a5" -ErrorAction SilentlyContinue).'000b04a5'   
         # Se il valore è 1 allora la funzione Posta Evidenziata è attiva   
         If ($FocusValue -eq "1"){   
          write-host "La funzione 'Mostra posta in arrivo evidenziata' risulta attiva"   
          # Chiedo all'utente se desidera disattivare la funzione Posta Evidenziata   
          $confirmation = Read-Host "Si desidera disattivarla?[S/N]"   
          # Se l'utente risponde in maniera affermativa, la funzione viene disattivata   
          if ($confirmation -eq 's') {   
            Set-ItemProperty -Path $CurrentProfile -Name "000b04a5" -Value $Disable -ErrorAction SilentlyContinue   
            write-host "La funzione 'Mostra posta in arrivo evidenziata' e' stata disattivata"   
          }    
         }   
         else{   
          # La funzione Posta Evidenziata è disattivata   
          write-host "La funzione 'Mostra posta in arrivo evidenziata' non risulta attiva"   
          # Chiedo all'utente se desidera attivare la funzione Posta Evidenziata   
          $confirmation = Read-Host "Si desidera attivarla?[S/N]"   
          # Se l'utente risponde in maniera affermativa, la funzione viene attivata   
            if ($confirmation -eq 's') {   
            Set-ItemProperty -Path $CurrentProfile -Name "000b04a5" -Value $Enable -ErrorAction SilentlyContinue   
            write-host "La funzione 'Mostra posta in arrivo evidenziata' e' stata attivata"   
          }   
     
         }   
    }   
    # Il valore stringa DefaulProfile è vuoto   
    else{   
       write-host "Non risulta impostato alcun profilo Outlook predefinito"   
    }   
  }   
  # Il valore stringa DefaulProfile non è presente   
  else{   
    write-host "Il valore DefaulProfile non risulta presente."   
  }   

Dal seguente link è possibile scaricare lo script PowerShell




lunedì 25 aprile 2022

PowerShell: Gestire la foto dell'account utente in Active Directory utilizzando l'attributo ThumbnailPhoto

Gli account utente di Active Directory hanno un attributo speciale (thumbnailPhoto) in cui una foto può essere memorizzata come dati binari. Outlook, OWA, Skype for Business, SharePoint e altre applicazioni possono utilizzare la foto memorizzata in questo attributo AD come avatar dell'utente nella loro interfaccia.

Per assegnare una foto ad un account utente in Active Directory usando PowerShell è necessario, per prima cosa, convertire il file immagine in un array di byte, e poi usare il cmdlet Set-ADUser per impostarlo come valore dell'attributo thumbnailPhoto. Le operazioni possono essere eseguita tramite il seguente comando

Set-ADUser Giovanni.Lubrano -Replace @{thumbnailPhoto=([byte[]](Get-Content "C:\Temp\foto.jpg" -Encoding byte))}
sostituendo Giovanni.Lubrano e c:\temp\foto.jpg rispettivamente con l'account utente su cui si intende operare e il nome del file, comprensivo di percorso, del file jpg contenente la foto.
Assegnare una foto all'account utente in AD
FIG 1 - Assegnare una foto all'account utente in AD
Visualizzando le proprietà dell'account utente da Utenti e computer di Active Directory possiamo verificare, dalla scheda Editor attributi, che all'attributo thumbnailPhoto è stato assegnato un valore.
Proprietà account utente, Attributo thumbnailPhoto
FIG 2 - Proprietà account utente, Attributo thumbnailPhoto

Per eseguire l'operazione inversa, cioè salvare la foto di un account utente presente in Active Directory all'interno di un file JPG, possiamo eseguire un comando simile a
(Get-ADUser Giovanni.Lubrano -Properties thumbnailPhoto).thumbnailPhoto | Set-Content "C:\Temp\foto.jpg" -Encoding byte
Esportare la foto contenuta nell'attributo thumbnailPhoto in un file jpg
FIG 3 - Esportare la foto contenuta nell'attributo thumbnailPhoto in un file jpg


Per visualizzare tutti gli account utente dotati di foto il comando da eseguire è
Get-ADUser -Filter * -properties thumbnailPhoto | ? {$_.thumbnailPhoto} | Select Name
mentre per visualizzare gli account non dotati di foto
Get-ADUser -Filter * -properties thumbnailPhoto | ? {(-not($_.thumbnailPhoto))} | Select Name
Visualizzare gli account utente dotati di foto
FIG 4 - Visualizzare gli account utente dotati di foto


Per rimuovere la foto di un account utente resettando l'attributo thumbnailPhoto
Set-ADUser Giovanni.Lubrano  -Clear thumbnailPhoto






giovedì 21 aprile 2022

PowerShell: Windows Defender e eliminazione elenco minacce

Windows Defender, per impostazione predefinita, elimina automaticamente gli elementi che ha identificato come una minaccia dopo 15 giorni. Questa preferenza può essere verificata e configurata direttamente tramite PowerShell

Avviare PowerShell come amministratore.
Per visualizzare dopo quanti giorni un elemento identificato come minaccia viene cancellato, eseguire il comando
(Get-MpPreference).ScanPurgeItemsAfterDelay

Per modificare tale valore si utilizza il comando Set-MpPreference insieme al parametro -ScanPurgeItemsAfterDelay a cui va passato il numero di giorni desiderato. Ad esempio, il seguente comando imposta a 10 giorni l'eliminazione definitiva della minaccia
Set-MpPreference -ScanPurgeItemsAfterDelay 10
MpPreference
FIG 1 - MpPreference






mercoledì 20 aprile 2022

PowerShell: Aprire la finestra di dialogo per l'arresto del sistema di Windows

Per richiamare, tramite PowerShell, la finestra di dialogo "Fine della sessione di lavoro" per l'arresto del sistema è possibile utilizzare il seguente comando
(New-Object -ComObject Shell.Application).ShutdownWindows()

PowerShell, Fine della sessione di lavoro
FIG 1 - PowerShell, Fine della sessione di lavoro

Finestra di dialogo Fine della sessione di lavoro
FIG 2 - Finestra di dialogo Fine della sessione di lavoro





venerdì 15 aprile 2022

PowerShell: Visualizzare informazioni sugli account utente e i gruppi di cui sono membri

Il cmdlet Get-ADUser permette di ottenere informazioni su uno o più account utente presenti in Active Directory. Utilizzando il cmdlet Get-ADUser, è possibile ottenere il valore di qualsiasi attributo di un account utente AD, elencare gli utenti del dominio con le relative proprietà, esportare i report sugli utenti in file CSV e utilizzare vari criteri per selezionare e filtrare gli utenti del dominio. Come vedremo negli esempi, può essere utilizzato anche per individuare a quali gruppi di AD appartiene un account utente.

Sintassi

Get-ADUser
   [-AuthType <ADAuthType>]
   [-Credential <PSCredential>]
   -Filter <String>
   [-Properties <String[]>]
   [-ResultPageSize <Int32>]
   [-ResultSetSize <Int32>]
   [-SearchBase <String>]
   [-SearchScope <ADSearchScope>]
   [-Server <String>]
   [<CommonParameters>]


Get-ADUser
   [-AuthType <ADAuthType>]
   [-Credential <PSCredential>]
   [-Identity] <ADUser>
   [-Partition <String>]
   [-Properties <String[]>]
   [-Server <String>]
   [<CommonParameters>]


Get-ADUser
   [-AuthType <ADAuthType>]
   [-Credential <PSCredential>]
   -LDAPFilter <String>
   [-Properties <String[]>]
   [-ResultPageSize <Int32>]
   [-ResultSetSize <Int32>]
   [-SearchBase <String>]
   [-SearchScope <ADSearchScope>]
   [-Server <String>]
   [<CommonParameters>]

Parametri

-AuthType 
Specifica il metodo di autenticazione. I valori accettati dal parametro sono:
  • Negotiate oppure 0 (default)
  • Basic oppure 1
-Credential
Specifica le credenziali dell'account utente con cui eseguire il comando. Se omesso viene considerato l'utente corrente che sta eseguendo il comando. Al parametro può essere passato il nome dell'account, come ad es. "utente01" o "Dominio\utente01" oppure può essere passato un'oggetto PSCredential generato dal cmdlet Get-Credential. Se viene specificato un'account utente verrà richiesto di inserire la password all'esecuzione del comando.

-Filter
Specifica una stringa di query che recupera gli oggetti di Active Directory. Questa stringa usa la sintassi del linguaggio delle espressioni di PowerShell (PowerShell Expression Language syntax) che fornisce un ricco supporto alla conversione di tipo per i tipi di valore ricevuti dal parametro Filter.

-Identity
Tale parametro specifica l'oggetto gruppo Active Directory su cui si desidera intervenire. Al parametro può essere passato un qualsiasi valore che identifica il gruppo in maniera univoca come:
Distinguished name
GUID (objectGUID)
Security identifier (objectSid)
Security Account Manager account name (SAMAccountName) 

-LDAPFilter
Specifica una query LDAP che viene utilizzata per filtrare gli oggetti Active Directory. 

-Partition
A tale parametro va passato il Distinguished Name (DN) di una partizione di Active Directory. Il cmdlet utilizzerà tale partizione per ricercare l'oggetto specificato dal parametro Identity.

-Properties
Specifica le proprietà dell'oggetto da recuperare. Può essere usato per recuperare le proprietà che non sono incluse nel set di default.

-ResultPageSize
Specifica il numero di oggetti da includere in una pagina per una query AD DS (Active Directory Domain Services).

-ResultSetSize
Specifica il numero massimo di oggetti da restituire per la query AD DS (Active Directory Domain Services).

-SearchBase
Specifica un percorso Active Directory all'interno del quale effettuare la ricerca.

-SearchScope
Specifica l'ambito di una ricerca Active Directory. I valori accettabili per questo parametro sono:
  • Base o 0
  • OneLevel 1
  • SubTree o 2
-Server
Permette di specificare l'istanza di Active Directory Domain Services a cui connettersi per eseguire l'operazione.


Esempi

Esempio 1
Get-ADUser -Identity Giovanni.Lubrano -Properties *
Visualizza tutte le proprietà dell'account specificato.
Proprietà account utente
FIG 1 - Proprietà account utente

Esempio 2
Get-ADUser -LDAPFilter '(!userAccountControl:1.2.840.113556.1.4.803:=2)'
Visualizza tutti gli account utente abilitati in Active Directory utilizzando un filtro LDAP.
Utenti attivi
FIG 2 - Utenti attivi

Esempio 3
Get-ADUser -Filter {Enabled -eq “False”}
Visualizza tutti gli account utente in AD non attivi.
Account utente disabilitati
FIG 3 - Account utente disabilitati

Esempio 4
Get-ADUser Giovanni.Lubrano -Property MemberOf | Select -ExpandProperty MemberOf
Visualizza i gruppi di Active Directory di cui l'utente specificato è membro.
Gruppi AD di cui l'account è membro
FIG 4 - Gruppi AD di cui l'account è membro

Esempio 5
Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | ft Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires
Per ogni account utente visualizza lo stato e la data dell'ultima modifica della password e l'ora dell'ultimo accesso al dominio (attributo LastLogonTimestamp). 
Informazioni sulla password account utente
FIG 5 - Informazioni sulla password account utente

Esempio 6
Get-ADUser -Filter {(mail -ne "null") -and (Enabled -eq "true")} -Properties Surname,GivenName,mail | Select-Object Name,Surname,GivenName,mail | Format-Table
Visualizza tutti gli account utente abilitati e dotati di indirizzo email.

Esempio 7
Get-ADUser -Filter * -Properties EmailAddress | where -Property EmailAddress -eq $null
Restituisce tutti gli account utente che non dispongono di indirizzo email.

Esempio 8
Get-ADUser -filter * -properties PasswordExpired, PasswordLastSet, PasswordNeverExpires | where {$_.name –like "*Giovanni*"} | sort-object PasswordLastSet | select-object Name, PasswordExpired, PasswordLastSet, PasswordNeverExpires | Export-csv -path c:\temp\Info-user-passwords.csv -Append -Encoding UTF8
Restituisce gli attributi Name, PasswordExpired, PasswordLastSet e PasswordNeverExpires di tutti gli account utente in cui nel nome è presente la stringa Giovanni. I risultati sono ordinati per la data di ultima modifica della password (PasswordLastSet) ed esportati nel file .CSV specificato.









lunedì 11 aprile 2022

Linux: Visualizzare l'Easter egg di Vim

Per visualizzare l'Easter egg incluso nell'editor di testo Vim:
  • Da una finestra terminale avviare l'editor digitando vim seguito da invio.
  • Digitare :smile e premere invio

VIM Easter egg
FIG 1 - VIM Easter egg