{"id":20968,"date":"2026-04-29T10:31:13","date_gmt":"2026-04-29T18:31:13","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/powershell\/?p=20968"},"modified":"2026-05-04T08:31:04","modified_gmt":"2026-05-04T16:31:04","slug":"announcing-dsc-v3-2-0","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/powershell\/announcing-dsc-v3-2-0\/","title":{"rendered":"Announcing Microsoft Desired State Configuration v3.2.0"},"content":{"rendered":"<p><!-- markdownlint-disable MD041 --><\/p>\n<h1>Announcing DSC v3.2.0<\/h1>\n<p>We&#8217;re excited to announce the General Availability of Microsoft Desired State Configuration (DSC)\nv3.2.0. This release delivers new built-in Windows resources, experimental Bicep integration via\ngRPC, version pinning, a richer expression language, custom functions, and continued adapter\nimprovements. All these changes are driven by real-world use, partner feedback, and community\ncontributions. Special thanks to the WinGet team and the incredible DSC community.<\/p>\n<p>For background on the DSC v3 platform, see:<\/p>\n<ul>\n<li>DSC v3.0.0 <a href=\"https:\/\/devblogs.microsoft.com\/powershell\/announcing-dsc-v3\/\">Announcement<\/a><\/li>\n<li>DSC v3.1.0 <a href=\"https:\/\/devblogs.microsoft.com\/powershell\/announcing-dsc-v3-1-0\/\">Announcement<\/a><\/li>\n<\/ul>\n<h2>What&#8217;s New in DSC v3.2<\/h2>\n<h3>New Windows resources<\/h3>\n<p>DSC v3.2 ships several new built-in Windows resources, significantly expanding what you can manage\nout of the box:<\/p>\n<ul>\n<li><code>Microsoft.Windows\/Service<\/code> \u2014 manage Windows services<\/li>\n<li><code>Microsoft.Windows\/OptionalFeatureList<\/code> \u2014 manage Windows Optional features\n<ul>\n<li>Requires using the ZIP package of DSC for now<\/li>\n<\/ul>\n<\/li>\n<li><code>Microsoft.Windows\/FeatureOnDemandList<\/code> \u2014 manage Windows Features on Demand\n<ul>\n<li>Requires using the ZIP package of DSC for now<\/li>\n<\/ul>\n<\/li>\n<li><code>Microsoft.Windows\/FirewallRuleList<\/code> \u2014 manage Windows Firewall rules<\/li>\n<li><code>Microsoft.OpenSSH.SSHD\/sshd_config<\/code> \u2014 manage entire SSH server configuration<\/li>\n<li><code>Microsoft.OpenSSH.SSHD\/Subsystem<\/code> and <code>Microsoft.OpenSSH.SSHD\/SubsystemList<\/code> \u2014 manage SSH server\nconfiguration for subsystem entries<\/li>\n<li><code>Microsoft.OpenSSH.SSHD\/Windows<\/code> \u2014 manage Windows SSH server configuration, such as the default\nshell<\/li>\n<\/ul>\n<p>These resources are included in the DSC package and ready to use without additional installation.<\/p>\n<h3>Bicep integration via gRPC (experimental)<\/h3>\n<p>DSC v3.2 introduces a gRPC server, enabling Bicep to orchestrate DSC resources directly. The\n<code>dsc-bicep-ext<\/code> extension is now included in the MSIX package and exposed on <code>PATH<\/code>.<\/p>\n<p>This is the foundation for the <em>Bicep to DSC integration<\/em>. Write your configuration in Bicep. Bicep\norchestrates the execution directly over gRPC without going through ARM.<\/p>\n<h3>Extended WhatIf support<\/h3>\n<p>DSC v3.2 adds <code>--what-if<\/code> support to the <code>dsc resource set<\/code> command, letting you preview changes\nbefore applying them:<\/p>\n<pre><code class=\"language-bash\">dsc resource set --what-if --resource Microsoft.Windows\/Service --input '{\r\n    \"name\": \"spooler\",\r\n    \"startType\": \"disabled\"\r\n}'<\/code><\/pre>\n<p>Prior to this release there was no way to run <code>--what-if<\/code> against individual resources. You could\nuse the <code>--what-if<\/code> flag with the <code>dsc config set<\/code> command, which ran all resources in your\nconfiguration in <code>--what-if<\/code> mode.<\/p>\n<p>Resource manifests can now declare <code>whatIfReturns<\/code> to describe what a what-if operation returns,\nenabling richer preview output across resources.<\/p>\n<h3>Version pinning<\/h3>\n<p>DSC v3.2 supports pinning configuration documents to specific versions of DSC and pinning resource\ninstances in configuration documents to specific versions of the resource.<\/p>\n<p>Now you can author a DSC configuration document and ensure that it only executes when the given\nversions of DSC and resources that are available on the system. Prior to this release, DSC always\nused the latest version of a resource discovered on a system for configuration operations.<\/p>\n<p>The following example shows how to pin a configuration document to a specific version of DSC using\nthe <code>version<\/code> directive and how to pin individual resource instances to specific versions using the\n<code>requireVersion<\/code> field.<\/p>\n<pre><code class=\"language-yaml\">$schema: https:\/\/aka.ms\/dsc\/schemas\/v3\/bundled\/config\/document.json\r\ndirectives:\r\n  version: '=3.2.0' # This configuration is only valid for exactly version 3.2.0\r\nresources:\r\n- name: os\r\n  type: Microsoft\/OSInfo\r\n  requireVersion: '^1.0' # Resource versions &gt;= 1.0.0 and &lt; 2.0.0 are valid\r\n  properties: {}\r\n- name: echo\r\n  type: Microsoft.DSC.Debug\/Echo\r\n  requireVersion: '&gt;=1.0.0, &lt;1.3'\r\n  properties:\r\n    output: echo<\/code><\/pre>\n<p>When DSC evaluates a resource version pin in a configuration document, it looks for the latest\nversion of the resource that meets the given requirement. If no compatible version is discovered\non the system, DSC raises an error.<\/p>\n<p>Starting with version 3.2, when you specify the <code>version<\/code> directive, DSC raises an error when the\nversion of DSC operating on the configuration document isn&#8217;t compatible.<\/p>\n<h3>Expression language improvements<\/h3>\n<p>Configuration documents now support a richer expression syntax:<\/p>\n<ul>\n<li><strong>Lambda expressions<\/strong> with <code>map()<\/code> and <code>filter()<\/code> functions (ARM syntax)<\/li>\n<li><strong><code>dataUri()<\/code><\/strong> and <strong><code>dataUriToString()<\/code><\/strong> functions<\/li>\n<li><strong><code>reference()<\/code><\/strong> usage inside <code>copy<\/code> loops<\/li>\n<li><strong><code>requireVersion<\/code><\/strong> replaces <code>apiVersion<\/code> for version requirements<\/li>\n<\/ul>\n<p>These additions make configuration documents more expressive and reduce the need to duplicate\nvalues across resources.<\/p>\n<h3>Adapter improvements<\/h3>\n<p>DSC 3.2 adds support for adapted resource manifests to the PowerShell adapters. Resource authors can\ncreate <em>adapted resource manifests<\/em> that prevent adapters from needing to do more intensive\ndiscovery operations.<\/p>\n<p>This release also includes other improvements to the PowerShell adapters:<\/p>\n<ul>\n<li>Added automatic conversion of PowerShell streams to DSC traces. Resource authors can participate\nin DSC&#8217;s tracing model by using the normal <code>Write-*<\/code> cmdlets.<\/li>\n<li>Fixed passing credentials to adapted PSDSC resource instances.<\/li>\n<\/ul>\n<h3>Metadata and execution improvements<\/h3>\n<ul>\n<li><code>Microsoft.DSC<\/code> metadata is now split into <code>directives<\/code> and <code>executionInformation<\/code> \u2014 cleaner\nseparation of configuration intent from execution context.<\/li>\n<li><code>_refreshEnv<\/code> resource metadata updates Windows environment variables during deployment without\nrequiring a restart.<\/li>\n<li>Resource manifests can now specify <code>requireSecurityContext<\/code> per operation, helping users avoid\nproblems where they retrieve data for a resource with a <code>get<\/code> or <code>test<\/code> operation and then get an\naccess denied error when they try to run the <code>set<\/code> command.<\/li>\n<li>Resources and extensions can now be marked as <strong>deprecated<\/strong>, with a deprecation message surfaced\nat runtime.<\/li>\n<\/ul>\n<h3>New extension capabilities<\/h3>\n<p>DSC 3.2 adds support for two new extension capabilities: importing configurations and retrieving\nsecrets.<\/p>\n<p>You can use an extension with the <code>import<\/code> capability to process arbitrary files as DSC\nconfiguration documents. For example, a hypothetical extension with this capability could transform\nthe following TOML snippet into a DSC configuration document:<\/p>\n<pre><code class=\"language-toml\"># example.dsc.toml\r\n[directives]\r\nversion = '3.2.0'\r\n[resources.os]\r\ntype       = 'Microsoft\/OSInfo'\r\nproperties = {}<\/code><\/pre>\n<p>The resulting DSC configuration document:<\/p>\n<pre><code class=\"language-yaml\"># effective DSC configuration document\r\n$schema: https:\/\/aka.ms\/dsc\/schemas\/v3\/bundled\/config\/document.json\r\ndirectives:\r\n  version: '=3.2.0' # This configuration is only valid for exactly version 3.2.0\r\nresources:\r\n- name: os\r\n  type: Microsoft\/OSInfo\r\n  properties: {}<\/code><\/pre>\n<p>When you use the <code>--file<\/code> option with the <code>dsc config *<\/code> commands, DSC checks the file extension to\nsee whether an extension can process that file. If there is no DSC extension that handles the given\nfile extension, DSC tries to parse the file as a configuration document.<\/p>\n<p>You can use a DSC extension with the <code>secret<\/code> capability to retrieve secrets at runtime. Presenting\nsecret retrieval through the extension model enables DSC to be used with secrets in a variety of\ncontexts without requiring the core engine to handle these operations directly. This capability is\npaired with the new <code>secret()<\/code> configuration expression for retrieving secrets by name.<\/p>\n<h3>Experimental PowerShell discovery extension<\/h3>\n<p>DSC now includes a discovery extension for finding DSC resources in PowerShell modules. This\nextension looks for resource manifests and adapted resource manifests located inside PowerShell\nmodules on the system. This makes it possible for resource authors to ship DSC resources written\nin PowerShell that are <em>not<\/em> PSDSC resources.<\/p>\n<p>For example, with this extension, DSC could discover a resource implemented as a PowerShell script\nas long as the module <em>also<\/em> includes a valid manifest for the resource.<\/p>\n<h3>Bug fixes<\/h3>\n<ul>\n<li>Fixed duplicate resources appearing in <code>dsc resource list<\/code><\/li>\n<li>Added a clear error when attempting to use DISM resources via Appx (previously a silent failure)<\/li>\n<li>Fixed <code>executionInformation<\/code> in config export results<\/li>\n<li>Fixed discovery failures when encountering unsupported manifests<\/li>\n<\/ul>\n<h2>Community contributions<\/h2>\n<p>DSC v3.2 reflects the work of an active and growing contributor community. The following community\nmembers made notable contributions to this release:<\/p>\n<ul>\n<li><strong>@Gijsreyn (Gijs Reijn)<\/strong> \u2014 experimental PowerShell discovery extension, <code>lambda<\/code>\/<code>map<\/code>\/<code>filter<\/code>\nexpressions, <code>dataUri<\/code> functions, adapted resource manifest fixes, and more.<\/li>\n<li><strong>@mimachniak<\/strong> \u2014 PowerShell adapter credentials fix for passing username and password.<\/li>\n<\/ul>\n<p>Thank you to everyone who filed issues, tested previews, and submitted fixes during the DSC v3.2\nrelease cycle.<\/p>\n<h2>Installing DSC<\/h2>\n<p>On Windows, you can install DSC from the Microsoft Store using <code>winget<\/code>. Installing from the Store\ngives you automatic updates.<\/p>\n<p>Search for the latest version of DSC:<\/p>\n<pre><code class=\"language-powershell\">winget search DesiredStateConfiguration --source msstore\r\n\r\nName                              Id           Version\r\n------------------------------------------------------\r\nDesiredStateConfiguration         9NVTPZWRC6KQ Unknown\r\nDesiredStateConfiguration-Preview 9PCX3HX4HZ0Z Unknown<\/code><\/pre>\n<p>Install DSC using the <code>id<\/code> parameter:<\/p>\n<p><!-- TODO: confirm Store ID with Mikey --><\/p>\n<pre><code class=\"language-powershell\"># Install latest stable\r\nwinget install --id 9NVTPZWRC6KQ --source msstore<\/code><\/pre>\n<pre><code class=\"language-powershell\"># Install latest preview\r\nwinget install --id 9PCX3HX4HZ0Z --source msstore<\/code><\/pre>\n<p>To install the ZIP package on Windows, Linux, or macOS:<\/p>\n<ol>\n<li>Download the latest release from the <a href=\"https:\/\/github.com\/PowerShell\/DSC\/releases\">PowerShell\/DSC<\/a> repository.<\/li>\n<li>Expand the release archive.<\/li>\n<li>Add the folder containing the expanded archive contents to your <code>PATH<\/code> environment variable.<\/li>\n<\/ol>\n<h2>Support lifecycle<\/h2>\n<p>DSC follows semantic versioning. DSC v3.2.0 is the current stable release. Patch releases update\nthe third digit of the semantic version number \u2014 for example, 3.2.1 is a patch update to 3.2.0.<\/p>\n<p>Stable releases receive patches for critical bugs and security vulnerabilities for three months\nafter the next stable release. For example, v3.2.0 is supported for three months after v3.3.0 is\nreleased.<\/p>\n<p>Always update to the latest patch version of the release you&#8217;re using.<\/p>\n<h2>Looking ahead<\/h2>\n<p>Work continues on DSC v3.3, with previews starting shortly after the v3.2.0 GA release.<\/p>\n<h2>Call to action<\/h2>\n<p>For more information about DSC, see the <a href=\"https:\/\/learn.microsoft.com\/powershell\/dsc\/get-started\/?view=dsc-3.0\">DSC documentation<\/a>. We value your feedback. Stop by our\n<a href=\"https:\/\/github.com\/PowerShell\/DSC\">GitHub repository<\/a> and let us know of any issues you find.<\/p>\n<p>Jason Helmick<\/p>\n<p>Sr. Product Manager, PowerShell<\/p>\n<p><!-- updated link references --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post announces the General Availability of Microsoft Desired State Configuration (DSC) v3.2.0, with new Windows resources, Bicep gRPC integration, WhatIf support, expression language improvements, and adapter enhancements.<\/p>\n","protected":false},"author":7527,"featured_media":13641,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[3197],"class_list":["post-20968","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-powershell","tag-powershell-dsc"],"acf":[],"blog_post_summary":"<p>This post announces the General Availability of Microsoft Desired State Configuration (DSC) v3.2.0, with new Windows resources, Bicep gRPC integration, WhatIf support, expression language improvements, and adapter enhancements.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/20968","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/users\/7527"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/comments?post=20968"}],"version-history":[{"count":1,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/20968\/revisions"}],"predecessor-version":[{"id":20973,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/20968\/revisions\/20973"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/media\/13641"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/media?parent=20968"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/categories?post=20968"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/tags?post=20968"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}