The ReverseDSC.Core module is the heart of the ReverseDSC process. This module defines several functions that will help you dynamically extract the DSC configuration script for each resource within a DSC module. The ReverseDSC Core is generic, meaning that it applies to any technology, not only SharePoint. In this blog article I will describe in details how you can start using the ReverseDSC Core module today and integrate it into your existing solutions. To better illustrate the process, I will be using an example where I will be extracting the properties of a given user within Active Directory using the ReverseDSC Core.
Getting Started
If you were to take a look at the content of the ReverseDSC.Core.psm1 module (https://github.com/NikCharlebois/SharePointDSC.Reverse/blob/master/ReverseDSC.Core.psm1), you would see about a dozen functions defined. The one we are truly interested in is the Export-TargetResource one. This method takes in two mandatory parameters, the name of the DSC resource we wish to “Reverse”, and the list of mandatory parameter for the Get-TargetResource of that same resource. The mandatory parameters are essential because without them, the Get-TargetResource is not able to determine what instance of the resource we wish to obtain the current state for. The third optional parameter lets you define a DependsOn clause in the case the current instance depends on another one. However, let us not worry about that parameter for our current example.
As mentioned previously, for the sake of our example, we want to extract the information about the various users in our Active Directory. Active Directory users are represented by the MSFT_xADUser resource, so you will need to make sure the xActiveDirectory module is properly installed on the machine you are about to extract the information from.
Let us now take a look at the Get-TargetResource function of the MSFT_xADUser resource. The function only requires two mandatory parameters: DomainName and UserName.
Therefore we need to pass these two mandatory parameters to our Export-TargetResource function. Now, in my case, I do know for a fact that I have a user in my Active Directory named “John Smith”, who has a username of “contoso\JSmith”. In my case, I have a local copy of the ReverseDSC.Core.psm1 module located under c:\temp I can then initiate the ReverseDSC process for that user by calling the following lines of PowerShell:
Import-Module -Name "C:\temp\ReverseDSC.Core.psm1" -Force $mandatoryParameters = @{DomainName="contoso.com"; UserName="JSmith"} Export-TargetResource -ResourceName xADUser -MandatoryParameters $mandatoryParameters
Executing these lines of code will produce the following output:
Since the Export-TargetResource function simply outputs the resulting DSC resource block as a string, you would need to capture it in a variable somewhere and manually build your resulting DSC configuration. The following modifications to our script will allow us to build the resulting Desired Configuration Script and save it locally on disk, in my case under C:\temp\:
Import-Module -Name "C:\temp\ReverseDSC.Core.psm1" -Force $output = "Configuration ReverseDSCDemo{`r`n Import-DSCResource -ModuleName xActiveDirectory`r`n Node localhost{`r`n" $mandatoryParameters = @{DomainName="contoso.com"; UserName="JSmith"} $output += Export-TargetResource -ResourceName xADUser -MandatoryParameters $mandatoryParameters $output += " }`r`n}`r`nReverseDSCDemo" $output | Out-File "C:\Temp\ReverseDSCDemo.ps1"
Running this will generate the following DSC Configuration script:
Configuration ReverseDSCDemo{ Import-DSCResource -ModuleName xActiveDirectory Node localhost{ xADUser baf586dd-3c2c-4131-9267-d4d8fb1d5d01 { CannotChangePassword = $True; HomePage = "http://Nikcharlebois.com"; DisplayName = "John Smith"; Description = "John's Account"; Notes = "These are my notes"; Office = "Basement of the building"; State = "Quebec"; Fax = ""; JobTitle = "Aquatic Plant Watering"; Country = ""; Division = ""; Initials = ""; POBox = "23"; HomeDirectory = ""; EmployeeID = ""; LogonScript = ""; GivenName = "John"; EmployeeNumber = ""; UserPrincipalName = "jsmith@contoso.com"; ProfilePath = ""; StreetAddress = "55 Mighty Suite"; CommonName = "John Smith"; Path = "CN=Users,DC=contoso,DC=com"; HomePhone = "555-555-5555"; City = "Gatineau"; Manager = "CN=Nik Charlebois,CN=Users,DC=contoso,DC=com"; MobilePhone = ""; Pager = ""; Company = "Contoso inc."; HomeDrive = ""; OfficePhone = "555-555-5555"; Surname = "Smith"; Enabled = $True; DomainController = ""; PostalCode = "J8P 2A9"; IPPhone = ""; EmailAddress = "JSmith@contoso.com"; PasswordNeverExpires = $True; UserName = "JSmith"; DomainName = "contoso.com"; Ensure = "Present"; Department = "Plants"; } } } ReverseDSCDemo
Executing the resulting ReverseDSCDemo.ps1 script will generate a MOF file that can be used with PowerShell Desired State Configuration.
Recap
The ReverseDSC Core allows you to easily extract all the parameters of an instance of a resource by simply specifying the few mandatory parameters its Get-TargetResource function requires. It does not take care of scanning all instance on an environment, this should be left to the user to create that script. It is not to say that we will not be looking at ways of automating this in the future, but the current focus is to keep it as unit calls.
For a DSC Resource to work with the ReverseDSC Core, you need to ensure it has a well written Get-TargetResource function that returns the proper parameters. This should already be the case for any well written resources out there, but it is not always the case. In the past, most of the development effort for new DSC Resource was put on the Set-TargetResource function to ensure the “Forward” DSC route was working well. However, in order for the whole DSC process to properly work, it is crucial that your Get-TargetResource function be as complete as possible. After all, the Test-TargetResource function also depends on it to check whether or not your machine has shifted away from its desired state.