From fad2068fc87cfe52fbac06de3f6b342550eca740 Mon Sep 17 00:00:00 2001 From: Bobby Reed Date: Tue, 30 May 2017 08:45:49 -0400 Subject: [PATCH 1/2] Added support for Exclusive flag parameter which ensures the a value is the EXCLUSIVE value in a given key. --- .../MSFT_RegistryResource.psm1 | 95 ++++++++- .../MSFT_RegistryResource.schema.mof | Bin 1751 -> 3852 bytes .../en-US/MSFT_RegistryResource.strings.psd1 | 6 + README.md | 1 + .../MSFT_RegistryResource.EndToEnd.Tests.ps1 | 74 +++++++ ...source_KeyAndNameOnly_Exclusive.config.ps1 | 48 +++++ Tests/Unit/MSFT_RegistryResource.Tests.ps1 | 191 +++++++++++++++++- 7 files changed, 411 insertions(+), 4 deletions(-) create mode 100644 Tests/Integration/MSFT_RegistryResource_KeyAndNameOnly_Exclusive.config.ps1 diff --git a/DscResources/MSFT_RegistryResource/MSFT_RegistryResource.psm1 b/DscResources/MSFT_RegistryResource/MSFT_RegistryResource.psm1 index 462d426..d35648d 100644 --- a/DscResources/MSFT_RegistryResource/MSFT_RegistryResource.psm1 +++ b/DscResources/MSFT_RegistryResource/MSFT_RegistryResource.psm1 @@ -118,6 +118,20 @@ function Get-TargetResource { $registryResource['Ensure'] = 'Present' } + + $valueNames = Get-RegistryKeyValueNames -RegistryKey $registryKey + $otherValueNames = @($valueNames | Where-Object {$_ -ne $ValueName}) + + if ($otherValueNames.Count -gt 0) + { + Write-Verbose -Message ($script:localizedData.Exclusive_IsNotExclusive -f $Key, $ValueName) + $registryResource['Exclusive'] = $false + } + elseif ($valueNames -eq $valueName) + { + Write-Verbose -Message ($script:localizedData.Exclusive_IsExclusive -f $Key, $ValueName) + $registryResource['Exclusive'] = $true + } } Write-Verbose -Message ($script:localizedData.GetTargetResourceEndMessage -f $Key) @@ -206,7 +220,10 @@ function Set-TargetResource $Hex = $false, [Boolean] - $Force = $false + $Force = $false, + + [Boolean] + $Exclusive = $false ) Write-Verbose -Message ($script:localizedData.SetTargetResourceStartMessage -f $Key) @@ -259,6 +276,20 @@ function Set-TargetResource # Retrieve the name of the registry key $registryKeyName = Get-RegistryKeyName -RegistryKey $registryKey + # Retrieve other registry key value names. + $valueNames = Get-RegistryKeyValueNames -RegistryKey $registryKey + + if ($Exclusive) + { + $otherValueNames = $valueNames | Where-Object {$_ -ne $ValueName} + + foreach ($name in $otherValueNames) + { + Write-Verbose -Message ($script:localizedData.Exclusive_RemovingRegistryValueName -f $Key, $Name) + $null = Remove-ItemProperty -Path $Key -Name $name -Force + } + } + # Check if the registry key value exists if ($null -eq $actualRegistryKeyValue) { @@ -332,6 +363,20 @@ function Set-TargetResource $null = Remove-Item -Path $Key -Recurse -Force } } + else + { + if ($Exclusive) + { + # Retrieve other registry key value names. + $valueNames = Get-RegistryKeyValueNames -RegistryKey $registryKey + + foreach ($name in $valueNames) + { + Write-Verbose -Message ($script:localizedData.Exclusive_RemovingRegistryValueName -f $Key, $Name) + $null = Remove-ItemProperty -Path $Key -Name $name -Force + } + } + } } } @@ -410,7 +455,10 @@ function Test-TargetResource $Hex = $false, [Boolean] - $Force = $false + $Force = $false, + + [Boolean] + $Exclusive = $false ) Write-Verbose -Message ($script:localizedData.TestTargetResourceStartMessage -f $Key) @@ -512,6 +560,27 @@ function Test-TargetResource } } + if ($Exclusive) + { + # Need to get the actual registry key value since Get-TargetResource returns + $registryKey = Get-RegistryKey -RegistryKeyPath $Key + + # Retrieve other registry key value names. + $valueNames = Get-RegistryKeyValueNames -RegistryKey $registryKey + + $otherValueNames = @($valueNames | Where-Object {$_ -ne $ValueName}) + + if ($otherValueNames.Count -gt 0) + { + Write-Verbose -Message ($script:localizedData.Exclusive_TESTIsNotExclusive -f $key, $ValueName) + $registryResourceInDesiredState = $false + } + else + { + Write-Verbose -Message ($script:localizedData.Exclusive_TESTIsExclusive -f $key, $ValueName) + } + } + Write-Verbose -Message ($script:localizedData.TestTargetResourceEndMessage -f $Key) return $registryResourceInDesiredState @@ -793,6 +862,28 @@ function Get-RegistryKeyValueDisplayName return $registryKeyValueDisplayName } +<# + .SYNOPSIS + Retrieves all the values in a Registry Key. + + .PARAMETER RegistryKey + The registry key to retrieve the values from. +#> +function Get-RegistryKeyValueNames +{ + [OutputType([Object[]])] + [CmdletBinding()] + param + ( + [Parameter(Mandatory = $true)] + [Microsoft.Win32.RegistryKey] + $RegistryKey + ) + + $registryKeyValue = $RegistryKey.GetValueNames() + return ,$registryKeyValue +} + <# .SYNOPSIS Retrieves the registry key value with the specified name from the specified registry key. diff --git a/DscResources/MSFT_RegistryResource/MSFT_RegistryResource.schema.mof b/DscResources/MSFT_RegistryResource/MSFT_RegistryResource.schema.mof index e547e1cdc6e0bec7c1b5e8935a0794a487f19e7a..68bb28dbb9867025c2db92ae639e96d2dd75f46a 100644 GIT binary patch literal 3852 zcmd5`|D>@UdupQlH=2mL^AyLWhANWNi5H0U!J*dEH!x|ksL#!54lvj z(3{ICbcgs)=}-9mhPSy)AT`I6ntXxILwO*bg_lT9qz*gh@^wXn7IJu>LcfFiNM7K3 z2939nK5%g+PAin6{U6Rt1nH){gXY{td+6+ST+CxcP*|F@$CpmV1TI5p-3bZ)VWi$A9`GGLd+XL#&fnMR=1sgr=}W z@6}Pz3T-}xBr~D*4e2^G`7}lBQGvtDTOyMdnca@e43Yz^#a8O^q3$vo#I71&ax4c% z3Gh%%6%E5KgGIj0uu^7&%;h!3H31WuWjKOVC_HY4@xMTZj2gJLGK;LM-QcsHlO9Ry93ek1 z9D65-hCJ9_z1<=k9^){x>{DIXsjlTP19`!Zfz!E!W!9Ew*fOV-*~+{Yd}Pod^R$nI z{3Ap6(8DzEeRRLDO4)1KNo(NLHq4BDP4v~f;KmwJep{#6HEy~VX3=N-1PG1MspAp? zvCDOg?#?4rzPgSQ;I9*b@0hxGny+&I+|&V0 z!+X=+B3Z;*wM$H}o=84`NnACjmr2mU%ia2J5wK&7;itSyssC5f4!pD0tLmd1sc|{f zk7XTy|4eU{Uq?VBM}Hy`_sgtxeaBb5W!zW&rf%+cgOCR^@Q*t$cLH`8oj*9`U867X z4J%@Z`vKndTm|r-GUT+V1mzqpnGCB#yD003^+KDhA>Qe}5UxafP$YgWS`j*LZki2r zHILlvz#W=%mhBV=@H}$+w|acz)^%SwWL4>mo1v3%^5ov_`^LKLR`(KL*US{BaoS_P z29BA`7I#>pt5e_d3`O*}bu`9Iv^n!=w3{nlv&lHjFDs>8oCorvkL)&!$3Rt2Kz}Qf z*4Y~lUC!<{kCmrCo1x0nQQKviRYD}0Z=$MC&GH#6zL(E^JrdC8!I}Dw zfZ@|CU}`k`49r}WtrU%To?ws~;LXW5JOxs~5OmHq>_SJ%ld6fU24^rRAnr{lY#WvV za&;j!CS8N-F8w%CLB*n}|Fycpl;)Xg%RmvEAbvZT!jw#^^mYq8YfMJOB96r8r89wF z7_UYfaWIJ;!+OA4-+%`nrKUp70R@CDnF1LgPdTSLX)^KWX>W|)O+Qjwm)-vQj3Y9k z@9O$>Y(e-IHn+uwDtVgDSTzq>0+8jD9hzFf95@|aTBqgkYk641D)+~WM%B6xeas_R z|6g*gL>_aBnEu}WdDN<5Pxl3b0w?;aZ5Vn;Y>4~0h?Dvm@dArr-3`4yhXP!M!4@o8 z*DV2O|8(rRPI;26Hx&FV0XD_bQi%V28^ee5=#vV|={+Z$f|F(*mkqOu(j+O4 Date: Tue, 30 May 2017 09:09:28 -0400 Subject: [PATCH 2/2] Added support for Exclusive flag parameter which ensures the a value is the EXCLUSIVE value in a given key. --- .../MSFT_RegistryResource.schema.mof | Bin 3852 -> 1925 bytes ...source_KeyAndNameOnly_Exclusive.config.ps1 | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/DscResources/MSFT_RegistryResource/MSFT_RegistryResource.schema.mof b/DscResources/MSFT_RegistryResource/MSFT_RegistryResource.schema.mof index 68bb28dbb9867025c2db92ae639e96d2dd75f46a..79586a8b2666a9b3e1302c478795c06f08cc08b7 100644 GIT binary patch literal 1925 zcmb_d!A=`75WOSu52IBN35rsBZBM0uTD5_eM4$>GWa0^Hb$7k8y&)^azxR#3fh15$ zQ4fh6JL7rt=DqRxr$Tvu%FY{G^|E)v-QjN5AJCyQT#Iq$=XF#u^L?h#M1f+k|C+ zY@JGuNn0bkOF#BiP%&w$egoC~%^$%7%3hi4Czo7jaV8BVJ$-th%Ao=ehvz!(a=R zTURXsXMcC>xk~pWS8piz(FK?kOG_dC<5dh_??-p3u$<1b2Y#P8yXWhm@{M~fSr6KY ztry&}_3JW^Hb@-IjfM#fWKB6Ql*Z5~RY5cBN(DlW&;$@}wCs>b)RT=J3OT%xl0ZQz zi_F5!X@E3uW-xRbe0$awjKI&lc#Rw^VdA8_GeMA;$XV3Ig;mFY(ag0s5CB#rx4LGRIb?KqvJprV{;;mk3Mw^YPKQpIt?0 wpzPp5p`PO@N|rZGrqs?33Pag6YpSViqMM=Z%j{e><6wao%j0bV+B`|D>@UdupQlH=2mL^AyLWhANWNi5H0U!J*dEH!x|ksL#!54lvj z(3{ICbcgs)=}-9mhPSy)AT`I6ntXxILwO*bg_lT9qz*gh@^wXn7IJu>LcfFiNM7K3 z2939nK5%g+PAin6{U6Rt1nH){gXY{td+6+ST+CxcP*|F@$CpmV1TI5p-3bZ)VWi$A9`GGLd+XL#&fnMR=1sgr=}W z@6}Pz3T-}xBr~D*4e2^G`7}lBQGvtDTOyMdnca@e43Yz^#a8O^q3$vo#I71&ax4c% z3Gh%%6%E5KgGIj0uu^7&%;h!3H31WuWjKOVC_HY4@xMTZj2gJLGK;LM-QcsHlO9Ry93ek1 z9D65-hCJ9_z1<=k9^){x>{DIXsjlTP19`!Zfz!E!W!9Ew*fOV-*~+{Yd}Pod^R$nI z{3Ap6(8DzEeRRLDO4)1KNo(NLHq4BDP4v~f;KmwJep{#6HEy~VX3=N-1PG1MspAp? zvCDOg?#?4rzPgSQ;I9*b@0hxGny+&I+|&V0 z!+X=+B3Z;*wM$H}o=84`NnACjmr2mU%ia2J5wK&7;itSyssC5f4!pD0tLmd1sc|{f zk7XTy|4eU{Uq?VBM}Hy`_sgtxeaBb5W!zW&rf%+cgOCR^@Q*t$cLH`8oj*9`U867X z4J%@Z`vKndTm|r-GUT+V1mzqpnGCB#yD003^+KDhA>Qe}5UxafP$YgWS`j*LZki2r zHILlvz#W=%mhBV=@H}$+w|acz)^%SwWL4>mo1v3%^5ov_`^LKLR`(KL*US{BaoS_P z29BA`7I#>pt5e_d3`O*}bu`9Iv^n!=w3{nlv&lHjFDs>8oCorvkL)&!$3Rt2Kz}Qf z*4Y~lUC!<{kCmrCo1x0nQQKviRYD}0Z=$MC&GH#6zL(E