Microsoft Desired State Configuration v3 in Windows Server 2025

Sono passati diversi anni da quando vi ho parlato di PowerShell Desired State Configuration, la tecnologia che permette di definire come devono essere configurati i vostri server e di verificare che le impostazioni corrispondano a quelle desiderate.

Con Microsoft Desired State Configuration v3 (DSC v3) Microsoft ha introdotto importanti cambiamenti. DSC è ora un eseguibile autonomo, indipendente da PowerShell, che potete utilizzare dalla riga di comando. Non viene più utilizzato il Local Configuration Manager e le configurazioni vengono descritte in file YAML o JSON, senza dover generare i file MOF che avevamo utilizzato nella versione precedente.

L’obiettivo rimane quello di avere le macchine configurate secondo le vostre esigenze. Potete, ad esempio, verificare che un ruolo sia installato, che un servizio abbia il tipo di avvio previsto oppure che una chiave del Registro di sistema contenga un determinato valore. DSC confronta lo stato attuale con quello desiderato e permette di applicare le modifiche necessarie. Per ripetere queste operazioni nel tempo potete utilizzare un’attività pianificata o uno strumento di automazione.

In questa guida vi mostrerò come installare e utilizzare DSC v3 in Windows Server 2025. Vedremo come individuare le risorse disponibili, creare una prima configurazione e verificarne il funzionamento. Riprenderemo anche l’esempio dell’installazione di IIS, così da vedere concretamente cosa cambia rispetto alla procedura che vi avevo mostrato nella guida originale.

Installazione di PowerShell 7 e DSC v3

Per questa guida utilizzeremo una macchina con Windows Server 2025 con Esperienza desktop (Desktop Experience) ed eseguiremo l’installazione di PowerShell 7 e DSC v3 tramite WinGet, disponibile in questa modalità di installazione del sistema operativo.

Cominciamo da PowerShell 7, che installeremo accanto a Windows PowerShell 5.1. Aprite una console di Windows PowerShell con privilegi amministrativi e verificate che WinGet sia disponibile utilizzando il comando:

Procedete quindi con l’installazione di PowerShell 7:

Figura 1: Installazione di PowerShell 7 tramite WinGet completata in Windows Server 2025

Al termine dell’installazione chiudete la console e aprite PowerShell 7 con privilegi amministrativi dal menu Start. Per verificare la versione in esecuzione utilizzate:

Controllate che il valore di PSVersion sia della versione 7 e che PSEdition riporti Core. In questo modo avete la conferma di essere nella nuova console.

Figura 2: Verifica della versione di PowerShell 7

PowerShell 7 non è richiesto dal motore DSC v3, che è un eseguibile autonomo, ma lo utilizzeremo come ambiente di lavoro per i comandi della guida e per le risorse che ne richiedono l’esecuzione.

Dalla console di PowerShell 7 cercate il pacchetto DSC, così da controllare la versione disponibile nella sorgente WinGet:

Installate quindi DSC v3 utilizzando il comando:

Il pacchetto Microsoft.DSC è utilizzato anche nella procedura pubblicata da Microsoft per Windows Server 2025. Verificate la versione proposta da WinGet, perché le funzionalità che potrete utilizzare dipendono dalla release installata.

Figura 3: Ricerca del pacchetto e installazione di DSC v3.2.2 tramite WinGet

Una volta completata l’installazione, chiudete e riaprite PowerShell 7 con privilegi amministrativi e controllate che il comando DSC sia disponibile:

Per visualizzare i comandi supportati potete utilizzare:

Figura 4: Verifica della versione di DSC e visualizzazione dei comandi disponibili

Per conoscere invece le risorse disponibili sul server eseguite:

Le risorse sono i componenti che DSC utilizza per leggere, verificare e modificare le impostazioni del sistema. Prima di scrivere una configurazione è quindi utile controllare quali risorse sono disponibili, così da individuare quelle necessarie per le operazioni che volete eseguire.

Figura 5: Visualizzazione delle risorse DSC disponibili sul server

Creazione della configurazione per installare IIS

Dopo aver installato DSC possiamo passare alla creazione di una configurazione. Vediamo quindi come installare il ruolo Web Server (IIS) utilizzando un documento YAML.

Nel server utilizzato per questa guida WinGet ha installato DSC 3.2.2. Utilizzeremo quindi la risorsa WindowsFeature del modulo PSDesiredStateConfiguration, richiamandola attraverso l’adapter Microsoft.Windows/WindowsPowerShell. Questo adapter permette a DSC v3 di utilizzare le risorse compatibili con Windows PowerShell 5.1, anche se eseguite il comando dsc dalla console di PowerShell 7.

Per visualizzare le risorse individuate dall’adapter, aprite PowerShell 7 con privilegi amministrativi ed eseguite:

Nell’elenco verificate la presenza di PSDesiredStateConfiguration/WindowsFeature, che utilizzeremo per gestire l’installazione del ruolo.

Errore durante la ricerca delle risorse Windows PowerShell

Eseguendo il comando dsc resource list –adapter Microsoft.Windows/WindowsPowerShell dalla console di PowerShell 7 potreste ricevere un errore relativo al caricamento delle DLL di PackageManagement, con un riferimento alla sottocartella fullclr.

Nel nostro caso l’adapter cercava il modulo nella cartella di PowerShell 7. Windows PowerShell può infatti ereditare dal processo che lo avvia una variabile PSModulePath contenente anche i percorsi dei moduli di PowerShell 7, con possibili problemi di compatibilità.

Figura 6: Errore durante la ricerca delle risorse Windows PowerShell

Per risolvere il problema nella console corrente, salvate il valore della variabile e impostate i percorsi dei moduli di Windows PowerShell:

Ripetete quindi la ricerca:

Nell’elenco dovreste trovare PSDesiredStateConfiguration/WindowsFeature, la risorsa che utilizzeremo per installare IIS.

Mantenete questa console aperta per eseguire i successivi comandi DSC di lettura, verifica e applicazione della configurazione. La modifica riguarda soltanto la sessione corrente e i processi avviati da essa.

Al termine delle operazioni potete ripristinare il valore precedente con:

Chiudendo la console, la modifica temporanea viene comunque persa.

Figura 7: Impostazione di PSModulePath nella sessione corrente e visualizzazione delle risorse disponibili tramite l’adapter Windows PowerShell

Create una cartella in cui salvare i documenti di configurazione e aprite il Blocco note per preparare il file:

Inserite il seguente contenuto e salvate il file:

La configurazione riprende l’esempio pubblicato dal team PowerShell per installare IIS attraverso la risorsa classica WindowsFeature.

Il campo $schema identifica lo schema del documento DSC, mentre resources contiene le risorse da utilizzare. Nel nostro caso l’adapter richiama WindowsFeature, alla quale passiamo il nome del ruolo, Web-Server, e lo stato desiderato, Present.

Non stiamo indicando una sequenza di comandi da eseguire: stiamo dichiarando che il ruolo IIS deve essere presente sul server. La risorsa si occupa di verificarne lo stato e di installarlo quando necessario.

Fate attenzione all’indentazione del file: in YAML gli spazi definiscono la struttura del documento. Mantenete quindi gli allineamenti dell’esempio e assicuratevi che il file venga salvato come iisconfig.yaml, senza l’estensione aggiuntiva .txt.

Figura 8: Creazione del file iisconfig.yaml per installare il ruolo IIS tramite la risorsa WindowsFeature

Verifica dello stato del server

Prima di applicare la configurazione potete leggere lo stato attuale delle risorse descritte nel file:

Figura 9: Lettura dello stato del ruolo IIS tramite dsc config get – il valore Ensure: Absent indica che il ruolo non è installato

Per verificare se il server corrisponde alla configurazione desiderata utilizzate invece:

Il comando test verifica la conformità senza installare il ruolo. Se IIS non è presente, nel risultato relativo alla risorsa WindowsFeature troverete inDesiredState: false, insieme alle informazioni sullo stato attuale e su quello richiesto. Questo risultato indica che è necessario applicare una modifica per ottenere la configurazione desiderata.

Figura 10: Verifica della conformità tramite dsc config test – inDesiredState: false indica che il ruolo IIS è assente, mentre la configurazione ne richiede la presenza

Applicazione della configurazione

Per procedere con l’installazione di IIS eseguite:

Il comando set applica la configurazione: DSC verifica lo stato delle risorse e richiama l’operazione di modifica per quelle che non risultano conformi. Se il ruolo è già presente, non è necessario installarlo nuovamente.

Figura 11: pplicazione della configurazione per installare IIS tramite dsc config set

Al termine dell’operazione ripetete il controllo:

Se l’installazione è stata completata correttamente, il risultato relativo a WindowsFeature riporterà inDesiredState: true. Potete verificare la presenza del ruolo anche da Server Manager e aprire sul server l’indirizzo http://localhost per visualizzare la pagina iniziale di IIS.

Figura 12: Verifica dopo l’installazione di IIS – il valore inDesiredState: true conferma che il ruolo è presente e conforme alla configurazione desiderata

Ricordate che l’applicazione del file non attiva un controllo periodico della configurazione. DSC v3 esegue l’operazione richiesta e termina: per verificare o riapplicare la configurazione nel tempo dovrete richiamarlo nuovamente, ad esempio attraverso un’attività pianificata.

Riapplicazione della configurazione e controllo periodico

Dopo aver installato IIS, il comando dsc config test ha restituito inDesiredState: true. Il ruolo è quindi presente e il server rispetta quanto dichiarato nel file YAML.

Cosa succede se applicate nuovamente la stessa configurazione? Potete verificarlo eseguendo:

DSC verifica lo stato delle risorse prima di modificarle. Poiché IIS è già installato, la risorsa non deve ripetere l’installazione. Questo comportamento, chiamato idempotenza, permette di riutilizzare lo stesso documento per ottenere lo stato desiderato anche quando la macchina è già configurata correttamente.

Figura 13: Riapplicazione della configurazione con dsc config set – IIS è già presente e non richiede una nuova installazione

Occorre però ricordare che DSC v3 non controlla autonomamente il server dopo l’esecuzione del comando. Se qualcuno rimuove successivamente il ruolo IIS, la configurazione rimane nel file YAML, ma il ruolo verrà reinstallato soltanto alla successiva esecuzione di dsc config set.

Inoltre, il controllo riguarda le proprietà dichiarate: nel nostro esempio verificate la presenza del ruolo Web-Server. L’arresto di un sito o la modifica delle sue impostazioni richiedono risorse e proprietà aggiuntive.

Esecuzione tramite Utilità di pianificazione

Per richiamare periodicamente DSC potete utilizzare Utilità di pianificazione. Prepariamo uno script che imposti i percorsi dei moduli Windows PowerShell, applichi la configurazione e salvi il risultato in un file.

Aprite il Blocco note:

Inserite il seguente contenuto e salvate il file:

Lo script contiene direttamente la correzione di PSModulePath: il suo funzionamento non dipende quindi dalle modifiche effettuate nella console o da una funzione salvata nel profilo.

Figura 14: Creazione dello script Apply-IISConfiguration.ps1 per applicare la configurazione DSC e salvare il risultato in un file di log

Aprite Utilità di pianificazione eseguendo taskschd.msc

Selezionate Crea attività e assegnate il nome DSC – Configurazione IIS. Per questa prova utilizzate lo stesso account amministrativo con cui avete installato e verificato DSC, selezionate Esegui solo se l’utente è connesso e abilitate Esegui con i privilegi più elevati.

Questa modalità consente di verificare la pianificazione nel contesto dell’utente per il quale il comando DSC è già disponibile. L’attività funzionerà mentre quell’utente è connesso, anche con la sessione bloccata. Per un’esecuzione indipendente dall’accesso dovrete verificare separatamente disponibilità di DSC e autorizzazioni dell’account scelto.

Nella scheda Attivazione create un’attivazione giornaliera e impostate la ripetizione ogni 30 minuti, per la durata di 1 giorno, abilitando l’attivazione. Nella scheda Azioni aggiungete un’azione di tipo Avvio programma.

Nel campo Programma o script inserite C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Nel campo Aggiungi argomenti inserite -NoProfile -NonInteractive -File “C:\DSC\Apply-IISConfiguration.ps1”

Per questa attività utilizziamo Windows PowerShell 5.1, già presente sul server e compatibile con la risorsa utilizzata. DSC rimane lo stesso eseguibile v3 installato tramite WinGet.

Nella scheda Impostazioni, scegliete Non avviare una nuova istanza se l’attività è già in esecuzione, così da evitare applicazioni contemporanee della configurazione.

Salvate l’attività e selezionate Esegui per provarla subito.

Figura 15: Attività pianificata per eseguire lo script Apply-IISConfiguration.ps1 e riapplicare la configurazione DSC ogni 30 minuti

Controllate il risultato dell’ultima esecuzione e il file generato in C:\DSC\Logs: il codice 0x0 indica che lo script è terminato con codice di uscita zero. Nel risultato DSC verificate anche che hadErrors sia false.

Con questa pianificazione, ogni 30 minuti DSC applicherà la configurazione e correggerà gli eventuali scostamenti relativi alla presenza del ruolo IIS.

Figura 16: Esecuzione dell’attività pianificata completata con codice 0x0 e verifica del log DSC, che riporta hadErrors: false

Le novità introdotte con DSC 3.3

Gli esempi di questa guida sono stati eseguiti con DSC 3.2.2, la versione proposta dalla sorgente WinGet utilizzata durante l’installazione. Microsoft ha però annunciato anche DSC 3.3, che introduce nuove risorse e funzionalità. È utile conoscere queste differenze, perché alcuni esempi della documentazione più recente richiedono la nuova versione.

Tra le novità trovate Microsoft.Windows/WindowsFeatureList, che permette di gestire un elenco di funzionalità Windows, e Microsoft.Windows/RegistryList, con cui potete raggruppare più impostazioni del Registro di sistema nella stessa istanza di risorsa. La risorsa Microsoft.Windows/Personalization consente invece di configurare impostazioni di personalizzazione di Windows.

Viene inoltre ampliato il supporto a –what-if, per visualizzare le modifiche previste senza applicarle. Il supporto dipende dalla risorsa utilizzata: nella versione 3.3 viene esteso alle risorse per servizi, regole firewall e configurazione SSHD.

Le nuove funzioni stateChanged() e restartRequired() permettono rispettivamente di verificare se una risorsa è stata modificata durante l’operazione e se è richiesto un riavvio del sistema, di un servizio o di un processo. Infine, il comando dsc mcp diventa dsc server, mantenendo il nome precedente come alias compatibile.

Prima di utilizzare queste funzionalità, controllate quindi la versione effettivamente installata:

Per verificare se la sorgente WinGet propone un aggiornamento del pacchetto utilizzato nella guida, eseguite:

La disponibilità di una nuova release nel repository del progetto non implica che quella stessa versione sia già presente nella sorgente WinGet. Controllate la versione proposta dal comando prima di procedere con l’aggiornamento.

Conclusioni

In questa guida vi ho mostrato come installare PowerShell 7 e DSC v3 in Windows Server 2025 con Esperienza desktop, creare un documento YAML e utilizzarlo per installare il ruolo IIS. Abbiamo verificato lo stato iniziale del server, applicato la configurazione e controllato che il risultato corrispondesse a quello richiesto.

Rispetto alla guida precedente cambia soprattutto il modo in cui viene eseguita e mantenuta la configurazione. Il file YAML descrive lo stato desiderato, mentre il comando DSC legge, verifica o applica le impostazioni. L’esecuzione periodica viene affidata a uno strumento esterno, come l’attività pianificata che abbiamo configurato.

Potete partire da questo esempio per aggiungere altre risorse e descrivere le impostazioni necessarie ai vostri server. La conformità viene verificata rispetto a ciò che dichiarate nel documento: nel nostro caso la presenza di IIS, negli esempi successivi anche servizi, impostazioni del Registro di sistema e altri componenti.

Maggiori informazioni sono disponibili alle pagine ufficiali:

Announcing Microsoft Desired State Configuration v3.0.0 – PowerShell Team

Announcing Microsoft Desired State Configuration v3.1.0 – PowerShell Team

Announcing Microsoft Desired State Configuration v3.2.0 – PowerShell Team

Announcing Microsoft Desired State Configuration v3.3.0 – PowerShell Team