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