C# 不允许请求的注册表访问2

C# 不允许请求的注册表访问2,c#,vb.net,windows-7,registry,access-denied,C#,Vb.net,Windows 7,Registry,Access Denied,我最近正在编写一个需要访问以下注册表项的应用程序: HKLM\SOFTWARE\Wow6432Node\Classes\CLSID 出于某种奇怪的原因,我不允许在我测试过的任何系统上访问此密钥。我正在使用管理权和介于两者之间的一切来尝试实现这一点。我搜索了前5个谷歌搜索结果页面,结果仍然是空的 注意事项: 1.我试图删除的键可能包含子键,也可能不包含子键,我已经彻底测试了DeleteSubKey和DeleteSubKeyTree。 2.我尝试了OpenSubKeyKey,True,false和T

我最近正在编写一个需要访问以下注册表项的应用程序:

HKLM\SOFTWARE\Wow6432Node\Classes\CLSID

出于某种奇怪的原因,我不允许在我测试过的任何系统上访问此密钥。我正在使用管理权和介于两者之间的一切来尝试实现这一点。我搜索了前5个谷歌搜索结果页面,结果仍然是空的

注意事项: 1.我试图删除的键可能包含子键,也可能不包含子键,我已经彻底测试了DeleteSubKey和DeleteSubKeyTree。 2.我尝试了OpenSubKeyKey,True,false和True值仍然不允许我访问。 3.我也不允许访问非64位位置HKLM\Software\Classes\CLSID。 4.我已经在XP、7和8上对此进行了测试。XP没有给我一个问题。 5.我收到的确切错误如下所示:

不允许请求的注册表访问。在 Microsoft.Win32.RegistryKey.OpenSubKeyString名称,布尔可写


请帮帮我这几天我都快死了。非常感谢您的帮助。

请先使用本地管理员帐户登录。然后运行regedit.exe并单击要编辑的注册表项。从编辑菜单中选择预任务。检查相关用户的权限


我猜相关帐户没有修改注册表项的权限。

在vb.net中,在对注册表项执行任何操作之前,您可以使用它来访问注册表项

x.GetAccessControl(System.Security.AccessControl.AccessControlSections.All)
其中x是任意寄存器。钥匙

在看过你的代码后,我尝试了这个方法,效果很好

  Dim r As Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\test", Microsoft.Win32.RegistryKeyPermissionCheck.ReadWriteSubTree)    
           r.DeleteSubKey("subkey", True)

您可能需要修改访问控制安全性。用于获取注册表项的ACL,对其进行修改,然后使用保存

这会将许多已连接设备的条目返回到COM端口。以及我们不需要访问的属性条目

下面我附上一个简单的代码来使用它

            string[] m_szModem;
            Microsoft.Win32.RegistryKey m_RegEntry = Microsoft.Win32.Registry.LocalMachine;
            m_RegEntry = m_RegEntry.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Class\{4D36E96D-E325-11CE-BFC1-08002BE10318}");
            //string 
            int i = 0;
            string[] m_szModemEntries = m_RegEntry.GetSubKeyNames();
            m_szModem = new string[m_szModemEntries.Length];
            string m_szModemPort = null;
            string m_szModemName = null;
            foreach (string m_szModemEntry in m_szModemEntries)
            {
                if (!IsNumber(m_szModemEntry))
                {
                }
                else
                {
                    m_RegEntry.Close();
                    m_RegEntry = Microsoft.Win32.Registry.LocalMachine;
                    string m_szKeyName = @"SYSTEM\CurrentControlSet\Control\Class\{4D36E96D-E325-11CE-BFC1-08002BE10318}\" + m_szModemEntry;
                    m_RegEntry = m_RegEntry.OpenSubKey(m_szKeyName);
                    m_szModemPort = m_RegEntry.GetValue("AttachedTo").ToString();
                    m_szModemName = m_RegEntry.GetValue("Model").ToString();
                    if (m_szModemName.Contains("<device name>"))
                    {
                        CommPort = m_szModemPort;
                        lbldevicename.Text = "Device connected!";
                        lbldevicename.ForeColor = Color.Green;
                        cmdProgram.Enabled = true;
                        DeviceConnected = true;
                        break;
                    }
                    CommPort = "";
                    cmdProgram.Enabled = false;
                    lbldevicename.Text = "Device not connected!";
                    lbldevicename.ForeColor = Color.Red;
                    DeviceConnected = false;
                }
            }

我发现了一个没有管理员权限的解决方案:只需省略“true”参数,它就会全部读取。为我工作

在Visual studio中添加app.manifest

添加项目,然后搜索应用程序清单文件

然后将其开头替换为此

<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
</requestedPrivileges>
</security>
</trustInfo>

这个问题和答案有相似的问题:嗨,请阅读我的帖子。你错了。我已经尝试了那篇文章中推荐的所有方法。你是否从你的代码中请求了注册表访问权限?很遗憾,是的。它似乎仍在抛出OpenSubKey函数的访问被拒绝。感谢您的回复。但是,我如何在远程机器上执行此操作?我正在将应用程序应用到一系列系统中。我测试的所有系统似乎都拒绝我。如果您可以在一台计算机上尝试此操作,您可以要求管理员更改相关配置。你有远程访问这些机器的mstsc吗?很遗憾,我无法控制这些系统。我正在为一家公司开发应用程序。有没有办法获得权限并通过.NET进行编辑?我不这么认为;但这似乎是一个配置问题;因此,最好与他们的系统管理员交谈,询问他们相关的访问权限是否已授予..有意义。。但是如果我连子键都打不开,我怎么能应用访问控制呢?这是我的代码:所以你看了我的代码,拿错了注册表项?显然,访问HKLM不是我的问题。Windows拒绝我在链接中提供的CLSID密钥。不过,我感谢您的帮助。我的注册表中没有Classes\CLSID\entry。我在其中创建了一个测试条目,它可以正常工作。该进程不具有此操作所需的“SeSecurityPrivilege”权限。解决方案太长,但可以理解。该进程不具有此操作所需的“SeSecurityPrivilege”权限。
public Boolean IsNumber(String s)
    {
        foreach (Char ch in s)
        {
            if (!Char.IsDigit(ch)) return false;
        }
        return true;
    }
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
</requestedPrivileges>
</security>
</trustInfo>