martedì 2 aprile 2019

Windows Quick Tip: Disinstallare/Installare un aggiornamento da riga di comando tramite WUSA

Nell'articolo PowerShell: Visualizzare  gli hotfix installati sul pc locale o su un pc remoto è stato mostrato come elencare gli hotfix/aggiornamenti installati sul computer. Per disinstallare/installare un particolare aggiornamento sul computer è possibile utilizzare, da riga di comando, WUSA (Windows Update Standalone Installer) il Programma di installazione Windows Update autonomo.

Il file Wusa.exe si trova nella cartella %windir%\System32 e può essere utilizzato sia per disinstallare un'hotfix/aggiornamento sia per installare pacchetti di aggiornamento MSU


Sintassi


wusa /extract: [/log:]
wusa [/quiet] [/norestart | /warnrestart: | /promptrestart | /forcerestart] [/log:]
wusa / uninstall  < | /kb:> [/quiet] [/norestart | /warnrestart: | /promptrestart | /forcerestart ][/log:]



Parametri


/?, /h, /help
Visualizzano la guida.

/quiet
Tramite tale parametro WUSA.exe viene eseguito in modalità silente (non interattiva).

/norestart
Impedisce a Wusa.exe di eseguire il riavvio del computer. L'opzione /norestart viene ignorata se l'opzione /quiet non è presente. 

/uninstall
Disinstalla il pacchetto o il numero KB specificato.

/kb
Specifica il pacchetto da disinstallare tramite il relativo numero KB. Può essere passato solo insieme all'opzione /uninstall.

/extract
Wusa.exe estrae il contenuto del pacchetto in una cartella di destinazione.

/warnrestart
Quando questa opzione viene combinata con l'opzione /quiet, Wusa.exe visualizza una richiesta all'utente prima di eseguire un riavvio per le operazioni di installazione e disinstallazione.


/forcerestart
Quando questa opzione viene combinata con l'opzione /quiet, Wusa.exe chiude in modo forzato l'applicazione e quindi esegue un riavvio.




Esempi


Esempio 1
wusa.exe /uninstall /kb:4489899 /quiet /norestart
Disinstalla il pacchetto KB4489899 in maniera silente e senza riavviare il sistema.
Windows, Disinstallare un'aggiornamento tramite wusa.exe
FIG 1 - Windows, Disinstallare un'aggiornamento tramite wusa.exe

Esempio 2 
wusa.exe Windows6.0-KB928439-x86.msu /quiet /norestart
Installa il pacchetto Windows6.0-KB928439-x86.msu in maniera silente e senza riavviare il sistema.

Esempio 3
wusa.exe /uninstall /kb:4489899 /quiet /forcerestart
Disinstalla il pacchetto KB4489899 in maniera silente e forza il riavvio del sistema al termine della disinstallazione.




lunedì 1 aprile 2019

PowerShell: Visualizzare gli hotfix installati sul pc locale o su un pc remoto

Con il termine hotfix si intende un singolo pacchetto cumulativo, composto da uno o più file, che include delle informazioni per risolvere un bug o un problema di sicurezza in un determinato prodotto software. Un hotfix, dunque, non è altro che una sorta di aggiornamento rapido rilasciato per rimediare ad un problema software il più velocemente possibile. Per visualizzare gli hotfix installati localmente o su un computer remoto è possibile utilizzare il cmdlet Get-HotFix.

Il cmdlet consente di visualizzare tutti gli hotfix/aggiornamenti installati sul computer locale o su computer remoti tramite Windows Update, Microsoft Update, Windows Server Update Service oppure aggiornamenti installati manualmente dagli utenti.


Sintassi


Get-HotFix [[-Id] <String[]>] [-Description <String[]>] [-ComputerName <String[]>] [-Credential <PSCredential>] [<CommonParameters>]




Parametri


-ComputerName
Il parametro consente di indicare un computer remoto. Se il parametro non viene specificato, il cmdlet agisce sul computer locale. Al parametro può essere passato il nome NetBIOS, l'indirizzo IP oppure il FQDN (Fully Qualified Domain Name).

-Credential
Per default il cmdlet viene eseguito con le credenziali dell'account che lancia il comando. Attraverso il parametro -Credential è possibile specificare un'account diverso.

-Description
Consente di ricercare un hotfix in base a una o più parole contenute nella sua descrizione. Sono consentiti caratteri Wildcards. 

-ID
In alternativa al parametro -Description, consente di ricercare un hotfix tramite il proprio ID. Il parametro non consente caratteri Wildcards. Se i parametri -Description e -ID non vengono specificati, la ricerca restituirà tutti gli hotfix.



Esempi


Esempio 1
Get-HotFix
Restituisce tutti gli hotfix/aggiornamenti installati sul computer locale.
PowerShell, Get-HotFix
FIG 1 - PowerShell, Get-HotFix

Esempio 2
Get-HotFix -Description "Security*" -ComputerName "Server01", "Server02"
Visualizza tutti gli hotfix la cui descrizione inizia con la parola Security installati sui server Server01 e Server02.

Esempio 3
Get-Content "ElencoWKS.txt" | ForEach { if (!(Get-HotFix -Id "KB4489899" -ComputerName $_)) { Add-Content $_ -Path "WKS-senza-KB4489899.txt" }}
Per ogni computer elencato all'interno del file ElencoWKS.txt viene verificato se ha installato aggiornamento KB4489899 e, in caso negativo, il nome della postazione viene aggiunto all'elenco contenuto nel file WKS-senza-KB4489899.txt.

Esempio 4
(Get-HotFix | sort installedon)[-1]
Il comando restituisce l'ultimo aggiornamento installato sul computer locale: ordina tutti gli hotfix per data di installazione quindi seleziona dall'array l'ultimo item (l'hotfix più recente).

Esempio 5
Get-Hotfix | Where-Object { $_.HotfixID -like "KB448*" } | Sort-Object InstalledOn
Restituisce tutti gli hotfix che hanno l'ID che inizia per KB448 ordinandoli per data di installazione.
PowerShell, Get-HotFix ricerca di una KB tra gli aggiornamenti installati
FIG 2 - PowerShell, Get-HotFix ricerca di una KB tra gli aggiornamenti installati





venerdì 29 marzo 2019

MS Exchange: Visualizzare i permessi di una cartella presente sulla mailbox tramite EMS

Chi gestisce un'infrastruttura di posta elettronica può trovarsi spesso nella situazione di dover verificare permessi assegnati ad una particolare cartella presente in una mailbox. In ambiente MS Exchange Server tale operazione può essere eseguita con l'ausilio del cmdlet Get-MailboxFolderPermission tramite EMS (Exchange Management Shell).

Get-MailboxFolderPermission  [-Identity] <MailboxFolderIdParameter> [-DomainController <Fqdn>]   [-User <MailboxFolderUserIdParameter>]    [-GroupMailbox]   [<CommonParameters>]


Parametri

-DomainController
Il parametro consente di specificare il Domain Controller a cui far riferimento per reperire dati dall'Active Directory. Il dominio va specificato nel formato FQDN (Fully Qualified Domain Name) ad es. dc02.contoso.com

-GroupMailbox
Il parametro è utilizzato per includere nei risultati i gruppi di Office 365.

-Identity
Tale parametro specifica la mailbox e la cartella su cui si intendono verificare le abilitazioni. La sintassi è del tipo  <Mailbox>:\<Folder>. Per <Mailbox> può essere specificato un qualsiasi valore che identifica la mailbox in maniera univoca come:
GUID
Distinguished name (DN)
Dominio\Account
Nome dell'entità utente
LegacyExchangeDN
SamAccountName
Indirizzo SMTP
Alias 

-User
Il parametro User filtra i risultati visualizzando solo le abilitazioni dell'utente indicato. Anche in questo caso è possibile utilizzare qualsiasi valore che permetta l'identificazione univoca dell'utente/gruppo come:
Nome
Display name
Alias
Distinguished name (DN)
Canonical DN
Indirizzo email
GUID




Esempi


Esempio 1
Get-MailboxFolderPermission  -identity GLUBRANO
Per visualizzare i permessi sulla root della mailbox.


Esempio 2
Get-MailboxFolderPermission  -identity GLUBRANO:\Calendario
o per maggiori dettagli
Get-MailboxFolderPermission  -identity GLUBRANO:\Calendario |FL
Visualizza i permessi sulla cartella Calendario della casella dell'utente GLUBRANO
Get-MailboxFolderPermission
FIG 1 - Get-MailboxFolderPermission

Esempio 3
Get-MailboxFolderPermission  -identity GLUBRANO:\Calendario -User DDUCK
Visualizza i permessi che l'utente DDUCK dispone sulla cartella Calendario presente nella mailbox dell'utente GLUBRANO.




mercoledì 27 marzo 2019

PowerShell: Disabilitare il risparmio energetico sulle schede di rete

Quando il PC entra in modalità sospensione/ibernazione, Windows disabilita tutte le periferiche non necessarie per risparmiare energia comprese le schede di rete. Tale comportamento può causare malfunzionamenti quando si riprende la sessione di lavoro: ad es. la scheda di rete potrebbe non riattivarsi.
Una soluzione a questo tipo di problemi consiste nell'impedire al sistema operativo di spegnere le schede di rete per risparmiare energia. 


Disabilitare il risparmio energetico sulla scheda di rete tramite GUI

  • Premere la combinazione di tasti WIN+R per aprire la finestra di dialogo Esegui e digitare devmgmt.msc seguito da invio per avviare Gestione dispositivi;

    Gestione dispositivi
    FIG 1 - Gestione dispositivi
  • Espandere la sezione Schede di rete ed eseguire un doppio click sulla scheda di rete su cui si intende disabilitare il risparmio energetico;
  • Nella finestra delle Proprietà, selezionare la scheda Risparmio energia quindi rimuovere la spunta alla voce Consenti al computer di spegnere il dispositivo per risparmiare energia e confermare cliccando sul pulsante OK.
    Proprietà scheda di rete
    FIG 2 - Proprietà scheda di rete



Disabilitare il risparmio energetico sulle schede di rete tramite PowerShell


Nello script PowerShell andremo a verificare le proprietà delle schede di rete presenti nel registro di sistema al seguente percorso
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318}
All'interno delle sottochiavi del registro andremo a verificare la proprietà *ifType per individuare le schede di rete Wi-Fi (con *ifType=6) e le schede di rete Ethernet (con *ifType=71). Per tali schede il risparmio energetico verrà disattivato valorizzando la proprietà PnPCapabilities a 18 in esadecimale (24 in decimale).
Lo script, oltre a visualizzare l'output a video, genera un file di log DisablePowerSavingNIC.log che è possibile consultare successivamente anche dopo aver chiuso la finestra di PowerShell.
Script DisablePowerSavingNIC.ps1
FIG 3 - Script DisablePowerSavingNIC.ps1
Lo script può essere scaricato dal seguente link
DOWNLOAD

Terminata l'esecuzione, l'output sarà simile a quello mostrato in FIG 4 ed è necessario procedere al riavvio del sistema affinché le modifiche siano applicate.
Output script PowerShell DisablePowerSavingNIC.ps1
FIG 4 - Output script PowerShell DisablePowerSavingNIC.ps1




domenica 24 marzo 2019

MS Office 365 for Business: Riparare Office da riga di comando tramite OfficeClickToRun

Per riparare l'installazione di MS Office 365 è possibile procedere tramite Programmi e funzionalità (appwiz.cpl) di Windows oppure tramite riga di comando utilizzando OfficeClickToRun.


Ripristino Office 365
FIG 1 - Ripristino Office 365

Il percorso di OfficeClickToRun.exe può variare in base alla versione di Office 365/Windows utilizzata e il comando da lanciare per procedere ad una riparazione rapida sarà simile al seguente:
"%ProgramFiles%\Common Files\Microsoft Shared\ClickToRun\OfficeClickToRun.exe" scenario=Repair platform=x86 culture=it-it forceappshutdown=True RepairType=QuickRepair DisplayLevel=False

Ovviamente i parametri da passare a OfficeClickToRun vanno personalizzati in base alle proprie esigenze e configurazione. Di seguito un dettaglio sui parametri utilizzabili e i possibili valori:

Parametro Valori Note
scenario Repair Indica che si intende procedere alla riparazione di Office.
Parametro Necessario
platform x86
x64
Specifica la versione di Office che si intende riparare.
x86 per la versione a 32 bit
x64 per la versione a 64 bit
Parametro Necessario
culture ll-cc Specifica la lingua della versione di Office installata. Se sono installate più lingue basta specificarne solo una.
Per la versione inglese di Office il valore sarà en-us per quella in italiano il valore da indicare è it-it.
Parametro Necessario
forceappshutdown True
False
Se impostato su True verranno chiuse tutte le applicazioni Office prima che venga avviata la riparazione. Se le applicazioni Office sono aperte e il parametro non è specificato o settato su False, allora la riparazione fallirà.
Parametro Opzionale
RepairType QuickRepair
FullRepair
Permette di specificare se si intende procedere con un Ripristino Rapido (QuickRepair) o con il Ripristino online (FullRepair).
Con il Ripristino online tutte le applicazioni Office saranno reinstallate e verranno sovrascritte tutte le impostazioni fatte nel file configuration.xml.
Parametro Opzionale
DisplayLevel True
False
Se impostato su True verranno visualizzate le finestre relative al ripristino. Impostando tale parametro su False il ripristino avverrà in maniera silente .
Parametro Opzionale





lunedì 18 marzo 2019

PowerShell: Montare\Smontare un'immagine ISO

Per immagine ISO si intende una copia bit-per-bit del file system di un disco ottico. Il nome deriva da ISO 9660, il file system standard dei CD-ROM tuttavia un'immagine ISO può contenere anche il file system UDF (ISO/IEC 13346) comunemente utilizzato nei dischi DVD e Blu-Ray.
Windows 10 facilita enormemente la gestione dei file ISO senza l'utilizzo di tool esterni. Per aprire un file ISO basta fare un doppio clic sul file oppure, in alternativa, cliccarci su con il tasto destro del mouse e selezionare Monta dal menu contestuale: Windows creerà un'unità ottica virtuale assegnandole la prima lettera di unità libera e permettendo la navigazione del contenuto dell'immagine ISO tramite Esplora file.
Windows 10, Montare un'immagine ISO
FIG 1 - Windows 10, Montare un'immagine ISO
Per eliminare l'unità virtuale e smontare l'immagine basta cliccare con il tasto destro del mouse sull'unità in Esplora file e selezionare Espelli dal menu contestuale.


In PowerShell è possibile montare\smontare un'immagine ISO utilizzando i cmdlet Mount-DiskImageDismount-DiskImage.
Per montare un'immagine ISO tramite PowerShell
Mount-DiskImage -ImagePath "C:\kali-linux-2019.1a-amd64.iso"
PowerShell, Montare un'immagine ISO
FIG 2 - PowerShell, Montare un'immagine ISO

Per smontare un'immagine ISO da PowerShell
Dismount-DiskImage -ImagePath "C:\kali-linux-2019.1a-amd64.iso"
PowerShell, Smontare un'immagine ISO
FIG 3 - PowerShell, Smontare un'immagine ISO
oppure, utilizzando il device path
Dismount-DiskImage -DevicePath \\.\CDROM1





giovedì 14 marzo 2019

PowerShell: Creare un documento MS Excel contenente i risultati dei ping ad un elenco di postazioni

Potremmo trovarci nella situazione in cui ci viene richiesto di controllare se diverse postazioni siano connesse in rete. Il modo più semplice per eseguire tale controllo consiste nel verificare se le postazioni rispondono al ping. In questo articolo mostrerò come raggiungere tale obiettivo con uno script PowerShell che, dato un elenco di postazioni contenuto in un file di testo, provvede ad eseguire il ping e a memorizzare i risultati all'interno di un documento MS Excel.
Lo script può essere scaricato dal seguente link
DOWNLOAD
Script PowerShell PingHost2Excel
FIG 1 - Script PowerShell PingHost2Excel

La prima istruzione consiste nell'assegnare alla variabile $path il nome del file, comprensivo di percorso, contenente l'elenco delle workstation da verificare. Il contenuto del file sarà simile a quello mostrato in FIG 2: ogni riga contiene il nome della postazione da verificare.
Elenco Workstation da verificare
FIG 2 - Elenco Workstation da verificare

Successivamente con Test-Path verifichiamo se il file è presente, in caso contrario terminiamo lo script visualizzando il messaggio di file non trovato
$path = ".\ElencoWKS.txt"
if (Test-Path $path) 

Se il file contenente l'elenco delle workstation viene trovato procediamo alla creazione di un nuovo documento MS Excel e a posizionarci sul primo foglio di lavoro. 
$objExcel = new-object -comobject excel.application 

$objWorkbook = $objExcel.Workbooks.Add() 
$objWorksheet = $objWorkbook.Worksheets.Item(1)

Con la seguente istruzione facciamo in modo che il documento MS Excel sia visibile a video durante la compilazione.
$objExcel.Visible = $True

La prima riga del foglio di lavoro la utilizziamo come intestazione assegnando un nome a ciascuna colonna in base al contenuto che andremo successivamente ad inserire.
$objWorksheet.Cells.Item(1, 1) = "Nome Host"
$objWorksheet.Cells.Item(1, 2) = "Ping"
$objWorksheet.Cells.Item(1, 3) = "Indirizzo IP"


Nella variabile $wks andiamo a caricare l'elenco delle postazioni da analizzare. La variabile $row viene inizializzata a 2 (nella prima riga del foglio di lavoro abbiamo inserito l'intestazione) e verrà utilizzata per spostarci alla riga successiva man mano che verranno analizzate/inserite le workstation in elenco.
$wks= gc $path
$row=2

La parte più importante dello script è rappresentata dal ciclo foreach-object: per ogni postazione presente in elenco provvede ad inserire, all'interno del file MS Excel, il nome della postazione, l'esito del ping (OK se andato a buon fine o KO nel caso in cui non si riceve risposta) e l'eventuale indirizzo IP della postazione.
$wks| foreach-object{
 $ping=$null
 $workstation = $_
 $ping = Test-Connection $workstation -Count 1 -ea silentlycontinue
 $objWorksheet.Cells.Item($row,1) = $workstation
 
 if($ping){
  $objWorksheet.Cells.Item($row,2) = "OK"
  $objWorksheet.Cells.Item($row,3) = $ping.IPV4Address.IPAddressToString   
 }
 else {
  $objWorksheet.Cells.Item($row,2) = "KO"
  $objWorksheet.Cells.Item($row,3) = "-"
 }
  
 $row++
}


Foglio MS Excel con i risultati della verifica
FIG 3 - Foglio MS Excel con i risultati della verifica