martedì 29 marzo 2022

PowerShell: Aggiornare il server di stampa delle stampanti di rete configurate sul PC

A seguito sostituzione del server di stampa o alla modifica del suo nome, è necessario aggiornare la configurazione delle stampanti di rete installate su tutti i PC. L'operazione può essere eseguita tramite il seguente script.
 # Specificare il vecchio server di stampa  
 $strOLDPrintServer = "Vecchio_Server_Stampa"  
 # Specificare il nuovo server di stampa  
 $strNewPrintServer = "Nuovo_Server_Stampa"  
    
 # Verifica se lo script è già stato eseguito andando a verificare la presenza di un file  
 If (-not (Test-Path ".\$env:USERNAME-printers.txt")) {  
   Write-Host "Avvio Update dei server di stampa ..."  
      Write-Host "Stampanti di rete"  
    
   # L'operazione viene eseguita solo sulle stampanti di rete che hanno il vecchio server di stampa specificato  
     Get-WMIObject Win32_Printer | where{$_.network -eq "true" -and $_.SystemName -like "\\" + $strOLDPrintServer} | Select ShareName, Default, Name, SystemName | ForEach {  
    
                # Visualizza il nome della stampante di rete trovata ($_.ShareName) e se si tratta di stampante predefinita ($_.Default) e il server di stampa ($_.SystemName)  
                Write-Host "Nome: " $_.ShareName " Predefinita: " $_.Default " PrinterServer: " $_.SystemName  
   
                # rimuove la vecchia stampante  
                (New-Object -ComObject WScript.Network).RemovePrinterConnection($_.Name)  
                   
                # Aggiunge la nuova stampante utilizzando il nuovo server di stampa $strNewPrintServer   
                # e il nome $_.ShareName   
                $printer = [WMIClass]"\\.\root\cimv2:Win32_Printer"  
                $printer.AddPrinterConnection("\\" + $strNewPrintServer + "\" + $_.Sharename)  
                   
                # Se la vecchia stampante era predefinita allora imposta predefinita anche quella nuova  
                if($_.Default -eq $true) {  
                     $printer = Get-WmiObject Win32_Printer | ? { $_.name -like "\\" + $strNewPrintServer +"\" + $_.Sharename }  
                     $printer.SetDefaultPrinter()  
                }  
        
   }  
 }  
   
 # Crea un file di testo. La presenza del file indicherà che lo script è già stato eseguito.  
 Write-Host "Fine" | Out-File ".\$env:USERNAME-printers.txt"  

Lo script è molto semplice e i commenti aiutano la comprensione del suo funzionamento. All'interno del codice vanno specificati i nomi del vecchio e del nuovo server di stampa rispettivamente nelle variabili $strOLDPrintServer$strNewPrintServer. Lo script analizza tutte le stampanti configurate sul computer prendendo in considerazione solo le stampanti di rete che fanno riferimento al vecchio server di stampa. Tali stampanti verranno eliminate e riconfigurate utilizzando il nome del nuovo server di stampa. Nel caso di stampanti predefinite l'impostazione verrà ripristinata. Per evitare che lo script possa essere eseguito più volte, all'interno della cartella contenente il file PS1 verrà creato un file di testo. La presenza di tale file indicherà allo script che è già stato eseguito sulla postazione e non verrà eseguita alcuna ulteriore operazione.
Aggiornamento stampanti con il nuovo server di stampa
FIG 1 - Aggiornamento stampanti con il nuovo server di stampa


Dal seguente link è possibile scaricare il file PS1






lunedì 28 marzo 2022

MS Exchange: Visualizzare le impostazioni del filtro di posta indesiderata

Nell'articolo  MS Exchange: Configurare il filtro di posta indesiderata sulle caselle di posta è stato mostrato come configurare il filtro di posta indesiderate mediante l'utilizzo del cmdlet Set-MailboxJunkEmailConfiguration. In quest'articolo vedremo come visualizzare le impostazioni della posta indesiderata di una casella di posta utilizzando il cmdlet Get-MailboxJunkEmailConfiguration. Questo cmdlet è disponibile sia in Exchange on-premises che in Exchange on-cloud anche se alcuni parametri e impostazioni possono essere esclusivi di un solo ambiente.

Sintassi

Get-MailboxJunkEmailConfiguration
   [-Identity] <MailboxIdParameter>
   [-Credential <PSCredential>]
   [-DomainController <Fqdn>]
   [-ReadFromDomainController]
   [-ResultSize <Unlimited>]
   [<CommonParameters>]

Parametri

-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.

-DomainController
Questo parametro è disponibile solo in Exchange on-premises.
Il parametro DomainController specifica il controller di dominio usato dal cmdlet per leggere o scrivere dati in Active Directory. Il controller di dominio viene identificato tramite FQDN:per esempio, dc01.contoso.com.

-Identity
Il parametro Identity specifica la mailbox su cui si intende operare. Si può usare qualsiasi valore che identifichi univocamente la casella di posta. Per esempio:
Nome
Alias
Distinguished name (DN)
Domain\Username
Email address
GUID
LegacyExchangeDN
SamAccountName
User ID o user principal name (UPN)

-ReadFromDomainController
Il parametro ReadFromDomainController specifica che le informazioni dovrebbero essere lette da un controller di dominio nel dominio dell'utente. Non è necessario specificare un valore con questo interruttore.

-ResultSize 
Il parametro ResultSize specifica il numero massimo di risultati da restituire. Per  restituire tutte le richieste che corrispondono alla query va passato al parametro il valore unlimited. Il valore predefinito è 1000.

Esempi

Esempio 1
Get-MailboxJunkEmailConfiguration -Identity "GLubrano"
Questo esempio restituisce la configurazione della posta indesiderata per l'utente chiamato GLubrano.
Get-MailboxJunkEmailConfiguration, Filtro posta indesiderata



Esempio 2
Get-Mailbox -ResultSize unlimited -RecipientTypeDetails UserMailbox | foreach {Get-MailboxJunkEmailConfiguration -Identity $_.UserPrincipalName} | Where {$_.Enabled -eq $false} | Format-Table -Auto Identity,Enabled
Questo esempio restituisce una lista riassuntiva di tutte le caselle di posta nell'organizzazione in cui la regola della posta indesiderata è disabilitata






sabato 26 marzo 2022

MS Exchange: Configurare il filtro di posta indesiderata sulle caselle di posta

Per configurare le impostazioni di posta indesiderata sulla caselle di posta è possibile utilizzare il cmdlet Set-MailboxJunkEmailConfiguration.
Questo cmdlet è disponibile sia per Exchange on-premises che per Exchange on-cloud anche se alcuni parametri e impostazioni sono esclusivi di uno solo dei due ambienti. Il cmdlet può essere usato solo su caselle di posta su cui l'utente ha già eseguito l'accesso mediante MS Outlook (in modalità cached) o tramite OWA, in caso contrario si riceverà un messaggio di errore. Per sopprimere questo errore è possibile utilizzare il parametro -ErrorAction SilentlyContinue.

Set-MailboxJunkEmailConfiguration può essere usato sia per attivare/disattivare la regola di posta indesiderata (una regola nascosta nella casella di posta denominata Junk E-mail Rule) sia per configurarla con l'elenco dei mittenti/destinatari attendibili e mittenti bloccati

Sintassi

Set-MailboxJunkEmailConfiguration
   [-Identity] <MailboxIdParameter>
   [-BlockedSendersAndDomains <MultiValuedProperty>]
   [-Confirm]
   [-ContactsTrusted <Boolean>]
   [-DomainController <Fqdn>]
   [-Enabled <Boolean>]
   [-IgnoreDefaultScope]
   [-TrustedListsOnly <Boolean>]
   [-TrustedRecipientsAndDomains <MultiValuedProperty>]
   [-TrustedSendersAndDomains <MultiValuedProperty>]
   [-WhatIf]
   [<CommonParameters>]


Parametri

-BlockedSendersAndDomains
Il parametro BlockedSendersAndDomains consente di specificare la lista dei mittenti bloccati; una lista di indirizzi e-mail e domini mittenti i cui messaggi vengono automaticamente spostati nella cartella Posta indesiderata

Per inserire più valori e sovrascrivere qualsiasi voce esistente, si usa la seguente sintassi: "Valore1","Valore2",..."ValoreN". 

Per aggiungere o rimuovere uno o più valori senza influenzare le voci esistenti, va usata la seguente sintassi: @{Add="Valore1", "Valore2"...; Remove="Valore3", "Valore4"...}.

-Confirm
Consente di mostrare o nascondere la richiesta di conferma. 

-ContactsTrusted
Il parametro ContactsTrusted specifica se i contatti nella cartella Contatti sono da considerare come mittenti attendibili. I valori validi sono:
  • $true: I messaggi provenienti dai contatti presenti nella cartella Contatti  non verranno mai spostati nella cartella Posta indesiderata indipendentemente dal contenuto.
  • $false: I messaggi provenienti dai contatti presenti nella cartella Contatti non saranno trattati come mittenti attendibili. L'indirizzo email  viene considerato attendibile solo se definito nell'elenco dei mittenti attendibili.

-DomainController
Questo parametro è disponibile solo in Exchange on-premises.
Il parametro DomainController specifica il controller di dominio usato dal cmdlet per leggere o scrivere dati in Active Directory. Il controller di dominio viene identificato tramite FQDN:per esempio, dc01.contoso.com.

-Enabled
Il parametro Enabled abilita o disabilita la regola della posta indesiderata sulla casella di posta elettronica. Passando al parametro il valore $True la regola viene abilitata mentre viene disabilitata passando al parametro il valore $False.

-IgnoreDefaultScope
IgnoreDefaultScope indica di usare l'intera foresta come ambito permettendo al comando di accedere agli oggetti di Active Directory che non sono disponibili nell'ambito predefinito. Il parametro introduce le seguenti restrizioni:
  • Non è possibile usare il parametro DomainController. Il comando utilizza automaticamente un server di catalogo globale appropriato.
  • Si può usare solo il DN per il parametro Identity. Altre forme di identificazione, come alias o GUID, non sono accettate.

-TrustedListsOnly
Il parametro TrustedListsOnly specifica che solo i messaggi provenienti dai mittenti presenti nella lista dei mittenti attendibili sono consegnati nella cartella Posta in arrivo. Tutti gli altri messaggi sono trattati come posta indesiderata. I valori validi sono:
  • $true: Solo i messaggi provenienti da indirizzi e-mail o domini inseriti nell'elenco Mittenti attendibili vengono consegnati alla Posta in arrivo. Tutti gli altri messaggi vengono automaticamente consegnati nella cartella Posta indesiderata.
  • $false: I messaggi provenienti da altri mittenti, destinatari e domini non vengono automaticamente trattati come posta indesiderata, e vengono valutati individualmente. Questo è il valore predefinito.

-TrustedSendersAndDomains
Il parametro TrustedSendersAndDomains consente di specificare la lista dei Mittenti attendibili e Destinatari attendibili.
Per inserire più valori e sovrascrivere qualsiasi voce esistente, si usa la seguente sintassi: "Valore1","Valore2",..."ValoreN". 

Per aggiungere o rimuovere uno o più valori senza influenzare le voci esistenti, usate la seguente sintassi: @{Add="Valore1", "Valore2"...; Remove="Valore3", "Valore4"...}.

Tutti gli indirizzi email nella lista globale degli indirizzi (GAL) sono automaticamente considerati come mittenti attendibili, quindi non è necessario aggiungerli alla lista.
Con questo cmdlet non è possibile modificare direttamente l'elenco dei destinatari attendibili. Con questo parametro viene modificato l'elenco dei Mittenti attendibili, e gli indirizzi e-mail e i domini sono sincronizzati con l'elenco Destinatari attendibili

-WhatIf
WhatIf simula le azioni del comando.


Esempi

Esempio1
Set-MailboxJunkEmailConfiguration GLubrano -Enabled $false
Disabilita la regola della posta indesiderata sulla casella di posta elettronica specificata.
Set-MailboxJunkEmailConfiguration
FIG 1 - Set-MailboxJunkEmailConfiguration



Esempio 2
Set-MailboxJunkEmailConfiguration GLUBRANO -TrustedSendersAndDomains @{Add="contoso.com","microsoft.com"} -BlockedSendersAndDomains @{Add="joker@gotham.com"}
Aggiunge i domini contoso.com e microsoft.com come Mittenti attendibili senza interferire con i domini già presenti in elenco. Aggiunge, inoltre, l'indirizzo joker@gotham.com all'elenco dei Mittenti bloccati, anche in questo caso senza andare ad interferire con gli indirizzi già presenti.

Esempio 3
Get-MailboxJunkEmailConfiguration * | Where {$_.ContactsTrusted -eq $true} | Set-MailboxJunkEmailConfiguration -ContactsTrusted $false
Il comando sopra riportato agisce su tutte le mailbox. Sulle mailbox dove i mittenti presenti nella cartella Contatti vengono considerati come Mittenti attendibili, modifica la configurazione (i Contatti non verranno più trattati come mittenti attendibili)



venerdì 25 marzo 2022

Windows 10: Errore nell'installazione Language Pack. Codice errore: 0x80073D01

Tentando di aggiungere una nuova lingua in un sistema Windows 10 Enterprise collegato ad un dominio ci si può imbattere nell'errore 0x80073D01. Generalmente questo problema è dovuto ad una policy che impedisce il download da Internet degli aggiornamenti e dei Language Pack.
Installazione Language Pack, Codice errore 0x80073D01
FIG 1 - Installazione Language Pack, Codice errore 0x80073D01

Se si dispone di un utenza amministrativa è possibile risolvere procedendo nel seguente modo:
  • Avviare l'Editor del Registro di sistema (WIN+R e digitare regedit seguito da invio); 
  • Posizionarsi sulla chiave di registro
    HKEY_
    LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate
  • Modificare il DWORD nominato DoNotConnectToWindowsUpdateInternetLocations valorizzandolo a 0
    Valore Dword: DoNotConnectToWindowsUpdateInternetLocations
    FIG 2 - Valore Dword: DoNotConnectToWindowsUpdateInternetLocations

  • Posizionarsi sulla chiave di registro
    HKEY_
    LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU
  • Modificare, se presente (se non presente non è necessario crearlo), il DWORD nominato UseWUServer valorizzandolo a 0.
La modifica non richiede il riavvio. Riprovando a scaricare il language pack l'operazione verrà eseguita correttamente. Una volta terminata l'operazione è opportuno ripristinare i valori iniziali di DoNotConnectToWindowsUpdateInternetLocationsUseWUServer.








giovedì 24 marzo 2022

Windows 10: Abilitare l'audio mono

La maggior parte delle cuffie e degli altoparlanti al giorno d'oggi sono di tipo "Stereo". Quando una traccia registrata in stereo viene riprodotta su tali dispositivi, ai 2 canali audio (destro e sinistro) vengono inviate informazioni separate e distinte. Per alcuni scenari, come dispositivi mono o utenti con problemi di udito, può essere utile forzare la riproduzione mono. L'operazione può essere portata a termine in diversi modi:

Metodo 1:
L'audio mono può essere abilitato dalla finestra delle impostazioni dell'audio: 
  • Dalla finestra di dialogo Esegui (WIN+R) digitare ms-settings:easeofaccess-audio seguito da Invio. In alternativa possiamo accedere alla finestra andando in Impostazioni (WIN+I)->Accessibilità->Audio
  • Attivare la funzione Attiva audio mono.
    Attivazione audio mono
    FIG 1 - Attivazione audio mono


Metodo 2:
Il secondo metodo consiste nell'agire tramite il registro di sistema:
  • Avviare l'Editor del Registro di sistema (WIN+R e digitare regedit seguito da invio); 
  • Posizionarsi sulla chiave di registro
    HKEY_CURRENT_USER\Software\AccessibilityMonoMixStateMicrosoft\Multimedia\Audio
  • Creare, se non presente, un valore DWORD(32-bit) e rinominarlo in AccessibilityMonoMixState.
  • Assegnare ad AccessibilityMonoMixState il valore 1.
    Editor del Registro di sistema, AccessibilityMonoMixState
    FIG 2 - Editor del Registro di sistema, AccessibilityMonoMixState

  • Affinché la modifica diventi effettiva riavviare il servizio Audiosrv oppure eseguire un riavvio o una disconnessione/riconnessione al sistema.
Per disattivare l'audio mono rimuovere AccessibilityMonoMixState dal registro di sistema o assegnargli il valore 0 e riavviare il servizio Audiosrv.


Metodo 3:
Possiamo automatizzare la creazione del valore nel registro di sistema e il riavvio del servizio Audiosrv mediante l'utilizzo di PowerShell con il comando
powershell -windowstyle hidden -command "Start-Process cmd -ArgumentList '/s,/c,REG ADD "HKCU\Software\Microsoft\Multimedia\Audio" /V AccessibilityMonoMixState /T REG_DWORD /D 1 /F & net stop "Audiosrv" & net start "Audiosrv"' -Verb runAs"
PowerShell, Attivazione audio mono
FIG 3 - PowerShell, Attivazione audio mono
Per disattivare l'audio mono
powershell -windowstyle hidden -command "Start-Process cmd -ArgumentList '/s,/c,REG ADD "HKCU\Software\Microsoft\Multimedia\Audio" /V AccessibilityMonoMixState /T REG_DWORD /D 0 /F & net stop "Audiosrv" & net start "Audiosrv"' -Verb runAs"







mercoledì 23 marzo 2022

Windows 10: Windows Defender

Windows Defender è l'antivirus integrato nel sistema operativo di Microsoft. In quest'articolo verrà mostrato come interagire da riga di comando con Windows Defender. Se si utilizza un antivirus di terze parti, Windows Defender potrebbe essere stato disabilitato pertanto i comandi mostrati nell'articolo non funzioneranno. Avviato il prompt dei comandi come amministratore, accedere alla cartella contenente Windows Defender con il comando
cd "\Program Files\Windows Defender"


Verifica e installazione aggiornamenti
Come ogni buon antivirus, anche Windows Defender riceve periodicamente gli aggiornamenti delle definizione dei virus e del "motore" dell'antivirus. Per verificare la presenza di aggiornamenti è possibile digitare dal prompt dei comandi
MpCmdRun -SignatureUpdate
Il comando, oltre a verificare la disponibilità degli aggiornamenti provvederà anche a scaricarli ed installarli.
Update Windows Defender
FIG 1 - Update Windows Defender

Se le nuove definizioni danno problemi è possibile rimuoverle e ripristinare quelle precedenti utilizzando il comando
MpCmdRun -RemoveDefinitions -All

Allo stesso modo è possibile disinstallare il nuovo engine dell'antivirus con il comando
MpCmdRun -RemoveDefinitions -Engine


Scansione del sistema
Possiamo avviare diversi tipi di scansione a seconda delle nostre esigenze.
Per eseguire una scansione rapida
MpCmdRun -Scan -ScanType 1
Windows Defender, Scansione rapida
FIG 2 - Windows Defender, Scansione rapida


Per eseguire una scansione completa e approfondita del sistema
MpCmdRun -Scan -ScanType 2

Per avviare la scansione mirata di una particolare cartella
MpCmdRun -Scan -ScanType 3 -File path_cartella
dove al posto di path_cartella va specificato il nome della cartella compreso il percorso (ad es. c:\users\pippo\downloads)

Alcuni virus possono prendere di mira il settore di boot del disco che normalmente non è accessibile dal sistema. Un virus insediato in tale settore può infettare il sistema ad ogni avvio . Per eseguire una scansione mirata del settore di boot del disco
MpCmdRun.exe -Scan -ScanType -BootSectorScan


File in quarantena
Quando l'antivirus individua file sospetti o infetti che non riesce a bonificare, può spostarli in quarantena: uno spazio protetto dove i file infetti vengono salvati in modo da non rappresentare più una minaccia per il sistema. Tramite il seguente comando vengono visualizzati i file che sono stati spostati in quarantena
MpCmdRun -Restore -ListAll
Windows Defender, File in quarantena
FIG 3 - Windows Defender, File in quarantena

Per ripristinare tutti i file presenti dalla quarantena (operazione da eseguire con le dovute cautele)
MpCmdRun -Restore -All

Per ripristinare un particolare file dalla quarantena
MpCmdRun -Restore -Name nomefile 
dove nomefile rappresenta il nome, compreso estensione, del file presente in quarantena (ad es. game.exe).

Se vogliamo recuperare un particolare file dalla quarantena e salvarlo in uno determinato percorso
MpCmdRun -Restore -Name nomefile -FilePath destinazione 
dove al posto di destinazione va specificato il percorso in cui il file verrà ripristinato (ad es. c:\temp).





domenica 20 marzo 2022

PowerShell: Verificare il formato di un URL

In PowerShell non è necessario ricorrere alle regular expression per verificare il formato di una stringa. PowerShell, infatti, consente l'utilizzo di API e per questo tipo di operazioni è possibile utilizzare uno dei tanti metodi specializzati presenti in .NET Framework.

In quest'articolo verrà mostrato come verificare il formato di un URL. Prima però, bisogna fare un po' di chiarezza sui termini URI, URL e URN.

Un URI (Uniform Resource Identifier) è una sequenza di caratteri che identifica universalmente ed univocamente una risorsa come ad esempio un indirizzo web, un documento o il codice ISBN di un libro. Un URI può essere classificato come qualcosa che definisce posizioni (URL), nomi (URN) o entrambi:
  • URL (Uniform Resource Locator) serve per identificare univocamente la locazione di una determinata risorsa ovvero il suo indirizzo. L'URL viene prevalentemente utilizzato per indicare risorse web (HTTP o HTTPS), risorse accessibili tramite protocolli di trasferimento file (FTP), condivisione remote (SMB) e accessi a sistemi esterni (SSH). La sua semantica è data da 
    protocollo://[username:password@]host[:porta]</percorso>[?querystring][#fragment]
  • URN (Uniform Resource Name) è un URI che identifica una risorsa mediante un nome in un particolare dominio di nomi detto "Namespace". Un URN può essere utilizzato per descrivere una risorsa senza lasciare intendere la sua ubicazione o su come ottenerne una rappresentazione. Tale URN deve restare unico e persistente anche qualora la risorsa smetta di esistere o non sia più disponibile. Per esempio l'URN urn:isbn:978-0-470-53286-7 è un URI che mappa universalmente e univocamente un libro mediante il suo identificativo, o nome, (978-0-470-53286-7) nel namespace dei codici ISBN, ma non suggerisce dove e come ottenere una copia di tale libro e il nome resterà valido (non verrà assegnato ad altri libri) anche quando la risorsa non sarà più disponibile.

Per verificare se il formato di un URL è corretto utilizzando Powershell, è possibile utilizzare il metodo IsWellFormedUriString della classe URI. Il comando sarà del tipo
[Uri]::IsWellFormedUriString(uriString, uriKind)
dove uriString rappresenta la stringa dell'URL da verificare e uriKind ne specifica il tipo (assoluto o relativo). Gli URI assoluti sono caratterizzati da un riferimento completo alla risorsa (ad esempio https://www.contoso.com/index.html), mentre un URI relativo è la forma abbreviata che si limita a indicare solo la deviazione dall'URI di base (ad esempio nell'URI base https://www.contoso.com l'URI relativo è index.html). 
Il metodo restituirà True se la stringa è ben formata e False in caso contrario.

Esempio
[Uri]::IsWellFormedUriString("https://giovannilubrano.blogspot.com", [UriKind]::Absolute)
In questo esempio viene testato l'URL https://giovannilubrano.blogspot.com. Come visibile in figura, il formato dell'URL risulta corretto.
Metodo IsWellFormedUriString
FIG 1 - Metodo IsWellFormedUriString