giovedì 31 marzo 2022

PowerShell: Elencare i gruppi vuoti presenti in Active Directory

Tenere sotto controllo i gruppi presenti in Active Directory è uno dei compiti dell'amministratore di sistema. In grandi infrastrutture può capitare di ritrovarsi con gruppi che erano stati creati per un'attività non più in essere e che sono rimasti senza membri. Per visualizzare i gruppi vuoti presenti in AD è possibile utilizzare il seguente comando PowerShell

Get-ADGroup -filter * | where {-Not ($_ | Get-ADGroupMember)} | Select Name

Gruppi vuoti in Active Directory
FIG 1 - Gruppi vuoti in Active Directory





mercoledì 30 marzo 2022

PowerShell: Modificare la descrizione di un computer in Active Directory

Di seguito viene mostrato un semplice script PowerShell che permette di modificare il campo Descrizione di uno specifico computer in Active Directory. L'operazione viene eseguita attraverso l'utilizzo del cmdlet Set-ADComputer.

 # Importa il modulo Active Directory  
 Import-Module ActiveDirectory  
   
 #Inserimento nome computer  
 $wks = Read-Host -Prompt 'Inserisci nome computer'  
   
 #Richiesta inserimento nuova descrizione  
 $desc = Read-Host -Prompt 'Inserisci nuova descrizione'  
   
 #Imposta la nuova descrizione  
 Set-ADComputer $wks -Description $desc  
   
 Write-Host "La descrizione del computer $wks in AD è stata modificata in: $desc" -ForegroundColor Green  
Una volta inserito il nome del computer e la descrizione desiderata, viene aggiornato il relativo campo Descrizione in Active Directory. Se il nome computer non è presente in Active Directory, verrà visualizzato un messaggio di errore.
Modifica Descrizione Computer in Active Directory
FIG 1 - Modifica Descrizione Computer in Active Directory


Descrizione computer in Active Directory
FIG 2 - Descrizione computer in Active Directory

Lo script può essere scaricato dal seguente link





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"