diff --git a/Registry/Set-RegistryValueForAllUsers.ps1 b/Registry/Set-RegistryValueForAllUsers.ps1 index 8ff2661..8a7cbb4 100644 --- a/Registry/Set-RegistryValueForAllUsers.ps1 +++ b/Registry/Set-RegistryValueForAllUsers.ps1 @@ -3,40 +3,43 @@ function Set-RegistryValueForAllUsers { .SYNOPSIS This function uses Active Setup to create a "seeder" key which creates or modifies a user-based registry value for all users on a computer. If the key path doesn't exist to the value, it will automatically create the key and add the value. - - Thanks to Ben Reader (@powers_hell) for improving upon this. .EXAMPLE - PS> Set-RegistryValueForAllUsers -RegistryInstance @{'Name' = 'Setting'; 'Type' = 'String'; 'Value' = 'someval'; 'Path' = 'SOFTWARE\Microsoft\Windows\Something'} + PS> Set-RegistryValueForAllUsers -RegistryInstance @{'Name' = 'Setting'; 'Type' = 'String'; 'Value' = 'someval'; 'Path' = 'SOFTWARE\Microsoft\Windows\Something'} + This example would modify the string registry value 'Type' in the path 'SOFTWARE\Microsoft\Windows\Something' to 'someval' for every user registry hive. .PARAMETER RegistryInstance - A hash table containing key names of 'Name' designating the registry value name, 'Type' to designate the type + A hash table containing key names of 'Name' designating the registry value name, 'Type' to designate the type of registry value which can be 'String,Binary,Dword,ExpandString or MultiString', 'Value' which is the value itself of the registry value and 'Path' designating the parent registry key the registry value is in. + .PARAMETER Version + You must increment the version every time you make a change. #> [CmdletBinding()] param ( [Parameter(Mandatory = $true)] - [hashtable[]]$RegistryInstance + [hashtable[]]$RegistryInstance, + + [Parameter(Mandatory)] + [ValidateNotNullOrEmpty()] + [int]$Version ) try { New-PSDrive -Name HKU -PSProvider Registry -Root Registry::HKEY_USERS | Out-Null - + ## Change the registry values for the currently logged on user. Each logged on user SID is under HKEY_USERS - $LoggedOnSids = $(Get-ChildItem HKU: | Where-Object { $_.Name -match 'S-\d-\d+-(\d+-){1,14}\d+$' } | foreach-object { $_.Name }) + $LoggedOnSids = (Get-ChildItem HKU: | Where-Object { $_.Name -match 'S-\d-\d+-(\d+-){1,14}\d+'}).PSChildName Write-Verbose "Found $($LoggedOnSids.Count) logged on user SIDs" foreach ($sid in $LoggedOnSids) { Write-Verbose -Message "Loading the user registry hive for the logged on SID $sid" foreach ($instance in $RegistryInstance) { ## Create the key path if it doesn't exist - if (!(Test-Path "HKU:\$sid\$($instance.Path)")) { - New-Item -Path "HKU:\$sid\$($instance.Path | Split-Path -Parent)" -Name ($instance.Path | Split-Path -Leaf) -Force | Out-Null - } + New-Item -Path "HKU:\$sid\$($instance.Path | Split-Path -Parent)" -Name ($instance.Path | Split-Path -Leaf) -Force | Out-Null ## Create (or modify) the value specified in the param Set-ItemProperty -Path "HKU:\$sid\$($instance.Path)" -Name $instance.Name -Value $instance.Value -Type $instance.Type -Force } } - + ## Create the Active Setup registry key so that the reg add cmd will get ran for each user ## logging into the machine. ## http://www.itninja.com/blog/view/an-active-setup-primer @@ -49,7 +52,7 @@ function Set-RegistryValueForAllUsers { New-Item -Path $ActiveSetupRegParentPath -Name $Guid -Force | Out-Null $ActiveSetupRegPath = "HKLM:\Software\Microsoft\Active Setup\Installed Components\$Guid" Write-Verbose "Using registry path '$ActiveSetupRegPath'" - + ## Convert the registry value type to one that reg.exe can understand. This will be the ## type of value that's created for the value we want to set for all users switch ($instance.Type) { @@ -72,17 +75,16 @@ function Set-RegistryValueForAllUsers { throw "Registry type '$($instance.Type)' not recognized" } } - + ## Build the registry value to use for Active Setup which is the command to create the registry value in all user hives - $ActiveSetupValue = "reg add `"{0}`" /v {1} /t {2} /d {3} /f" -f "HKCU\$($instance.Path)", $instance.Name, $RegValueType, $instance.Value + $ActiveSetupValue = 'reg add {0} /v {1} /t {2} /d {3} /f' -f "HKCU\$($instance.Path)".Trim('\'), $instance.Name, $RegValueType, $instance.Value Write-Verbose -Message "Active setup value is '$ActiveSetupValue'" ## Create the necessary Active Setup registry values Set-ItemProperty -Path $ActiveSetupRegPath -Name '(Default)' -Value 'Active Setup Test' -Force - Set-ItemProperty -Path $ActiveSetupRegPath -Name 'Version' -Value '1' -Force + Set-ItemProperty -Path $ActiveSetupRegPath -Name 'Version' -Value $Version -Force Set-ItemProperty -Path $ActiveSetupRegPath -Name 'StubPath' -Value $ActiveSetupValue -Force } - } - catch { + } catch { Write-Warning -Message $_.Exception.Message } }