访问注册表子项获取USB设备连接时间遇安全异常求解决
问题描述
在控制台应用中,我需要获取USB设备的最后连接时间与最后断开时间信息,需访问注册表路径Computer\HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB\下每个项的properties\{83da6326-97a6-4088-9453-a1923f573b29}子项。尝试以下代码后抛出Security Exception:
RegistryKey reg = Registry.LocalMachine; RegistryKey subKey=reg.OpenSubKey(@"SYSTEM\ControlSet001\Enum\USB\ROOT_HUB30\4&2ae8b031&0&0\Properties");
解决方法
以管理员权限运行程序
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum属于系统敏感注册表路径,普通用户默认无读取权限。可右键控制台应用程序选择「以管理员身份运行」,或通过配置应用清单让程序默认请求管理员权限:
在项目中添加app.manifest文件,修改<requestedExecutionLevel>节点为:<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />手动配置注册表项权限
若管理员权限仍无法访问,可手动修改目标注册表项的权限:- 打开注册表编辑器(
regedit.exe),定位到HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB; - 右键该项选择「权限」,添加当前用户或Users组,赋予「读取」权限。
- 打开注册表编辑器(
指定注册表访问权限重载方法
调用OpenSubKey时明确指定读取权限,示例代码:using Microsoft.Win32; RegistryKey reg = Registry.LocalMachine; try { RegistryKey subKey = reg.OpenSubKey( @"SYSTEM\ControlSet001\Enum\USB\ROOT_HUB30\4&2ae8b031&0&0\Properties", RegistryKeyPermissionCheck.ReadSubTree, RegistryRights.ReadKey ); if (subKey != null) { // 执行读取时间属性的逻辑 subKey.Close(); } } catch (SecurityException ex) { Console.WriteLine($"权限错误:{ex.Message}"); }优先访问当前生效控制集
ControlSet001是系统备份控制集,当前生效的控制集通常为CurrentControlSet,建议将路径改为@"SYSTEM\CurrentControlSet\Enum\USB\...",避免访问非活跃配置项。
内容的提问来源于stack exchange,提问作者Antonio Argentieri
相关产品推荐
相关产品推荐

