giovedì 14 luglio 2016

PowerShell: Cancellare la cronologia dei comandi con Clear-History

Quando eseguiamo i comandi all'interno della sessione PowerShell, questi vengono memorizzati all'interno della cronologia. Con i tasti freccia SU e GIU' della tastiera possiamo visualizzare singolarmente gli ultimi comandi digitati oppure possiamo utilizzare il cmdlet Get-History per visualizzarne l'elenco. Il cmdlet Clear-History, se eseguito senza parametri, consente di eliminare tutta la cronologia dei comandi.
PowerShell, Clear-History
FIG 1 - PowerShell, Clear-History

Per eliminare un determinato comando dalla cronologia possiamo utilizzare il parametro -ID e specificare l'ID del comando da eliminare (nel caso di più comandi gli ID vanno separati da virgola). La sintassi del comando è
Clear-History -ID <ID da eliminare>

Ad es.
Clear-History -ID 8
Clear-History -ID 8, 10

Se vogliamo eliminare tutte le tracce di un determinato comando all'interno della cronologia possiamo utilizzare il parametro -Command e specificare il comando o parte di esso.
Clear-History -Command <nome comando>

Per cancellare tutti i comandi che iniziano per "Get-"
Clear-History -Command "Get-*"
per cancellare più comandi possiamo indicarli separandoli da virgola. Ad esempio con il seguente comando vengono cancellati dalla cronologia tutti i comandi che iniziano con "Get-" e tutti quelli che contengono la stringa "help"
Clear-History -Command "Get-*", "*help*"

Con il parametro -Count possiamo indicare quanti elementi della cronologia, partendo da quello più vecchio, cancellare. Ad es. per cancellare i 2 elementi della cronologia più vecchi
Clear-History -Count 2
per cancellare 2 elementi della cronologia partendo da quelli più nuovi
Clear-History -Count 2 -Newest
per cancellare gli elementi più vecchi partendo da un determinato ID
Clear-History -ID 8 -Count 2




martedì 12 luglio 2016

Windows Quick Tip: Ripristino di Windows Update

I motivi che possono causare il malfunzionamento di Windows Update possono essere molteplici e spesso non sono facili da scovare. Le prime operazioni da eseguire sono:
  • Verificare che la data e l'ora di sistema siano corretti (incluso il fuso orario). Impostazioni errate impediscono a Windows Update di funzionare correttamente.
  • Verificare la connessione alla rete e a Internet.
  • Eseguire una scansione del sistema con un antivirus/antimalware aggiornato. Molti virus/malware non consentono al sistema di aggiornarsi.
  • Verificare la configurazione dei DNS configurati sulla postazione. Provare a cambiarli impostando quelli di Google (DNS primario 8.8.8.8, DNS secondario 8.8.4.4).
  • Verificare il contenuto del file %Windir%\System32\drivers\etc\Host. Virus e malware possono modificare tale file in modo da impedire l'accesso ad alcuni siti o dirottare l'utente su siti compromessi.
  • Provare a disattivare temporaneamente firewall e antivirus di terze parti.

Se dopo aver eseguito le verifiche sopra riportate Windows Update continua a non funzionare, si può provare ad eseguire i comandi sotto riportati dal Prompt dei comandi avviato come amministratore.
net stop wuauserv
net stop bits 
net stop appidsvc
net stop cryptsvc 
ren %systemroot%\System32\Catroot2 Catroot2.OLD
net start cryptsvc 
Del "%ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader\qmgr*.dat"
del /f /q %windir%\WindowsUpdate.log
del /f /s /q %windir%\SoftwareDistribution\*.*
sc.exe sdset bits D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)
                                                                                (A;;CCLCSWRPWPDTLOCRRC;;;PU)
sc.exe sdset wuauserv D:(A;;CCLCSWRPWPDTLOCRRC;;;SY)(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;BA)(A;;CCLCSWLOCRRC;;;AU)
                                                                                (A;;CCLCSWRPWPDTLOCRRC;;;PU)
%windir%\system32\regsvr32.exe /s %windir%\system32\atl.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\Urlmon.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\Mshtml.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\Shdocvw.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\browseui.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\jscript.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\vbscript.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\scrrun.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\msxml.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\msxml3.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\msxml6.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\actxprxy.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\softpub.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\oleaut32.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\ole32.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\shell32.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\wuapi.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\wuaueng.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\wuaueng1.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\wucltui.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\wups.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\wups2.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\wuweb.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\qmgr.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\qmgrprxy.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\wucltux.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\muweb.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\wuwebv.dll
regsvr32 /u /s wintrust.dll
regsvr32 /u /s initpki.dll
regsvr32 /u /s dssenh.dll
regsvr32 /u /s rsaenh.dll
regsvr32 /u /s gpkcsp.dll
regsvr32 /u /s sccbase.dll
regsvr32 /u /s slbcsp.dll
regsvr32 /u /s mssip32.dll
regsvr32 /u /s cryptdlg.dll
regsvr32 /s wintrust.dll
regsvr32 /s initpki.dll
regsvr32 /s dssenh.dll
regsvr32 /s rsaenh.dll
regsvr32 /s gpkcsp.dll
regsvr32 /s sccbase.dll
regsvr32 /s slbcsp.dll
regsvr32 /s mssip32.dll
regsvr32 /s cryptdlg.dll
%windir%\system32\regsvr32.exe /s %windir%\system32\quartz.dll
REG DELETE "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v AccountDomainSid /f
REG DELETE "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v PingID /f
REG DELETE "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WindowsUpdate" /v SusClientId /f
Netsh winhttp reset proxy
net start bits
net start wuauserv 
net start appidsvc
wuauclt /resetauthorization /detectnow

Per comodità ho creato il file WUReset.bat con i comandi sopra elencati. Chi vuole, può scaricare il file dal seguente link
DOWNLOAD
Una volta scaricato e scompattato, basta cliccare sul file WUReset.bat con il tasto destro del mouse e selezionare, dal menu contestuale, la voce Esegui come amministratore. Al termine delle operazioni (anche se alcuni comandi hanno restituito un errore) riavviare il sistema e rilanciare Windows Update (la prima ricerca di Windows Update potrebbe richiedere molto tempo).

La procedura indicata è stata testata in Windows 7, 8, 8.1 e 10.


lunedì 11 luglio 2016

PowerShell: Eseguire comandi presenti nella cronologia tramite Invoke-History

Il cmdlet Invoke-History consente di eseguire i comandi presenti nella cronologia dei comandi della sessione PowerShell.
Se eseguito senza alcun parametro, Invoke-History riesegue l'ultimo comando lanciato.
Invoke-History

Con Get-History possiamo visualizzare l'elenco dei comandi presenti nella cronologia con relativo ID. L'ID può essere passato al cmdlet Invoke-History in modo che venga eseguito quello specifico comando. Ad es.
Invoke-History -ID 3
esegue il comando avente ID 3.

Al parametro ID può essere passato anche parte del comando presente in cronologia che si intende eseguire. Ad es.
Invoke-History -ID Get-Pr
esegue l'ultimo comando che inizia per "Get-Pr" (come Get-Process, Get-PrinterDriver, ecc) presente in cronologia.
PowerShell, Invoke-History
FIG 1 - PowerShell, Invoke-History

Per eseguire più comandi possiamo utilizzare Invoke-History insieme al cmdlet Get-History. Ad es.
Get-History -ID 10 -Count 3 | Invoke-History
esegue i comandi memorizzati nella cronologia aventi come ID 8,9 e 10.




venerdì 8 luglio 2016

PowerShell: Visualizzare l'elenco dei comandi eseguiti con Get-History

Per visualizzare la cronologia della sessione PowerShell corrente, ovvero l'elenco degli ultimi comandi eseguiti, viene utilizzato il cmdlet Get-History. L'output del cmdlet mostra l'ID e il comando eseguito.


Get-History, visualizzare la cronologia dei comandi
FIG 1 - Get-History, visualizzare la cronologia dei comandi

Il numero di elementi memorizzati di default varia a seconda della versione PowerShell (64 in PowerShell 2.0, 4096 in Powershell 3.0 e successivi) e può essere modificato tramite la variabile $MaximumHistoryCount.
Per conoscere il valore di tale variabile e di conseguenza il numero di comandi memorizzati, si può utilizzare il comando:
Get-Variable  MaximumHistoryCount

Per modificare il numero di comandi memorizzati, invece, basta assegnare il valore voluto alla variabile $MaximumHistoryCount ad es.
$MaximumHistoryCount = 200
Get-Variable MaximumHistoryCount
FIG 2 - Get-Variable MaximumHistoryCount


I parametri utilizzabili con il cmdlet Get-History sono: ID e Count

ID
Specifica il numero ID di un comando presente nella cronologia. Se specificato con Get-History viene visualizzato solo il comando specificato:
Get-History -ID 2
visualizza solo il comando avente come ID 2
Get-History -ID
FIG 3 - Get-History -ID

Count
Visualizza il numero specificato di elementi più recenti presenti all'interno della cronologia:
Get-History -Count 3
visualizza gli ultimi 3 elementi della cronologia
Get-History -Count
FIG 4 - Get-History -Count

I parametri ID e Count se utilizzati insieme visualizzano n elementi specificati da Count fino all'elemento specificato da ID. Ad es.
Supponiamo che la cronologia contenga 18 elementi, lanciando il seguente comando
GetHistory -ID 10 -Count 3
otteniamo in output 3 comandi presenti nella cronologia di cui l'ultimo ha ID 10 (i comandi in output vanno da ID 8 a ID 10 come mostrato in FIG 5).
GetHistory con le opzioni ID e Count
FIG 5 - GetHistory con le opzioni ID e Count

giovedì 7 luglio 2016

Windows 10: Ripristinare l'App Microsoft Edge

Per ripristinare Microsoft Edge e relative impostazioni di default:
  • Eliminare la cartella
    %userprofile%\AppData\Local\Packages\Microsoft.MicrosoftEdge_8wekyb3d8bbwe


    Eliminare la cartella Microsoft.MicrosoftEdge_8wekyb3d8bbwe
    FIG 1 - Eliminare la cartella Microsoft.MicrosoftEdge_8wekyb3d8bbwe
  • Avviare PowerShell come amministratore ed eseguire il comando 
    get-AppXPackage -AllUsers -Name Microsoft.MicrosoftEdge | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml" -Verbose}
    Ripristino Microsoft Edge
    FIG 2 - Ripristino Microsoft Edge
  • Riavviare il sistema.

ATTENZIONE! Tutti i dati e le personalizzazione in Microsoft Edge verranno eliminati.




mercoledì 6 luglio 2016

Windows Quick Tip: Limitare i tempi di utilizzo del sistema da parte di un account tramite Net User

Per attivare una restrizione sui tempi di accesso e utilizzo del sistema da parte di un account è possibile agire tramite il prompt dei comandi.

Avviare il prompt dei comandi come amministratore (In Windows 8 e 10 premere la combinazione di tasti WIN+X e dal menu selezionare la voce Prompt dei comandi (amministratore) )
Prompt dei comandi (amministratore)
FIG 1 - Prompt dei comandi (amministratore)

Il comando da utilizzare per limitare il tempo di utilizzo del sistema da parte di un account ha la seguente sintassi:
net user <account_utente> /time:<intervallo-giorni>,<intervallo-ore>

Al posto di <account_utente> è necessario specificare l'account che si vuole limitare, <intervallo-giorni> e <intervallo-ore> rappresentano l'intervallo temporale in cui l'account è autorizzato ad accedere e ad utilizzare il sistema. I giorni della settimana vanno specificati con le lettere D, L, Ma, Me, G, V, S. Vediamo alcuni esempi.
Net User <account_utente> /time:<Intervallo-giorni>,<intervallo-ore>
FIG 2 - Net User <account_utente> /time:<Intervallo-giorni>,<intervallo-ore>

Per limitare l'accesso all'account Virtual2 dal Lunedì al Venerdì e dalle ore 7 alle ore 21
Net User Virtual2 /time:L-V,7-21
oppure
Net User Virtual2 /time:L-V,7am-9pm

Se all'intervallo vogliamo aggiungere anche Sabato e Domenica basta aggiungere il nuovo intervallo separandolo dal precedente con un punto e virgola
Net User Virtual2 /time:L-V,7-21; S-D,8-14

Per rimuovere la restrizione
Net User Virtual2 /time:all

Attenzione! Nel caso in cui dopo lo switch /time non venga specificato alcun intervallo, all'utente specificato sarà inibito sempre l'accesso al sistema.

La limitazione può essere impostata solo per gli utenti standard e non per gli account amministratore.

Per verificare se un account ha limitazioni temporali è possibile usare il comando
Net User <account_utente>
Ad es.
Net User Virtual2

Net User <account_utente>
FIG 3 - Net User <account_utente>

martedì 5 luglio 2016

PowerShell: Disabilitare/Abilitare una connessione di rete

Nell'articolo PowerShell: Visualizzare le proprietà delle schede di rete tramite Get-NetAdapter ho mostrato come recuperare le informazioni delle connessioni di rete tramite PowerShell. In questo articolo, invece, mostrerò come è possibile disabilitare e riabilitare una connessione di rete utilizzando i cmdlet Disable-NetAdapter e Enable-NetAdapter.
Per entrambi i cmdlet è necessario eseguire PowerShell come amministratore in caso contrario si riceverà un messaggio di errore di Accesso Negato.


Disable-NetAdapter

Disable-NetAdapter consente di disabilitare la connessione di rete specificata. Ad es.
Disable-NetAdapter -Name "Wi-Fi"
Al parametro Name va passato il nome della connessione di rete da disabilitare. Il parametro accetta anche i caratteri wildcard consentendo di specificare parte del nome della connessione.
Disable-NetAdapter -Name "Wi*"
oppure
Disable-NetAdapter -Name "W*Fi"
Prima che il comando venga eseguito viene visualizzata la richiesta di conferma (FIG 1).


Disable-NetAdapter, richiesta di conferma
FIG 1 - Disable-NetAdapter, richiesta di conferma


Per fare in modo che il comando venga eseguito senza che venga richiesta la conferma, è possibile utilizzare il parametro -Confirm passando il valore false:
Disable-NetAdapter -Name "Wi-Fi" –Confirm:$false

Una volta eseguito il comando, andando a verificare lo stato della connessione tramite Get-NetAdapter, noteremo che la connessione specificata è nello stato disabilitata (disabled). Anche in Gestione Dispositivi del sistema operativo, la scheda di rete risulterà disabilitata.
Get-NetAdapter, connessione di rete disabilitata
FIG 2 - Get-NetAdapter, connessione di rete disabilitata


Disable-NetAdapter consente anche di disabilitare una connessione di rete presente su una postazione/sessione remota, basta utilizzare il parametro -CimSession e specificare il nome della postazione. Ad es.
Disable-NetAdapter -Name "Wi-Fi" -CimSession computer1 -Confirm:$false
dove computer1 è il nome della postazione remota

Enable-NetAdapter

Enable-NetAdapter consente di abilitare una connessione di rete disabilitata e il suo utilizzo è del tutto analogo a quello visto con Disable-NetAdapter.

Per abilitare una connessione di rete
Enable-NetAdapter -Name "Wi-Fi"
Enable-NetAdapter -Name "Wi*"
oppure
Enable-NetAdapter -Name "W*Fi"

Per abilitare una connessione di rete senza che venga richiesto di confermare l'operazione
Enable-NetAdapter -Name "Wi-Fi" –Confirm:$false

Enable-NetAdapter, abilitare connessione di rete
FIG 3 - Enable-NetAdapter, abilitare connessione di rete

Per abilitare la connessione di rete su una sessione/postazione remota
Enable-NetAdapter -Name "Wi-Fi" -CimSession computer1 -Confirm:$false
dove computer1 rappresenta il nome della postazione o della sessione remota.


giovedì 30 giugno 2016

PowerShell: Visualizzare le proprietà delle schede di rete tramite Get-NetAdapter

Il cmdlet Get-NetAdapter consente di visualizzare le proprietà delle schede di rete. Lanciando il cmdlet da PowerShell visualizziamo le schede di rete visibili e alcune delle loro proprietà (FIG 1)
PowerShell cmdlet Get-NetAdapter
FIG 1 - PowerShell cmdlet Get-NetAdapter
Name: Rappresenta il nome assegnato alle Connessioni di rete.
InterfaceDescription: Descrizione dell'interfaccia. Generalmente contiene il modello/produttore della scheda.
ifIndex: Interface Index. Sulle workstation la proprietà ifIndex è rappresentata da un numero che identifica in modo univoco l'interfaccia di rete fisica o logica (non possono esserci due interfacce con lo stesso ifIndex).
Status: E' lo stato dell'interfaccia è indica se la connessione è attiva (UP), disconnessa (Disconnected) o disabilitata (Disabled).
MACAddress: Media Access Control. Si tratta dell'indirizzo fisico della scheda.
LinkSpeed: Rappresenta la massima velocità della connessione.

Per formattare l'output possiamo utilizzare i comandi Format come Format-List (abbreviato FL)
Get-NetAdapter |fl
Con questo tipo di formattazione vengono visualizzate ulteriori proprietà come DriverInformation che visualizza la versione del driver della scheda.
PowerShell cmdlet Get-NetAdapter |fl
FIG 2 - PowerShell cmdlet Get-NetAdapter |fl

Utilizzando Format-Custom (abbreviato FC) vengono visualizzate tutte le proprietà (comprese quelle non valorizzate) dell'interfaccia.
Get-NetAdapter |fc

Di seguito riporto alcuni esempi che possono essere utili in diverse occasioni.

Esempio 1
Get-NetAdapter -CimSession <nome_sessione/computer_remoto>
Con -CimSession possiamo specificare una sessione o un computer remoto e visualizzarne le proprietà delle schede di rete.

Esempio 2
Get-NetAdapter | Format-List -Property Name, InterfaceDescription, InterfaceName
Con Format-List -Property possiamo visualizzare solo le proprietà che ci interessano specificandole all'interno del comando. Nell'esempio viene richiesto di visualizzare solo le proprietà Name, InterfaceDescription e InterfaceName.
PowerShell cmdlet Get-NetAdapter |fl - Property
FIG 3 - PowerShell cmdlet Get-NetAdapter |fl - Property

Esempio 3
Get-NetAdapter -IncludeHidden
Per default vengono visualizzate solo le schede di rete visibili. Con l'opzione -IncludeHidden verrano visualizzate anche quelle non visibili/logiche.
PowerShell cmdlet Get-NetAdapter -IncludeHidden
FIG 4 - PowerShell cmdlet Get-NetAdapter -IncludeHidden

Esempio 4
Get-NetAdapter -Physical
Visualizza solo le schede di rete fisiche.

Esempio 5
Get-NetAdapter -Name "Ethernet"
Visualizza solo le proprietà della connessione di rete avente come nome quello specificato (Ethernet). É possibile utilizzare anche caratteri wildcard come nel seguente comando
Get-NetAdapter -Name "Eth*"
oppure
Get-NetAdapter -Name "E*t"
PowerShell cmdlet Get-NetAdapter -Name "Eth*"
FIG 5 - PowerShell cmdlet Get-NetAdapter -Name "Eth*"

Esempio 6
Get-NetAdapter | Format-Table –View Driver
Visualizza tutte le schede di rete visibili con tutte le proprietà relative ai driver
PowerShell cmdlet Get-NetAdapter | Format-Table –View Driver
FIG 6 - PowerShell cmdlet Get-NetAdapter | Format-Table –View Driver



mercoledì 29 giugno 2016

Ransomware ApocalypseVM: Recupero dei file

Circola una nuova variante del ransomware Apocalypse: ApocalypseVM. Al fine di rendere difficile il reverse engineering del malware da parte degli esperti di sicurezza, gli sviluppatori hanno provveduto a proteggerlo tramite l'utilizzo di VMProtect (un utility di compressione che provvede ad offuscare il codice contenuto nel file). Questa nuova variante del ransomware aggiunge ai file cifrati l'estensione .encrypted e .locked e, per ogni file cifrato, provvede alla creazione di un file di testo del tipo [filename].How_To_Get_Back.txt contenente le informazioni per il pagamento del riscatto. Anche per questa variante del ransomware Fabian Wosar di Emsisoft ha creato un tool per il recupero dei file cifrati. Il tool Emsisoft Decrypter for ApocalypseVM può essere scaricato dal seguente link:
DOWNLOAD

Per recuperare i propri dati basta trascinare la versione cifrata e quella non cifrata di un file (di almeno 4096 byte) sul file eseguibile del tool al fine di generare la chiave privata.
Una finestra di dialogo mostrerà la chiave privata recuperata e, cliccando su OK, verrà visualizzata una nuova schermata che consentirà di decriptare i dati tramite il pulsante Decrypt. Al termine dell'operazione, nella scheda Results, verranno visualizzati i risultati.


Emsisoft Decrypter for ApocalypseVM
FIG 1 - Emsisoft Decrypter for ApocalypseVM