RegSec := RegistrySecurity('HKLM\SOFTWARE\....');
RegSec.ProtectedDAcl := false;
This may be related to the new "Integrity Level" security feature introduced in Vista. Every object and process now has one of four Integrity Levels - System, High, Medium and Low.
Most user Processes have a Medium Integrity Level though some have a High integrity Level (When you "Run As Administrator").
The short story is that in order to change anything about an object (such as a file or registry key) the process or user that does so must have an Integrity Level the same or higher than the object itself as well as also having the necessary read or write permissions that it would have needed under XP.
A Medium Level Process cannot change a High Level Object. Only A High Level or System Level Process can do that.
So you need to find out the Integrity level of the key you are trying to change. The integrity level exists as a new type of Access Control Entry in the objects ACL.