I built a fun new resource for managing registry settings. “DSC
already has a resource for managing the registry” you say? This one sets values
to user registry settings for all users.
KevMar_UserRegistry
DisableScreenSaver
{
ID =
"DisableScreenSaver"
Key = "HKEY_CURRENT_USER\Control Panel\Desktop"
ValueName
= "ScreenSaveActive"
ValueData
= "0"
}
How cool is that? The built in DSC registry resource can
only manage system settings. For servers this is all you really need. But if
you have to manage user settings for some reason, forget about it. You need to
use my resource to do it.
There are several limitations with my implementation to
understand before we dive into how it works.
First
is that this setting applies to all existing users and every new user once it
is set. So if you remove this setting from future configurations instead of
using the Ensure
= "Absent"
option, new users to the system will continue to get the setting.
The good news is that using Ensure = “Absent” does stop this from applying to
new users.
Second
is that this sets the value only once per user. This kind of breaks the idea of
DSC maintaining configuration drift. If this needs to get reapplied, there is a
version attribute that must be used and incremented. Each user keeps track of
what version of the setting they have applied. Increasing the version signals
the user that something has changed and it needs to be set again. This is
important if you are changing the ValueData to something different.
Third these registry settings are only applied at user
logon. I am using a method that hooks into the user logon process to apply the
registry settings. I do not flag a reboot to DSC. I considered it but if you
are starting to manage user settings, there can be a huge number of these in
your configurations. Requiring a reboot for each one feels like a bit much. In
my use case, I did not want the reboot. This is why making it as Absent can
stop if from applying to any more users.
I’ll do a write up about how I did this in a future post. I
used a Windows feature that is not very well known to most systems admins. I
have it posted over at https://github.com/kmarquette/Powershell/tree/master/DSCModules/KevMar/DSCResources
if you want to check it out.