请求的注册表访问不被允许#2
本文关键字:注册表 访问 请求 | 更新日期: 2023-09-27 17:54:51
我最近一直在编写一个需要访问以下注册表项的应用程序:
HKLM ' SOFTWARE ' Wow6432Node '类' CLSID
由于一些奇怪的原因,我不允许在我测试过的任何系统上访问这个键。我正在使用管理权限和两者之间的所有权限来尝试完成此任务。我已经搜索了前5个谷歌结果页面,但仍然是空的。
注意事项:
1. 我试图删除的键可能包含也可能不包含子键,我已经彻底测试了"DeleteSubKey"answers"DeleteSubKeyTree"。
2. 我试过OpenSubKey("Key",True), false和True值仍然不允许我访问。
3.我也不允许访问非64位位置(HKLM'Software'Classes'CLSID)。
4. 我在XP、7 &8. XP没有给我一个问题
5. 我收到的确切错误可以在下面找到:
请求的注册表访问不被允许。在Microsoft.Win32.RegistryKey。OpenSubKey(String name, Boolean可写)
请帮帮我,这几天我都被折磨死了。如有任何帮助,不胜感激。
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();
返回许多项连接到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;
}
}
//and IsNumber Function
public Boolean IsNumber(String s)
{
foreach (Char ch in s)
{
if (!Char.IsDigit(ch)) return false;
}
return true;
}
您可能需要修改访问控制安全性。使用GetAccessControl获取注册表项的ACL,修改它,然后使用SetAccessControl保存它。
这是我发现的一个没有Admin权限的解决方案:只需省略'true'参数,它将读取所有内容。对我有用!
首次使用本地管理员帐户登录。然后运行regedit.exe并单击要编辑的注册表项。从Edit菜单中选择前提。检查相关用户的权限。
我猜相关帐号没有权限修改注册表项
在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)
在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>