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 GPUPDATE, 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.

102915_1408_aggiornamen1

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).

102915_1408_aggiornamen2

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.

102915_1408_aggiornamen3

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!!!!).

102915_1408_aggiornamen4

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!!!

 

 

 

Riccardo Verona

Autore

Riccardo Verona è consulente e trainer IT freelance specializzato in ambito Windows Server/Client, Active Directory ed automazione con PowerShell. Dal 1997 ha alternato lo sviluppo software all'approfondimento delle piattaforme Microsoft per passare definitivamente, nel 2004, all'implementazione, amministrazione e gestione di infrastrutture IT, settore in cui ha conseguito le sue certificazioni. Ha maturato importanti esperienze anche nell'ambito della sicurezza, dei sistemi di messaggistica e dei database server per far fronte alle esigenze quotidiane dei clienti. Recentemente ha iniziato ad approfondire le tematiche di hybrid-cloud, in particolare Windows Azure, sfruttando l’automazione con PowerShell per l’implementazione delle infrastrutture. E’ un Trainer Microsoft certificato e partecipa, in qualità di speaker a seminari e conferenze tra cui il noto Microsoft Worldwide Partner Conference.