Archive

Posts Tagged ‘PowerShell’

PowerShell ed il NUMLOCK delle VM

A molti di voi, usando Hyper-V da windows 8.1, sarà capitato di aprire una virtual machine e trovarsi disabilitato il blocco numerico della tastiera. Nelle precedenti versioni (e generazioni) dell’hypervisor e delle VM era possibile impostare lo stato del NumLock con un flag, ora non è più previsto e come si può fare per abilitare questa impostazione? La risposta sta, come in molti casi, nei valori delle chiavi del registro di sistema.

Possiamo scegliere se applicare questa impostazione per l’utente corrente oppure per tutti gli utenti, questa scelta è assolutamente personale, quindi modificate il valore che ritenete più corretto per le vostre esigenze. Per quanto riguarda l’utente connesso al sistema è sufficiente digitare il seguente comando

    Set-ItemProperty
-Path
‘HKCU:\Control Panel\Keyboard’
-Name
InitialKeyboardIndicators
-Value
2

 

Mentre per applicare l’impostazione a tutti gli utenti dovremo anche aggiungere un PSDrive per poter accedere all’hive HKEY_USERS. Quindi i comandi da digitare risultano essere i seguenti

New-PSDrive
-PSProvider
Registry
-Root
HKEY_USERS
-Name
HKUS

Set-ItemProperty
-Path
‘HKUS:\.DEFAULT\Control Panel\Keyboard’
-Name
InitialKeyboardIndicators
-Value
2

 

Nulla di particolarmente complesso, ma va ricordato, come sempre in questi casi, che si stanno apportando modifiche al registro di sistema, quindi se vi dovesse capitare di sbagliare a digitare i parametri dei cmdlets sopra riportati mi riterrò sollevato da ogni responsabilità J . Per verificare che il valore sia stato recepito correttamente basterà interrogare il registro di sistema

Get-Item
-Path
‘HKCU:\Control Panel\Keyboard’

Get-ItemProperty
-Path
‘HKCU:\Control Panel\Keyboard’
-Name
InitialKeyboardIndicators

 

Il primo cmdlet ci mostrerà il contenuto della chiave del registro di Sistema, il secondo le proprietà del valore che abbiamo richiesto. Ovviamente se avete applicato l’impostazione per tutti gli utenti correggete il path indicato nei cmdlets.

È possibile impostare “InitialKeyboardIndicators” anche su altri valori, la tabella sottostante è autoesplicativa

Valore

Significato

0

Disattiva tutti gli indicatori (NumLock, CapsLock, ScrollLock)

1

Attiva CapsLock

2

Attiva NumLock

3

Attiva CapsLock e NumLock

4

Attiva ScrollLock

5

Attiva CapsLock e ScrollLock

6

Attiva NumLock e ScrollLock

7

Attiva tutti gli indicatori (NumLock, CapsLock, ScrollLock)

 

Questa impostazione è valida a prescindere dal fatto che si stia usando una virtual machine, difatti è possibile forzare il valore anche per le macchine fisiche.

PowerShell Day: Agenda ed iscrizioni

Buon giorno!!!
Da oggi l’agenda del PowerShell Day è online! Potete consultarla ed ovviamente iscrivervi collegandovi a questo url: http://powershellday.eventbrite.com

Vi aspettiamo!!! 🙂

PowerShell Day

Ok! Ci siamo!!! Grazie al team di #DotNetLombardia e #MicrosoftItalia abbiamo organizzato il #PowerShellDay!

Vi aspettiamo numerosi! Per registarvi all’evento e per le informazioni logistiche visitate questo link: http://powershellday.eventbrite.com

Buono scripting a tutti!!! 🙂

Impostare il DNS aging and scavenging con PowerShell

Capita abbastanza spesso di trovare, nelle zone del DNS Server, dei record vecchi o non più in essere. Mantenere pulite le registrazioni del DNS Server è sicuramente un’attività importante che sovente non viene effettuata quindi per supportarci in questo compito abbiamo a disposizione, per il DNS Server presente da Windows Server, due parametri, uno che valutano la vecchiaia dei record e l’altro che regola la periodicità dell’azione di pulizia.

PowerShell mette a disposizione i cmdlets necessari per impostare questi parametri: Set-DnsServerScavenging e Set-DnsServerZoneAging.

Set-DnsServerScavenging -ScavengingState $true -RefreshInterval 7.00:00:00| `

-ApplyOnAllZones

Innanzi tutto utiliziamo Set-DnsServerScavenging per abilitare la pulizia dei record vecchi, usando il parametro -ApplyOnAllZones potremo propagare il settaggio a tutte le zone registrate sul DNS Server. Il parametro -RefreshInterval ammette come input il periodo da considerare espresso nel formato “giorni.ore:minuti:secondi“. Dopo aver abilitato la pulizia automatica dovremo andare a specificare, zona per zona, il periodo dopo il quale i record vanno considerati vecchi.

Get-DnsServerZone | `
    Where-Object {$_.IsAutoCreated -eq $False -and $_.ZoneName -ne ‘TrustAnchors’} | `
    Set-DnsServerZoneAging -Aging $true -RefreshInterval 7.00:00:00

Usando Set-DnsServerZoneAging possiamo specificare il periodo desiderato, seguendo la stessa convenzione di Set-DnsServerScaverging, lo andremo ad imputare. Per impostare il valore per tutte le zone è necessario leggerle, per questo possiamo usare il cmdlet Get-DnsServerZone. Siccome non è possibile applicare queste impostazioni alle zone autocreate vanno escluse con un filtro.

Al seguente link troverete lo script con i comandi: DNSAgingScavenging.ps1.

Buono scripting a tutti!!! J

Azure PowerShell a WPC2015

Il countdown è iniziato!!! Martedì inizia la 22^ edizione di WPC! Vi aspetto per la mia sessione “Hybrid Cluod con Azure PowerShell”!!!

Non mancate a questo importante evento, saranno presenti numerosi speaker di alto livello che presenteranno argomenti molto interessanti.

Aggiornamento forzato di GPO da remoto con PowerShell

Uno degli aspetti più delicati nella gestione delle infrastrutture di dominio sono le Group Policy. Tutti gli amministratori di rete hanno implementato almeno 8 impostazioni mediante le GPO (Group Policy Objects), per intenderci, quelli legati alla scadenza delle password ed il blocco degli account. Pochi, invece, implementano GPO complesse ed ancor meno sfruttano l’applicazione di regole alle OU (Organizational Units) per impostazioni granulari di regole; tutti però hanno l’esigenza di propagare le GPO ai destinatari. Come noto le GPO possono essere per utente o per computer, vengono applicate all’avvio del pc ed all’accesso dell’utente, vengono rinfrescate periodicamente (tipicamente ogni 120 minuti), alcune possono essere recepite dopo un paio di riavvii…e noi stiamo ad aspettare! Noioso, direi! Possiamo far in modo che le GPO su una specifica macchina vengano aggiornate anzi tempo? CERTO! Tra i vari comandi presenti sui nostri pc è disponibile GUPUDATE, un eseguibile che ci permette di aggiornare le GPO per la nostra macchina, ma risulta poco adatto per l’esecuzione su altre macchine; con PowerShell, invece, abbiamo la possibilità di effettuare l’aggiornamento delle GPO di macchine remote con uno sforzo minimo utilizzando il cmdlet Invoke-GPUpdate.

L’utilizzo di questo cmdlet è molto semplice, specificando il parametro -Computer seguito dal nome del computer (o dall’elenco dei nomi di computers separati da virgola) verrà eseguito remotamente l’aggiornamento delle GPO. Ovviamente è disponibile il parametro -Force per imporre l’esecuzione forzata dell’aggiornamento ed è possibile specificare, col parametro -Target, su quale gruppo d’impostazioni agire (Computer oppure Users).

Siccome PowerShell è uno strumento di gestione ed automazione risulta più interessante leggere le macchine a cui applicare l’aggiornamento delle GPO direttamente da Active Directory Domain Services. Utilizzando il cmdlet Get-ADComputer potremo ottenere l’elenco delle macchine e quindi passando in pipe il risultato far eseguire l’operazione mediante il ciclo foreach. Purtroppo Invoke-GPUpdate non ammette il passaggio di parametri in pipe, quindi siamo obbligati ad utilizzare foreach per scandire ogni oggetto estratto da Get-ADComputer.

Così facendo chiederemo al sistema di leggere tutte le macchine da AD DS e riapplicare le GPO. Ovviamente in una piccola realtà questo è sicuramente fattibile in tempi ragionevoli ma in realtà molto estese potrebbe essere abbastanza impegnativo eseguire questa sequenza di cmdlets! Per questo motivo, specie su realtà geograficamente distribuite o molto articolate (in particolare con la struttura delle GPO) sarebbe idoneo applicare un filtro per la lettura dei sistemi da AD DS, per applicare questa limitazione alla ricerca va specificato il parametro -SearchBase al cmdlet Get-ADComputer. Il valore del parametro deve essere imputato in formato LDAP, come nel sottostante esempio (occhio all’accento grave!!!!).

Per far sì che le GPO vengano rilette mediante Invoke-GPUpdate è necessario ricordarsi di abilitare sulle macchine Windows Remote Management (WinRM), mediante l’esecuzione del cmdlet Enable-PSRemoting, e che le porte del firewall siano aperte per garantire l’accesso al servizio WinRM.

Per comodità potrete accedere al file DistribuzioneGPO.ps1 per copiare i cmdlets proposti in questo post. Attenzione alla versione di PowerShell che state utilizzando! È necessario utilizzare almeno la versione 3 (quindi da Windows Server 2012/Windows 8 in poi).

Buono scripting a tutti!!! J

Archivi compressi con PowerShell

Lavorando con un’edizione core di Windows Server 2012 R2 si presume di non poter sfruttare alcune delle caratteristiche messe a disposizione dell’edizione con interfaccia grafica, come per esempio la possibilità di comprimere dei files/cartelle in un archivio compresso oppure di effettuare il processo inverso, quindi l’espansione di in file compresso. PowerShell mette a disposizione due cmdlets per effettuare queste operazioni:

  • Compress-Archive: comprime files o cartelle all’interno di un archivio;
  • Expand-Archive: espande il contenuto di un archivio nel percorso assegnato.

Perché comprimere dei files con un cmdlets PowerShell? Possono esserci numerosi motivi, per esempio, potrebbe essere comodo conservare in un file compresso i risultati dell’elaborazione di un processo, mantenere traccia dei logo di un programma (che vengono regolarmente sovrascritti), allegare ad una mail informazioni relative allo stato del sistema ed altro ancora. Come riportato in figura l’uso del cmdlet di compressione è molto semplice, basta indicare ciò che vogliamo comprimere e l’archivio di destinazione, non serve altro poiché il livello di compressine predefinito è Optimal. Ho riportato, nella medesima figura i risultati ottenibili con i vari livelli di compressione di Compress-Archive ed il confronto con l’output di “cartelle compresse” di Windows Explorer; PowerShell lavora meglio del sistema!!! J

Se al posto di specificare, per il parametro -Path, un file (o più files separati da virgola) specificassimo una cartella otterremmo come risultato un file compresso con l’intero contenuto del percorso specificato. E se specificassimo più cartelle, separate da virgola???? Esattamente come per i files!!! L’archivio compresso conterrebbe esattamente i contenuti specificati!!!

Il parametro -Update di Compress-Archive ci permette di aggiornare i contenuti di un archivio compresso già esistente. Se però dimenticate di specificare questo parametro, ed eseguirete la compressione di contenuti usando l’archivio compresso esistente, perderete i contenuti precedentemente archiviati.

La decompressione dell’archivio è molto semplice, specificando l’archivio compresso come valore del parametro -Path ed indicando la cartella di destinazione come valore del parametro -DestinationPath, verrà creata (qualora non presente) la cartella di destinazione ed i nostri contenuti saranno disponibili per le nostre elaborazioni. Il parametro -Force impone la sovrascrittura della destinazione, qualora vi siano già i contenuti presenti nel nostro archivio compresso.

Un esempio pratico potrebbe essere interessante. Ammettiamo che sulla macchina sia caricata un’istanza di SQL Server 2014, voglio salvare un database di quell’istanza e poi lo voglio archiviare in un luogo diverso (e voi direte, parametrizza il cmdlet di salvataggio!!!) ma devo ridurre al massimo la dimensione del backup. Posso, molto semplicemente, preparare uno script per effettuare in pochi passaggi quanto desiderato.

$DBName = ‘YourDBName’

$SQLInstanceName = ‘YourSQLInstanceName’

$BackupDateTime = Get-Date -Format yyyyMMddHHmmss

$BackupFile = “C:\YourPath\$($DBName)_db_$($BackupDateTime).bak”

$CompressedBackupFile = “C:\YourPath\$($DBName)_db_$($BackupDateTime).zip”

Backup-SqlDatabase -ServerInstance $SQLInstanceName -Database $DBName -BackupFile $BackupFile

Compress-Archive -Path $BackupFile -DestinationPath $CompressedBackupFile

Remove-Item -Path $BackupFile

Mi vogliano scusarmi i DBA di SQL Server se non sono stato molto accurato nella preparare questo script, so che comprenderanno!!! J

In ogni caso, lo script proposto lo potrete prelevare a questo link: BackupSQL-with-compression.ps1

Il risultato che otterremo dall’esecuzione dello script è abbastanza evidente (ho evitato la rimozione del file di salvataggio solo per mostrare che l’operazione viene eseguita)

Buona compressione a tutti!!! E buono scripting!!!

%d blogger hanno fatto clic su Mi Piace per questo: