If you’ve been following my recent posts, you know that the PowerShell Summit North America 2015 is only days away. I’ve used April to learn (as much as I can) about DSC. I wasn’t completely new to it — I’ve been following along for a bit — but there is still plenty I didn’t know, or at least haven’t experienced hands-on. Anyway, I’m doing whatever I can to absorb as much DSC knowledge as possible, before next week.
While I only have a single target node at this point, I stopped and wondered how obnoxious it may be to determine the GUID to node mapping, when I update a configuration script. I know I can get it from the target node, by using Get-DscLocalConfigurationManager, but what’s an easier way to get them all, at once? While I could query all the nodes, I figured I can also query my MOFs’ directory, providing we trust that source, and why shouldn’t we.
I wrote out a quick and dirty function that I’ve included below. Point this function at your MOFs’ directory on your DSC Pull Server and ta-da, it’ll create a PSCustomObject with your node names and matching GUIDs.
Disclaimer: I’m still learning DSC and may one day realize this function was a waste of time.
Function Get-TMDSCGuid {
[CmdletBinding()]
Param (
[Parameter(Mandatory = $true)]
[string]$Path
)
Begin {
Write-Verbose -Message 'Collecting MOF files.'
try {
$Files = Get-ChildItem -Path $Path -Filter '*.mof' -ErrorAction Stop | Select-Object -Property *
} catch [System.Management.Automation.ItemNotFoundException] {
Write-Warning -Message "This path does not exist: $Path"
}
} # End Begin.
Process {
If ($Files) {
Write-Verbose -Message 'Checking MOF files.'
Write-Verbose -Message 'Writing ComputerName-GUID Mappings.'
ForEach ($File in $Files) {
$ComputerName = $null
try {
$ComputerName = (Get-Content -Path $File.FullName |
Where-Object {$PSItem -like '@TargetNode*'}).Split('=')[-1].Trim("'")
} catch {
$NoTargetNode += "$($File.Name);"
} # End Try-Catch.
If ($ComputerName) {
$Object = [pscustomobject]@{
ComputerName = $ComputerName
Guid = $File.BaseName
}
Write-Output -Verbose $Object
} # End If.
} # End ForEach.
If ($NoTargetNode) {
Write-Verbose -Message "---MOF Files without @TargetNode section---"
$NoTargetNode = ($NoTargetNode.Trim(';')).Split(';')
ForEach ($Node in $NoTargetNode) {
Write-Verbose -Message ($Node)
} # End ForEach.
} # End If.
} Else {
Write-Verbose -Message 'Cannot locate any MOF files.'
}
} # End Process.
End {
Write-Verbose -Message 'Function is done running.'
} # End End.
} # End Function.
Below is an example of the output that will be displayed when we invoke the function against the directory that holds our <guid>.mof files for our DSC Pull Server.
ComputerName Guid ------------ ---- serverX.mydomain.com 2766ffba-0c66-4358-8426-1a216c2b9d25 serverY.mydomain.com 7699bbcd-1a32-1429-9831-0f197d3a9b14 serverZ.mydomain.com 3224abda-2b41-4925-2948-4c317a1c0a54