private ApplyResourceChangeResult <RegistryKeyResource> DoCreate(
            ApplyResourceChangeInput <RegistryKeyResource> input)
        {
            var newRes = input.PlannedState;
            var pState = StateHelper.Deserialize <PrivateState>(input.PlannedPrivate)
                         ?? new PrivateState();

            _log.LogInformation($"Creating registry key at [{newRes.Root}][{newRes.Path}]");
            RegistryKey root   = RegUtil.ParseRootKey(newRes.Root);
            RegistryKey newKey = root.OpenSubKey(newRes.Path, true);

            if (newKey == null)
            {
                _log.LogInformation("Existing key does not exist, creating");
                newKey = root.CreateSubKey(newRes.Path, true);
                pState.RegistryKeyCreated = true;
            }

            using (var regKey = newKey)
            {
                ApplyValueDiffs(regKey, toAdd: newRes.Entries);
            }

            return(new ApplyResourceChangeResult <RegistryKeyResource>
            {
                NewState = input.PlannedState,
                Private = StateHelper.Serialize(pState),
            });
        }
Esempio n. 2
0
        public ReadDataSourceResult <RegistryKeyDataSource> Read(
            ReadDataSourceInput <RegistryKeyDataSource> input)
        {
            var result = new ReadDataSourceResult <RegistryKeyDataSource>();

            var root = RegUtil.ParseRootKey(input.Config.Root);

            if (root == null)
            {
                result.Error("invalid root, must be one of:  "
                             + string.Join(" | ", RegUtil.AllRootAliases));
            }
            else
            {
                using (var regKey = root.OpenSubKey(input.Config.Path))
                {
                    result.State = new RegistryKeyDataSource
                    {
                        Root       = input.Config.Root,
                        Path       = input.Config.Path,
                        KeyNames   = regKey.GetSubKeyNames(),
                        ValueNames = regKey.GetValueNames(),
                        Entries    = new Dictionary <string, Registry.ComputedRegValue>(),
                    };
                    foreach (var n in result.State.ValueNames)
                    {
                        var val    = regKey.GetValue(n);
                        var typ    = regKey.GetValueKind(n);
                        var regVal = new ComputedRegValue {
                            Type = RegUtil.ToString(typ)
                        };
                        switch (typ)
                        {
                        case RegistryValueKind.MultiString:
                            regVal.Values = (string[])regKey.GetValue(n);
                            break;

                        case RegistryValueKind.Binary:
                            regVal.ValueBase64 = Convert.ToBase64String((byte[])regKey.GetValue(n)
                                                                        ?? new byte[0]);
                            break;

                        default:
                            regVal.Value = regKey.GetValue(n)?.ToString();
                            break;
                        }

                        result.State.Entries.Add(n, regVal);
                    }
                }
            }

            return(result);
        }
        private ApplyResourceChangeResult <RegistryKeyResource> DoDelete(
            ApplyResourceChangeInput <RegistryKeyResource> input)
        {
            var oldRes = input.PriorState;
            var pState = StateHelper.Deserialize <PrivateState>(input.PlannedPrivate);

            _log.LogInformation($"Deleting registry key at [{oldRes.Root}][{oldRes.Path}]");
            RegistryKey root   = RegUtil.ParseRootKey(oldRes.Root);
            RegistryKey oldKey = root.OpenSubKey(oldRes.Path, true);

            if (oldKey != null)
            {
                string delKey = null;
                using (var regKey = oldKey)
                {
                    ApplyValueDiffs(regKey, toDel: oldRes.Entries);

                    var subKeysLen = oldKey.GetSubKeyNames()?.Length ?? 0;
                    var valuesLen  = oldKey.GetValueNames()?.Length ?? 0;
                    var forceDel   = oldRes.ForceOnDelete ?? false;

                    if (!(pState?.RegistryKeyCreated ?? false))
                    {
                        _log.LogWarning("registry key was not created by us");
                    }
                    if (subKeysLen > 0)
                    {
                        _log.LogWarning($"registry key still has [{subKeysLen}] subkey(s)");
                    }
                    if (valuesLen > 0)
                    {
                        _log.LogWarning($"registry key still has [{valuesLen}] value(s)");
                    }

                    if (!(pState?.RegistryKeyCreated ?? false) || subKeysLen > 0 || valuesLen > 0)
                    {
                        if (forceDel)
                        {
                            _log.LogWarning("forced delete specified");
                            delKey = oldKey.Name;
                        }
                        else
                        {
                            _log.LogWarning("reg key was not created by us or is not empty, SKIPPING delete");
                        }
                    }
                    else
                    {
                        delKey = oldKey.Name;
                    }
                }

                if (delKey != null)
                {
                    var openParent = RegUtil.OpenParentWithName(delKey, true);
                    if (openParent == null)
                    {
                        _log.LogWarning($"Cannot delete Registry Key [{delKey}], malformed path");
                    }
                    else
                    {
                        var(delRoot, parent, name) = openParent.Value;
                        _log.LogInformation($"Deleting Registry Key [{name}] under [{(parent??delRoot).Name}] ({delRoot.Name})");
                        using (var regKey = parent)
                        {
                            regKey.DeleteSubKeyTree(name, false);
                        }
                    }
                }
            }
            else
            {
                _log.LogInformation("Could not open existing, prior reg key, skipping");
            }

            return(new ApplyResourceChangeResult <RegistryKeyResource>
            {
                NewState = input.PlannedState,
                Private = null,
            });
        }