授予注册表权限

3

我允许NETWORK SERVICE访问一个注册表项,我需要通过一个控制台应用程序来访问该项,我是以NETWORK SERVICE身份运行的。以下是我创建该项并授权的方法。

Microsoft.Win32.RegistryKey key;
            key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey("SOFTWARE", RegistryKeyPermissionCheck.ReadWriteSubTree);
            RegistrySecurity rs = new RegistrySecurity();
            rs = key.GetAccessControl();
            rs.AddAccessRule(new RegistryAccessRule("NETWORK SERVICE", RegistryRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow));
            key.SetAccessControl(rs);
            key = key.CreateSubKey("RM", RegistryKeyPermissionCheck.ReadWriteSubTree);
            key = key.CreateSubKey("CSVExtraction", RegistryKeyPermissionCheck.ReadWriteSubTree);
            key.SetValue("Failure Tally", "0");

但是当我尝试使用以下代码将setValue设置到键上时,我会收到错误。我用于设置值的代码如下。

Microsoft.Win32.RegistryKey key;
            key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey("SOFTWARE", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree);
            key = key.CreateSubKey("RM", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree);
            key = key.CreateSubKey("CSVExtraction", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree);
key.SetValue("Failure Tally, "1");

但是我在这里遇到了一个错误,提示访问HKLM/LOCAL MACHINE/SOFTWARE被拒绝。虽然我已经使用上述代码添加了访问规则,但是当我手动检查访问权限时,发现访问权限已添加到WOW6432node。


主要是因为正在运行的应用程序所使用的登录用户不是管理员组的成员。 尝试以管理员身份运行该应用程序,然后再次尝试。 - Rohit Prakash
第一段代码作为管理员运行,即授权部分。我正在授予“NETWOR SERVICE”权限。但是,当我尝试使用第二段代码访问时,会抛出错误。 - Ajay Bhasy
1个回答

3
问题可以通过进行两个更改来解决: 1)在授予权限时 你的代码:rs.AddAccessRule(new RegistryAccessRule("NETWORK SERVICE", RegistryRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.InheritOnly, AccessControlType.Allow)); key.SetAccessControl(rs); 编辑它为:
rs.AddAccessRule(new RegistryAccessRule("NETWORK SERVICE", RegistryRights.FullControl, InheritanceFlags.ContainerInherit | InheritanceFlags.ObjectInherit, PropagationFlags.None, AccessControlType.Allow));
key.SetAccessControl(rs);

这是为了确保您授权的权限被继承到子树中。

2) 您不需要逐个打开密钥,而是可以通过编写以下内容来访问所需的密钥

string registryFolderStructure =@"SOFTWARE\RM\CSVExtraction";
key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(registryFolderStructure, Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接