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