---
title: Desired State Configuration (DSC) 201 - Custom Actions
description: Desired State Configuration (DSC) 201 - Custom Actions
---

# Desired State Configuration (DSC) 201 - Custom Actions

Posted by Daniel Mann - May 08, 2014

- [**](https://www.facebook.com/sharer/sharer.php?u=https://blogs.incyclesoftware.com/2014/05/desired-state-configuration-dsc-201-custom-actions/)
- [**](https://www.linkedin.com/shareArticle?mini=true&url=https://blogs.incyclesoftware.com/2014/05/desired-state-configuration-dsc-201-custom-actions/&title=&summary=&source=)
- [**](https://twitter.com/home?status=)
- [**](mailto:?&subject=https://blogs.incyclesoftware.com/2014/05/desired-state-configuration-dsc-201-custom-actions/&body=https://blogs.incyclesoftware.com/2014/05/desired-state-configuration-dsc-201-custom-actions/)

**

![header-picture](https://cdn2.hubspot.net/hubfs/685080/IMG-TurboSodium/Sodium%20v2/blog/woman-notebook-working-girl.png "header-picture")

In my last blog post, [Desired State Configuration 101 – An intro to DSC](http://incycle-corpweb.azurewebsites.net/2014/05/desired-state-configuration-DSC-101/), I talked a little bit about what Desired State Configuration is, what you can do with it, and showed a sample DSC script that installs the MSMQ Windows feature on a server.

Today, I'm going to expand our script to do a little bit more... We're going to use it to manage our MSMQ queues!

In the last post, we ended up with this script to install the MSMQ feature:

[powershell]  
 Configuration InstallMSMQFeature  
 {  
 param($Servers="localhost")  
 Node $Servers  
 {  
 WindowsFeature MessageQueueFeature  
 {  
 Ensure = "Present"  
 Name = "MSMQ"  
 }  
 }  
 }

InstallMSMQFeature -Servers "dsclab", "foo"  
 Start-DscConfiguration -Wait -Verbose -Path .\InstallMSMQFeature

[/powershell]

How do we do this? Easy! We can build a custom resource! A custom resource is just a bunch of PowerShell code we can invoke in order to set up our resource, just like the **WindowsFeature **resource we looked at in the last blog post.

## Folder structure for a custom resource

The first step is putting our scripts in the right folder structure so PowerShell can discover them. To do that, you can look at the *$env:PsModulePath* variable.

On my machine, it looks like this:

 PS C:\Users\daniel.mann\Desktop> $env:PSModulePath  
 C:\Users\daniel.mann\Documents\WindowsPowerShell\Modules;C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules\

So, I'm going to put my scripts in **C:\Program Files\WindowsPowerShell\Modules\**.

Under this folder, I need to create a folder structure like this:

[powershell]  
 My Resource Name (folder)  
 DSCResources (folder)  
 My Resource Name.psd1 (file)  
 Individual Action Name (folder)  
 Individual Action Name.psm1 (file)  
 Individual Action Name.schema.mof (file)  
 [/powershell]

Now, we're seeing three file types we might not be familiar with here. They are:

**PSD1** - This is a PowerShell module manifest -- this defines some info about our module  
**PSM1** - This is a PowerShell module script file, which contains our script code  
**schema.mof** - This is a Managed Object Format definition. This is where we define what properties our script will take.

I'm going to name my module "MSMQResources" and my custom resource "MSMQManager".

First off, make sure the folder structure outlined above exists. Then we can get started by making our module manifest. This is really easy using the *New-ModuleManifest* PowerShell cmdlet!

## Making our module manifest

Just run:

 New-ModuleManifest -Path "C:\Program Files\WindowsPowerShell\Modules\MSMQResources\MSMQResources.psd1"

And now the manifest exists! You can edit it if you want, although you don't actually need to in this case.

## Creating a MOF schema

Next up, we can make our MOF schema. I'm not going to dig too deep into all of the pieces of a MOF schema in this blog post... you can copy and paste my schema and modify it as you see fit. A really useful article when modifying this thing is [MOF Data Types](http://msdn.microsoft.com/en-us/library/aa392392(v=vs.85).aspx), from MSDN.

Here's what my MSMQManager.schema.mof file looks like:  
 [powershell]  
 [ClassVersion("1.0.0"), FriendlyName("Queue")]  
 class MSMQManager : OMI_BaseResource  
 {  
 [Key]string Name;  
 [write,ValueMap{"Present", "Absent"},Values{"Present", "Absent"}] string Ensure;  
 };  
 [/powershell]

The important pieces here are the "FriendlyName" attribute and the parameters, "Name" and "Ensure".

"FriendlyName" just exposes a name that we can reference this action by in our DSC script.  
 Then we have two parameters:  
 "Name", which is what we want to call our queue  
 "Ensure", which is what we can use to specify whether the queue should exist on our server or not. I'm using a "ValueMap" here, so the only allowable values are "Present" and "Absent". You can make whatever values you want be acceptable by changing the ValueMap.

I saved this file to *C:\Program Files\WindowsPowerShell\Modules\MSMQResources\DscResources\MSMQManager.schema.mof*

## Creating our custom resource

Now for the fun part: Actually writing some code!

We need to implement three functions in our custom resource, and each of these functions has to take the parameters we defined in our MOF schema.

The functions are:  
**  
 Get-TargetResource  
 Set-TargetResource  
 Test-TargetResource  
**

**Get-TargetResource** queries information about the thing that we're interested in configuring. In this case, a single message queue. It should return a hash table containing all of the properties that someone would be interested in knowing about a message queue -- its name, whether it exists, and so forth.

**Set-TargetResource** is the function that's responsible for changing the message queue. This is where you create a queue if it should exist but doesn't, delete it if it shouldn't exist, or reconfigure it if it's not set up correctly.

**Test-TargetResource** also queries information about the thing that we're interested in configuring, but in this case, should return a Boolean value depending on whether the item exists or not. If it returns True, that means no actions have to be taken -- everything is okay. If it returns False, that means that the queue isn't in the correct state and needs corrective action taken.

With that in mind, here's my script. I saved it as *C:\Program Files\WindowsPowerShell\Modules\MSMQResources\DscResources\MSMQManager.psm1*

[powershell]  
 function Get-TargetResource  
 {  
 [OutputType([Hashtable])]  
 param(  
 [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$Name,  
 [ValidateSet('Present','Absent')][string]$Ensure = 'Present'  
 )

[System.Reflection.Assembly]::LoadWithPartialName("System.Messaging") | out-null  
 $queueExists = [System.Messaging.MessageQueue]::Exists(".\private$\$Name")

return @{Name="$queue.Name"; Ensure=$queueExists}

}

function Set-TargetResource  
 {  
 param(  
 [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$Name,  
 [ValidateSet('Present','Absent')][string]$Ensure = 'Present'  
 )

[System.Reflection.Assembly]::LoadWithPartialName("System.Messaging") | out-null

$queueExists = [System.Messaging.MessageQueue]::Exists(".\private$\$Name")  
 if ($Ensure -like 'Present') {  
 if (!$queueExists) {  
 [System.Messaging.MessageQueue]::Create(".\private$\$Name")  
 }  
 }  
 else {  
 if ($queueExists) {  
 [System.Messaging.MessageQueue]::Delete(".\private$\$Name")  
 }  
 }  
 }

function Test-TargetResource  
 {  
 [OutputType([boolean])]  
 param(  
 [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$Name,  
 [ValidateSet('Present','Absent')][string]$Ensure = 'Present'  
 )

[System.Reflection.Assembly]::LoadWithPartialName("System.Messaging") | out-null  
 $queueExists = [System.Messaging.MessageQueue]::Exists(".\private$\$Name")

if ($Ensure -like 'Present') {  
 if ($queueExists) {  
 return $true  
 }  
 else {  
 return $false  
 }  
 }  
 else {  
 if (!$queueExists) {  
 return $true  
 }  
 else {  
 return $false  
 }  
 }  
 return $false  
 }  
 [/powershell]

## Validating the custom resource

Now, with the folder structure created and the three pieces in place, we can run a quick PowerShell command to check if the resource is available. *Get-DscResource* returns all of the DSC resources that are installed.

 PS C:\Users\daniel.mann\Desktop> get-dscresource -Name Queue  
 ImplementedAs Name Module Properties  
 ------------- ---- ------ ----------  
 PowerShell Queue MSMQResources {Name, DependsOn, Ensure}

 

If you see that, you're all set!

## Extending our DSC script

Our custom resource is all set up, so we can modify our existing script to take advantage of it.

First, within our *Configuration* block, we need to tell DSC to import our custom resource:

[powershell]  
 Configuration CreateMessageQueues  
 {  
 ...  
 Import-DscResource -Name MSMQManager  
 ...  
 }  
 [/powershell]

Then, within our *Node*, we need to add a Queue resource to tell DSC that we want our queue to exist, and to specify the name.

We're going to be using a feature of DSC that I haven't talked about yet, too: **DependsOn**. With this, we can tell DSC that it depends on another resource executing. This allows DSC to only execute the things it needs to, and to execute them in the correct order, automatically!

[powershell]  
 ...  
 Node $Servers  
 {  
 ...  
 WindowsFeature MessageQueueFeature { }  
 ...  
 Queue MyWonderfulQueue  
 {  
 Ensure = "Present"  
 Name = "FooQueue"  
 DependsOn = "[WindowsFeature]MessageQueueFeature"  
 }  
 }  
 [/powershell]

Now, our completed script:  
 [powershell]  
 Configuration CreateMessageQueues  
 {  
 param($Servers="localhost")  
 Import-DscResource -Name MSMQManager

Node $Servers  
 {  
 WindowsFeature MessageQueueFeature  
 {  
 Ensure = "Present"  
 Name = "MSMQ"

}

Queue FooQueue  
 {  
 Ensure="Present"  
 Name="Foo"  
 DependsOn="[WindowsFeature]MessageQueueFeature"  
 }  
 }  
 }

CreateMessageQueues  
 Start-DscConfiguration -Wait -Verbose -Path .\CreateMessageQueues  
 [/powershell]

And that's all there is to it! When I run this script, it will validate that the Message Queue feature is installed, and that my Foo queue exists.

 Topics: [Blog](https://blogs.incyclesoftware.com/topic/blog)

---

### Recent Posts

By InCycle - 08 May, 2014

#### InCycle Wins Prestigious Microsoft Global Partner of the Year Award

[![read more](https://cdn2.hubspot.net/hubfs/685080/IMG-TurboSodium/Sodium%20v2/blog/arrow-recent-blog-post.png "read more")](https://blogs.incyclesoftware.com/incycle-wins-prestigious-microsoft-global-partner-of-the-year-award)

By InCycle - 08 May, 2014

#### Top 5 Questions On Elevate for App Modernization

[![read more](https://cdn2.hubspot.net/hubfs/685080/IMG-TurboSodium/Sodium%20v2/blog/arrow-recent-blog-post.png "read more")](https://blogs.incyclesoftware.com/top-five-questions-on-elevate-for-app-modernization)

By InCycle - 08 May, 2014

#### GitHub Universe 2025 Top Announcements

[![read more](https://cdn2.hubspot.net/hubfs/685080/IMG-TurboSodium/Sodium%20v2/blog/arrow-recent-blog-post.png "read more")](https://blogs.incyclesoftware.com/github-universe-2025-top-announcements)

---

### Subscribe to Blog

### ![2025 Microsoft Partner of the Year Winner: InCycle Software](https://blogs.incyclesoftware.com/hs-fs/hubfs/InCycle%202025%20Microsoft%20PoY%20Badge.png?width=377&height=223&name=InCycle%202025%20Microsoft%20PoY%20Badge.png)

### About this blog

Since 2002, InCycle has been providing challenging thought leadership to help customers successfully combine modern application designs, IT platforms and DevOps practices to achieve new levels of success. As a leader in app modernization, these blogs are written by our expert consultants and provide useful information to help on your journey to the cloud and better software. Happy reading!

### Platform Engineering Webinar on Demand

PE deep dive and demo!

[![Learn More!](https://no-cache.hubspot.com/cta/default/707613/aae0556f-2d26-4ce4-9b32-e7bebd443c9a.png)](https://cta-redirect.hubspot.com/cta/redirect/707613/aae0556f-2d26-4ce4-9b32-e7bebd443c9a)

### Recent Posts

### Migrating to GitHub?

Start with a GitHub Migration Strategy and Roadmap (at no cost!)

[![Learn More!](https://no-cache.hubspot.com/cta/default/707613/312dc03f-1f78-4907-aaaf-3c0aa3cccd8f.png)](https://cta-redirect.hubspot.com/cta/redirect/707613/312dc03f-1f78-4907-aaaf-3c0aa3cccd8f)

### Posts by Topic

- [Blog (194)](https://blogs.incyclesoftware.com/topic/blog)
- [Video (32)](https://blogs.incyclesoftware.com/topic/video)
- [Azure (25)](https://blogs.incyclesoftware.com/topic/azure)
- [DevOps (20)](https://blogs.incyclesoftware.com/topic/devops)
- [GitHub (13)](https://blogs.incyclesoftware.com/topic/github)
- [InRelease (12)](https://blogs.incyclesoftware.com/topic/inrelease)
- [Containers (11)](https://blogs.incyclesoftware.com/topic/containers)
- [release management (11)](https://blogs.incyclesoftware.com/topic/release-management)
- [AKS (10)](https://blogs.incyclesoftware.com/topic/aks)
- [CI/CD (10)](https://blogs.incyclesoftware.com/topic/ci-cd)
- [Kubernetes (10)](https://blogs.incyclesoftware.com/topic/kubernetes)
- [Azure DevOps (9)](https://blogs.incyclesoftware.com/topic/azure-devops)
- [Migration (9)](https://blogs.incyclesoftware.com/topic/migration)
- [Platform Engineering (PE) (9)](https://blogs.incyclesoftware.com/topic/platform-engineering-pe)
- [GenAI (8)](https://blogs.incyclesoftware.com/topic/genai)
- [Microsoft Azure (8)](https://blogs.incyclesoftware.com/topic/microsoft-azure)
- [Visual Studio (8)](https://blogs.incyclesoftware.com/topic/visual-studio)
- [tfs (8)](https://blogs.incyclesoftware.com/topic/tfs)
- [Awards (7)](https://blogs.incyclesoftware.com/topic/awards)
- [Big Data (6)](https://blogs.incyclesoftware.com/topic/big-data)
- [Innovation (6)](https://blogs.incyclesoftware.com/topic/innovation)
- [Microsoft (6)](https://blogs.incyclesoftware.com/topic/microsoft)
- [agile (6)](https://blogs.incyclesoftware.com/topic/agile)
- [vsts (6)](https://blogs.incyclesoftware.com/topic/vsts)
- [Data (5)](https://blogs.incyclesoftware.com/topic/data)
- [Modernization (5)](https://blogs.incyclesoftware.com/topic/modernization)
- [App Modernization (4)](https://blogs.incyclesoftware.com/topic/app-modernization)
- [Automated Testing (4)](https://blogs.incyclesoftware.com/topic/automated-testing)
- [Data & AI (4)](https://blogs.incyclesoftware.com/topic/data-ai)
- [Event (4)](https://blogs.incyclesoftware.com/topic/event)
- [MLOps (4)](https://blogs.incyclesoftware.com/topic/mlops)
- [Modern Apps (4)](https://blogs.incyclesoftware.com/topic/modern-apps)
- [Visual Studio 2017 (4)](https://blogs.incyclesoftware.com/topic/visual-studio-2017)
- [DevTest (3)](https://blogs.incyclesoftware.com/topic/devtest)
- [Events (3)](https://blogs.incyclesoftware.com/topic/events)
- [Governance (3)](https://blogs.incyclesoftware.com/topic/governance)
- [VSO (3)](https://blogs.incyclesoftware.com/topic/vso)
- [Data Analytics (2)](https://blogs.incyclesoftware.com/topic/data-analytics)
- [Docker (2)](https://blogs.incyclesoftware.com/topic/docker)
- [Integration (2)](https://blogs.incyclesoftware.com/topic/integration)
- [Microsoft Connect (2)](https://blogs.incyclesoftware.com/topic/microsoft-connect)
- [Mobile Development (2)](https://blogs.incyclesoftware.com/topic/mobile-development)
- [RM (2)](https://blogs.incyclesoftware.com/topic/rm)
- [SQL (2)](https://blogs.incyclesoftware.com/topic/sql)
- [SaaS (2)](https://blogs.incyclesoftware.com/topic/saas)
- [TFS 15 Preview (2)](https://blogs.incyclesoftware.com/topic/tfs-15-preview)
- [TFS 2017 (2)](https://blogs.incyclesoftware.com/topic/tfs-2017)
- [Uncategorized (2)](https://blogs.incyclesoftware.com/topic/uncategorized)
- [Visual Studio 2015 (2)](https://blogs.incyclesoftware.com/topic/visual-studio-2015)
- [Xamarin (2)](https://blogs.incyclesoftware.com/topic/xamarin)
- [ADX (1)](https://blogs.incyclesoftware.com/topic/adx)
- [AI (1)](https://blogs.incyclesoftware.com/topic/ai)
- [Android (1)](https://blogs.incyclesoftware.com/topic/android)
- [Application Monitoring (1)](https://blogs.incyclesoftware.com/topic/application-monitoring)
- [Apps (1)](https://blogs.incyclesoftware.com/topic/apps)
- [BI (1)](https://blogs.incyclesoftware.com/topic/bi)
- [Brian Harry (1)](https://blogs.incyclesoftware.com/topic/brian-harry)
- [Cloud Azure (1)](https://blogs.incyclesoftware.com/topic/cloud-azure)
- [Cloud Services (1)](https://blogs.incyclesoftware.com/topic/cloud-services)
- [Connect (1)](https://blogs.incyclesoftware.com/topic/connect)
- [Connect 2016 (1)](https://blogs.incyclesoftware.com/topic/connect-2016)
- [Consultants (1)](https://blogs.incyclesoftware.com/topic/consultants)
- [Cosmos DB (1)](https://blogs.incyclesoftware.com/topic/cosmos-db)
- [Data Center (1)](https://blogs.incyclesoftware.com/topic/data-center)
- [Development (1)](https://blogs.incyclesoftware.com/topic/development)
- [EA (1)](https://blogs.incyclesoftware.com/topic/ea)
- [Git (1)](https://blogs.incyclesoftware.com/topic/git)
- [Hybrid (1)](https://blogs.incyclesoftware.com/topic/hybrid)
- [IntelliTes (1)](https://blogs.incyclesoftware.com/topic/intellites)
- [IntelliTest (1)](https://blogs.incyclesoftware.com/topic/intellitest)
- [Lab Management (1)](https://blogs.incyclesoftware.com/topic/lab-management)
- [Live Unit Testing (1)](https://blogs.incyclesoftware.com/topic/live-unit-testing)
- [Load Testing (1)](https://blogs.incyclesoftware.com/topic/load-testing)
- [MSDN (1)](https://blogs.incyclesoftware.com/topic/msdn)
- [MSTest (1)](https://blogs.incyclesoftware.com/topic/mstest)
- [MTM (1)](https://blogs.incyclesoftware.com/topic/mtm)
- [Machine Learning (1)](https://blogs.incyclesoftware.com/topic/machine-learning)
- [Media & Entertainment (1)](https://blogs.incyclesoftware.com/topic/media-entertainment)
- [Microsoft Visual Studio (1)](https://blogs.incyclesoftware.com/topic/microsoft-visual-studio)
- [Microsoft nationally managed partner (1)](https://blogs.incyclesoftware.com/topic/microsoft-nationally-managed-partner)
- [NUnit (1)](https://blogs.incyclesoftware.com/topic/nunit)
- [OpsHub (1)](https://blogs.incyclesoftware.com/topic/opshub)
- [PaaS (1)](https://blogs.incyclesoftware.com/topic/paas)
- [Pipelines (1)](https://blogs.incyclesoftware.com/topic/pipelines)
- [PowerShell (1)](https://blogs.incyclesoftware.com/topic/powershell)
- [Principles and Practices of DevOps (1)](https://blogs.incyclesoftware.com/topic/principles-and-practices-of-devops)
- [Programs (1)](https://blogs.incyclesoftware.com/topic/programs)
- [RC (1)](https://blogs.incyclesoftware.com/topic/rc)
- [Release Candidate (1)](https://blogs.incyclesoftware.com/topic/release-candidate)
- [SQL Databases (1)](https://blogs.incyclesoftware.com/topic/sql-databases)
- [SQL server (1)](https://blogs.incyclesoftware.com/topic/sql-server)
- [SSDT (1)](https://blogs.incyclesoftware.com/topic/ssdt)
- [Software (1)](https://blogs.incyclesoftware.com/topic/software)
- [Subscription & Billing Management (1)](https://blogs.incyclesoftware.com/topic/subscription-billing-management)
- [TFS 15 (1)](https://blogs.incyclesoftware.com/topic/tfs-15)
- [TFS 2015 update (1)](https://blogs.incyclesoftware.com/topic/tfs-2015-update)
- [TFS 2016 (1)](https://blogs.incyclesoftware.com/topic/tfs-2016)
- [TFS ALM (1)](https://blogs.incyclesoftware.com/topic/tfs-alm)
- [TestMethods (1)](https://blogs.incyclesoftware.com/topic/testmethods)
- [UI (1)](https://blogs.incyclesoftware.com/topic/ui)
- [UX (1)](https://blogs.incyclesoftware.com/topic/ux)
- [VS2017 (1)](https://blogs.incyclesoftware.com/topic/vs2017)
- [Validation (1)](https://blogs.incyclesoftware.com/topic/validation)
- [Virtual Machines (1)](https://blogs.incyclesoftware.com/topic/virtual-machines)
- [WPC 2016 (1)](https://blogs.incyclesoftware.com/topic/wpc-2016)
- [Web (1)](https://blogs.incyclesoftware.com/topic/web)
- [Windows (1)](https://blogs.incyclesoftware.com/topic/windows)
- [World Partner Conference (1)](https://blogs.incyclesoftware.com/topic/world-partner-conference)
- [XUnit (1)](https://blogs.incyclesoftware.com/topic/xunit)
- [alm (1)](https://blogs.incyclesoftware.com/topic/alm)
- [automation (1)](https://blogs.incyclesoftware.com/topic/automation)
- [build (1)](https://blogs.incyclesoftware.com/topic/build)
- [code (1)](https://blogs.incyclesoftware.com/topic/code)
- [nationally managed partner (1)](https://blogs.incyclesoftware.com/topic/nationally-managed-partner)
- [sql server 2008 (1)](https://blogs.incyclesoftware.com/topic/sql-server-2008)
- [unit testing (1)](https://blogs.incyclesoftware.com/topic/unit-testing)
- [vm (1)](https://blogs.incyclesoftware.com/topic/vm)

[see all](https://blogs.incyclesoftware.com/2014/05/desired-state-configuration-dsc-201-custom-actions/#)

### Blog Archive

- [November 2012 (17)](https://blogs.incyclesoftware.com/archive/2012/11)
- [September 2025 (14)](https://blogs.incyclesoftware.com/archive/2025/09)
- [October 2014 (12)](https://blogs.incyclesoftware.com/archive/2014/10)
- [July 2012 (10)](https://blogs.incyclesoftware.com/archive/2012/07)
- [October 2012 (9)](https://blogs.incyclesoftware.com/archive/2012/10)

- [**](https://twitter.com/incyclesoftware?lang=en)
- [**](https://ca.linkedin.com/company/incycle-software)
- [**](https://www.facebook.com/InCycleSoftware/)

### About us

At InCycle, we believe there is always a better way and today, that includes the cloud.

[![InCycle Microsoft Partner](https://blogs.incyclesoftware.com/hs-fs/hubfs/Incycle%202017%20website%20resources/logo-InCycle-New-white.png?width=200&name=logo-InCycle-New-white.png "InCycle Microsoft Partner")](https://www.incyclesoftware.com/)

### Learn more

- [Why Incycle?](https://www.incyclesoftware.com/why-incycle)
- [Success Stories](https://www.incyclesoftware.com/customer-success-stories)
- [Events](https://www.incyclesoftware.com/events)
- [Careers](https://www.incyclesoftware.com/careers)
- [About](https://www.incyclesoftware.com/about-incycle-software)

 

### 1-800-565-0510 [info@incyclesoftware.com](mailto:info@incyclesoftware.com) 

### ![Microsoft GitHub Verified Partner](https://blogs.incyclesoftware.com/hs-fs/hubfs/GitHub%20Verified%20Partner%20-%20white-SQUARE.png?width=256&height=57&name=GitHub%20Verified%20Partner%20-%20white-SQUARE.png) ![Data & AI Solutions Partner](https://blogs.incyclesoftware.com/hs-fs/hubfs/Data%20%26%20AI%20Solutions%20Partner.png?width=125&height=144&name=Data%20%26%20AI%20Solutions%20Partner.png) ![Digital & App Innovation Solutions Partner](https://blogs.incyclesoftware.com/hs-fs/hubfs/Digital%20%26%20App%20Innovation%20Solutions%20Partner.png?width=125&height=144&name=Digital%20%26%20App%20Innovation%20Solutions%20Partner.png)

 

© 2025 InCycle Software

[Privacy policy](https://www.incyclesoftware.com/privacy)

**

![](https://px.ads.linkedin.com/collect/?pid=302756&fmt=gif) ![](https://px.ads.linkedin.com/collect/?pid=302756&fmt=gif)

```json
{
  "@context" : "https://schema.org",
  "@type" : "BlogPosting",
  "author" : {
    "@type" : "Person",
    "name" : "Daniel Mann",
    "url" : "https://blogs.incyclesoftware.com/author/daniel-mann"
  },
  "datePublished" : "2014-05-08T14:47:06.000Z",
  "headline" : "Desired State Configuration (DSC) 201 - Custom Actions",
  "mainEntityOfPage" : {
    "@id" : "https://blogs.incyclesoftware.com/2014/05/desired-state-configuration-dsc-201-custom-actions/",
    "@type" : "WebPage"
  },
  "publisher" : {
    "@type" : "Organization",
    "logo" : {
      "@type" : "ImageObject",
      "url" : "https://blogs.incyclesoftware.com/hubfs/logo-InCycle-New-Blue---transparent.png"
    },
    "name" : "InCycle Software Inc."
  }
}
```