{"id":21013,"date":"2026-09-17T06:57:07","date_gmt":"2026-09-17T14:57:07","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/powershell\/?p=21013"},"modified":"2026-09-17T06:57:07","modified_gmt":"2026-09-17T14:57:07","slug":"announcing-dsc-v3-3-0","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/powershell\/announcing-dsc-v3-3-0\/","title":{"rendered":"Announcing Microsoft Desired State Configuration v3.3.0"},"content":{"rendered":"<p><!-- markdownlint-disable MD041 --><\/p>\n<p>We&#8217;re excited to announce the General Availability of Microsoft Desired State Configuration (DSC)\nv3.3.0. This release delivers three new built-in Windows resources, a new registry-backed adapter,\nexpanded <code>--what-if<\/code> support, experimental export filtering, expression function updates, and Linux\npackages published to PMC.<\/p>\n<p>For background on the DSC v3 platform, see:<\/p>\n<ul>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/powershell\/get-started-with-dsc-v3\/\">Get Started<\/a><\/li>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/powershell\/enhanced-authoring-with-dsc-v3\/\">Enhanced Authoring<\/a><\/li>\n<li>DSC v3.2.0 <a href=\"https:\/\/devblogs.microsoft.com\/powershell\/announcing-dsc-v3-2-0\/\">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<li>DSC v3.0.0 <a href=\"https:\/\/devblogs.microsoft.com\/powershell\/announcing-dsc-v3\/\">Announcement<\/a><\/li>\n<\/ul>\n<p>For information on installing DSC v3.3, see the <a href=\"https:\/\/learn.microsoft.com\/powershell\/dsc\/install?view=dsc-3.0\">installation documentation<\/a>.<\/p>\n<h2>What&#8217;s New in DSC v3.3<\/h2>\n<p>All these changes are driven by real-world use, partner feedback, and community contributions.\nSpecial thanks to the WinGet team and the incredible DSC community.<\/p>\n<p>For a complete list of changes, see the <a href=\"https:\/\/github.com\/PowerShell\/DSC\/releases\">release page on GitHub<\/a>.<\/p>\n<h3>New built-in Windows resources<\/h3>\n<p>DSC v3.3 adds three new resources to the <code>Microsoft.Windows<\/code> namespace.<\/p>\n<ul>\n<li><code>Microsoft.Windows\/RegistryList<\/code>Manages an array of registry entries in a single resource instance, instead of requiring one\n<code>Microsoft.Windows\/Registry<\/code> instance per key or value. The underlying <code>registry.exe<\/code> gained a\n<code>--list<\/code> switch to support it, the resource version moved to 1.1, and the registry manifests were\nconsolidated into a single <code>registry.dsc.manifests.json<\/code> file.<\/li>\n<li><code>Microsoft.Windows\/WindowsFeatureList<\/code>Manages Windows features as a list, following the same list-oriented pattern.<\/li>\n<li><code>Microsoft.Windows\/Personalization<\/code>Manages Windows personalization settings, including accent color, light and dark mode, and\ntransparency.<\/li>\n<\/ul>\n<p>All three ship in the box. You can discover them, and inspect their schemas, with the DSC CLI:<\/p>\n<pre><code class=\"language-bash\">dsc resource list 'Microsoft.Windows\/*'\r\ndsc resource schema --resource Microsoft.Windows\/Personalization<\/code><\/pre>\n<h3>New adapter: <code>Microsoft.Windows.Adapter\/Registry<\/code><\/h3>\n<p>v3.3 introduces <code>Microsoft.Windows.Adapter\/Registry<\/code>, a registry-backed adapter that includes\nhelpers for converting between JSON property values and their registry representations. This lets a\nresource express its desired state as ordinary JSON properties while the adapter handles the\nregistry read and write.<\/p>\n<p><div class=\"alert alert-primary\"><p class=\"alert-divider\"><i class=\"fabric-icon fabric-icon--Info\"><\/i><strong>NOTE<\/strong><\/p>The conversion helpers currently cover the types needed by\n<code>Microsoft.Windows\/Personalization<\/code>. We deliberately started narrow rather than guessing at a\ncomplete type mapping up front. We&#8217;ll add more conversions as real use cases surface. If you hit a\nregistry type the adapter doesn&#8217;t handle, open an issue. That&#8217;s exactly the signal we&#8217;re looking\nfor.<\/div><\/p>\n<h3><code>dsc mcp<\/code> is now <code>dsc server<\/code><\/h3>\n<p>The <code>dsc mcp<\/code> command is renamed to <code>dsc server<\/code> to better reflect usability. Many of the endpoints\nthat are useful to MCP clients are also useful to integrating tools and provides a clean API for\nfunctionality that higher order tools can leverage. The <code>mcp<\/code> name is retained as a\nbackward-compatible alias, so existing client configurations keep working.<\/p>\n<pre><code class=\"language-bash\">dsc server<\/code><\/pre>\n<p>Three new tools are available to connected clients in v3.3:<\/p>\n<ul>\n<li><code>show_dsc_schema()<\/code> \u2014 returns the JSON schema for a DSC resource or type<\/li>\n<li><code>invoke_dsc_function()<\/code> \u2014 invokes a DSC built-in function<\/li>\n<li><code>invoke_dsc_expression()<\/code> \u2014 evaluates a DSC expression<\/li>\n<\/ul>\n<p>Together these let a client inspect what a resource expects and evaluate configuration\nexpressions without shelling out to the CLI.<\/p>\n<h3><code>format()<\/code> is no longer experimental<\/h3>\n<p>The <code>format()<\/code> expression function graduates to stable in v3.3. It behaves the same as it did in\npreview, but the experimental warning is gone and you can rely on it in production configurations.<\/p>\n<pre><code class=\"language-yaml\">$schema: https:\/\/aka.ms\/dsc\/schemas\/v3\/bundled\/config\/document.json\r\nresources:\r\n  - name: Echo formatted message\r\n    type: Microsoft.DSC.Debug\/Echo\r\n    properties:\r\n      output: \"[format('{0}\/{1}', 'Microsoft.Windows', 'Personalization')]\"<\/code><\/pre>\n<h3>New expression functions: <code>stateChanged()<\/code> and <code>restartRequired()<\/code><\/h3>\n<p>DSC v3.3 adds two new stable expression functions for reasoning about resource state within a\nconfiguration document:<\/p>\n<ul>\n<li><code>stateChanged()<\/code> &#8211; returns whether a resource instance changed state during the current <code>set<\/code>\noperation. The input must be the resource ID for another instance in a configuration, like\n<code>stateChanged(resourceId('&lt;resourceTypeName&gt;', '&lt;resourceInstanceName&gt;'))<\/code>.<\/li>\n<li><code>restartRequired()<\/code> &#8211; returns whether a system, service, or process requires a restart. The input\ndepends on which kind of restart you want to query:<\/p>\n<ul>\n<li><code>restartRequired('system')<\/code> &#8211; indicates whether the system itself requires a restart.<\/li>\n<li><code>restartRequired('service', '&lt;serviceName&gt;')<\/code> &#8211; indicates whether the specified service\nrequires a restart.<\/li>\n<li><code>restartRequired('process', '&lt;processName&gt;')<\/code> &#8211; indicates whether the specified process\nrequires a restart.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Expanded <code>--what-if<\/code> support<\/h3>\n<p><code>--what-if<\/code> lets you preview what a <code>set<\/code> operation would change without modifying your system. In\nv3.3, three more resource areas support it.<\/p>\n<ul>\n<li><code>Microsoft.Windows\/Service<\/code><\/li>\n<li><code>Microsoft.Windows\/FirewallRuleList<\/code><\/li>\n<li>The SSHD config resources<\/li>\n<\/ul>\n<p>Preview a service change without applying it:<\/p>\n<pre><code class=\"language-yaml\"># service.dsc.config.yaml\r\n$schema: https:\/\/aka.ms\/dsc\/schemas\/v3\/bundled\/config\/document.json\r\nresources:\r\n  - name: Print Spooler\r\n    type: Microsoft.Windows\/Service\r\n    properties:\r\n      name: Spooler\r\n      startType: Disabled<\/code><\/pre>\n<pre><code class=\"language-bash\">dsc config set --what-if --file .\/service.dsc.config.yaml<\/code><\/pre>\n<p>DSC reports the state it <em>would<\/em> set, so you can review the change before committing to it.<\/p>\n<h3>Unspecified rules handling for <code>Microsoft.Windows\/FirewallRuleList<\/code><\/h3>\n<p>In this release of DSC, the <code>Microsoft.Windows\/FirewallRuleList<\/code> resource added the\n<code>unspecifiedRules<\/code> property to control how DSC treats firewall rules you didn&#8217;t list in your\nconfiguration.<\/p>\n<p>The <code>unspecifiedRules<\/code> property has three fields to provide more fine-grained control:<\/p>\n<ul>\n<li><code>action<\/code> (required) &#8211; indicates whether the resource should <code>ignore<\/code>, <code>disable<\/code>, or <code>remove<\/code> the\nrules.<\/li>\n<li><code>direction<\/code> (optional) &#8211; limits the action to <code>Inbound<\/code> or <code>Outbound<\/code> rules if specified. To apply\nthe action to all unspecified rules regardless of direction omit this field.<\/li>\n<li><code>profiles<\/code> (optional) &#8211; limits the action to an array of specified profiles &#8211; <code>Domain<\/code>, <code>Private<\/code>,\n<code>Public<\/code>, or <code>All<\/code>.<\/li>\n<\/ul>\n<p>The following snippet shows an instance of <code>Microsoft.Windows\/FirewallRuleList<\/code> that disables every\ninbound rule for the <code>Public<\/code> profile:<\/p>\n<pre><code class=\"language-yaml\"># firewall.dsc.config.yaml\r\n$schema: https:\/\/aka.ms\/dsc\/schemas\/v3\/bundled\/config\/document.json\r\nresources:\r\n  - name: Firewall rules\r\n    type: Microsoft.Windows\/FirewallRuleList\r\n    properties:\r\n      rules: [] # Define no rules to apply to _all_ rules\r\n      unspecifiedRules:\r\n        action: disable\r\n        direction: Inbound\r\n        profiles: [Public]<\/code><\/pre>\n<h3>Synthetic export filtering (experimental)<\/h3>\n<p><strong>This feature is experimental in v3.3 and its syntax may change in a future release.<\/strong><\/p>\n<p>Starting with version <code>3.3.0<\/code>, the DSC engine supports synthetic export filtering for resources\nthat don&#8217;t directly implement filtering for instances in <code>export<\/code> operations.<\/p>\n<p>In this release, resources can opt into letting the DSC engine filter the resources returned by the\nexport operation by defining the <code>export.supportsFiltering<\/code> field in a resource manifest as\n<code>false<\/code>.<\/p>\n<p>When a resource opts into using synthetic export:<\/p>\n<ol>\n<li>A user defines an input instance of the resource, defining one or more properties to filter the\nexported instances on.<\/li>\n<li>DSC invokes the export operation for the resource without passing the defined filtering\nproperties from the resource instance.<\/li>\n<li>The resource emits the full list of instances to DSC.<\/li>\n<li>The DSC engine uses the defined properties in the resource instance to filter the emitted\ninstances the resource returned.<\/li>\n<\/ol>\n<p>The synthetic export filtering in this release has the following limitations:<\/p>\n<ul>\n<li>The provided input for the instance must be an object where every property is a valid\nproperty name for the resource.<\/li>\n<li>The value for every property in the input object must be one of:\n<ul>\n<li>A valid value for the property, which DSC uses for an exact match.<\/li>\n<li>A string with at least one wildcard character (<code>*<\/code>), which DSC uses for a case-insensitive\nwildcard match.<\/li>\n<\/ul>\n<\/li>\n<li>When the property is defined in the resource schema as an <code>object<\/code> you can specify\nthe subproperties as valid values or wildcard matching strings. DSC applies the filter through\nnested layers, enabling you to filter for deeply nested subproperties as well as top-level\nproperties.<\/li>\n<li>When the property is defined in the resource schema as an <code>array<\/code> you can specify one or more\nitems. When you specify multiple items, DSC treats each item as a logical <code>OR<\/code> filter.<\/li>\n<li>There is no builtin filtering behavior for more complex cases, like version range matching or\nminimum\/maximum bounds for integer properties.<\/li>\n<\/ul>\n<p>For example, the following snippet of a configuration document shows how you could export a subset\nof Windows services even though <code>Microsoft.Windows\/Service<\/code> doesn&#8217;t implement export filtering:<\/p>\n<pre><code class=\"language-yaml\"># services.dsc.config.yaml\r\n$schema: https:\/\/aka.ms\/dsc\/schemas\/v3\/bundled\/config\/document.json\r\nresources:\r\n  # Only exports services where the startup type begins with `auto` and the logon account inludes\r\n  # `local` in the account name\r\n  - name: Automatically starting local account services\r\n    type: Microsoft.Windows\/Service\r\n    properties:\r\n      startType: Auto*\r\n      logonAccount: '*Local*'\r\n  # Only exports services that depend on `rpcss` or a service that starts with `w`\r\n  - name: Services depending on RpcSs or a service that starts with w\r\n    type: Microsoft.Windows\/Service\r\n    properties:\r\n      dependencies:\r\n        - RpcSs\r\n        - w*\r\n  # Only exports services where the following are all true:\r\n  # - the startup type begins with `auto`\r\n  # - the logon account inludes `local` in the account name\r\n  # - the service depends on `rpcss` or a service that starts with `w`\r\n  - name: Combined service filter\r\n    type: Microsoft.Windows\/Service\r\n    properties:\r\n      startType: Auto*\r\n      logonAccount: '*Local*'\r\n      dependencies:\r\n        - RpcSs\r\n        - w*<\/code><\/pre>\n<h3><code>--required-version<\/code> replaces <code>--version<\/code><\/h3>\n<p>The <code>dsc resource *<\/code> commands now take <code>--required-version<\/code> instead of <code>--version<\/code>. The old flag\nis retained as a backward-compatible alias.<\/p>\n<p>The rename better reflects the semantics and usage for the parameter. The previous name,\n<code>--version<\/code>, implied an exact match for a specific version instead of a <em>version requirement<\/em>, which\nis how DSC actually parses and uses the parameter value. You can specify Rust-like semantic version\nrequirements, like <code>^1.1<\/code>, <code>~1.2.3<\/code>, and <code>&gt;=1<\/code>.<\/p>\n<pre><code class=\"language-bash\">dsc resource schema --resource Microsoft.Windows\/RegistryList --required-version '^1.1.0'<\/code><\/pre>\n<h3><code>Microsoft\/OSInfo<\/code> version comparison<\/h3>\n<p><code>Microsoft\/OSInfo<\/code> now supports version comparison, so a configuration can assert a version\nconstraint on the OS rather than matching an exact value. Starting with this release, you can\nspecify the version field with a comparison operator followed by a full or partial version, like\n<code>&gt;10.1<\/code>. The available comparators are:<\/p>\n<ul>\n<li>Equal to (<code>=<\/code>) &#8211; this is the default comparator, requiring an <em>exact match<\/em> for the text that\nfollows the comparator.<\/li>\n<li>Less than (<code>&lt;<\/code>)<\/li>\n<li>Less than or equal to (<code>&lt;=<\/code>)<\/li>\n<li>Greater than (<code>&gt;<\/code>)<\/li>\n<li>Greater than or equal to (<code>&gt;=<\/code>)<\/li>\n<\/ul>\n<p>You can only specify a single comparator for the version. You can&#8217;t combine them in a single\ninstance to define a version range. When you specify a comparator other than the equal to comparator\n(<code>=<\/code>), you can specify a partial version to match. For example, if you define the version as <code>&gt; 10<\/code>\nthe instance will be valid for any operating system versions like <code>10.0.1<\/code> and <code>11.3.7<\/code>.<\/p>\n<p>The comparison works for versions that include non-digit segments but the version must <em>start<\/em> with\na digit.<\/p>\n<h3>Linux packages on PMC<\/h3>\n<p>DSC v3.3 is published to the <code>https:\/\/packages.microsoft.com<\/code> (PMC) for Linux as both RPM and DEB\npackages. You can now install and update DSC through your distribution&#8217;s package manager instead of\ndownloading a tarball from GitHub releases.<\/p>\n<h2>Community contributions<\/h2>\n<p>This release leaned heavily on the community, and we&#8217;re grateful for it.<\/p>\n<p><strong><a href=\"https:\/\/github.com\/Gijsreyn\">@Gijsreyn<\/a> (Gijs Reijn)<\/strong> was the standout contributor this cycle. Gijs contributed\n<code>Microsoft.Windows\/WindowsFeatureList<\/code>, <code>--what-if<\/code> support for <code>Microsoft.Windows\/Service<\/code>,\n<code>Microsoft.Windows\/FirewallRuleList<\/code>, and the SSHD config resources, experimental export filtering,\nthe graduation of <code>format()<\/code> out of experimental, category and description filters for the function\nlist, and a large amount of documentation work. Thank you, Gijs.<\/p>\n<p><strong><a href=\"https:\/\/github.com\/JohnMcPMS\">@JohnMcPMS<\/a><\/strong> (Winget team) contributed a fix for stdin being inherited by child processes\nwhen no input was provided.<\/p>\n<p><strong><a href=\"https:\/\/github.com\/Alex-shearing\">@Alex-shearing<\/a><\/strong> contributed documentation fixes and documentation for previously\nundocumented functions.<\/p>\n<p><strong><a href=\"https:\/\/github.com\/ThomasNieto\">@ThomasNieto<\/a> (Thomas Nieto)<\/strong> added dev container support to the repository, making it\neasier to get a working DSC build environment.<\/p>\n<h2>Looking ahead<\/h2>\n<p>We&#8217;ll keep iterating on the platform based on what you tell us \u2014 real configurations, real adapters,\nand real bug reports shape what we build next. Watch the <a href=\"https:\/\/github.com\/PowerShell\/DSC\">DSC repository<\/a> for what&#8217;s in flight.<\/p>\n<h2>Call to action<\/h2>\n<p>Install DSC v3.3.0, try the new Windows resources, and run <code>--what-if<\/code> against a configuration\nbefore you apply it. If you find a bug, hit a gap in the registry adapter&#8217;s type conversions, or\nhave feedback on experimental export filtering, open an issue in the <a href=\"https:\/\/github.com\/PowerShell\/DSC\/issues\">DSC repository<\/a>. Community\nfeedback is what drove this release, and it&#8217;s what will drive the next one.<\/p>\n<p><!-- link references --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This post announces the General Availability of Microsoft Desired State Configuration (DSC) v3.3.0, with new Windows resources, a registry adapter, server mode improvements, expression function updates, expanded what-if support, and experimental export filtering.<\/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-21013","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.3.0, with new Windows resources, a registry adapter, server mode improvements, expression function updates, expanded what-if support, and experimental export filtering.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/21013","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=21013"}],"version-history":[{"count":1,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/21013\/revisions"}],"predecessor-version":[{"id":21016,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/posts\/21013\/revisions\/21016"}],"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=21013"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/categories?post=21013"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/powershell\/wp-json\/wp\/v2\/tags?post=21013"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}